전체 프로그램에서 단 하나의 객체로만 만드는 경우가 있는데 이 때의 객체를 싱글톤이라 한다. 가끔 이와 같이 프로그램에서 단 하나의 객체만 만들도록 보장해야 되는 경우가 생긴다.
생성자를 외부에서 호출 할 수 없게 하려면 접근을 제한하면 된다. 이 때 사용되는 것이 접근 제한자 private
이다. 생성자 앞에 private
를 붙여주면 된다. 정적 필드도 외부에서 필드값을 변경하면 안되므로 private
를 붙여준다.
public class Singleton {
//정적 필드
private static Singleton singleton = new Signleton();
//생성자
private Singleton() {}
//정적 메소드
static Singleton getInstance() {
return singleton;
}
}
getInstance() 메소드
위의 코드를 보면 다음과 같은 코드가 보인다.
static Singleton getInstance() {
return singleton;
}
getInstance()
메소드는 싱글톤에서 유일하게 외부에서 객체를 얻는 방법이다.
- getInstance()는 내부적으로 생성되지 않았다면 생성한다.
- 기존에 생성된 값이 존재하면 생성된 인스턴스를 리턴하는 형태로 반환한다.
- 따라서 여러 변수들은 싱글톤에서 동일한 객체를 참조하게 된다.
//변수1과 변수2는 동일한 객체를 참조하게 된다.
클래스 변수1 = 클래스.getInstance();
클래스 변수2 = 클래스.getInstance();
다음 예제 코드를 참고해보자.Singleton.java
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() { }
static Singleton getInstance() {
return singleton;
}
}
Main.java
public class Main {
public static void main(String[] args) {
/* 다음과 같이 하면 에러가 발생한다.
Singleton obj1 = new Singleton();
Singleton obj2 = new Singleton();
*/
//외부 객체에서 값을 받아올때는 getInstance() 메소드를 사용한다.
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
if(obj1 == obj2){
System.out.println("두 오브젝트는 같은 객체입니다.");
}
else{
System.out.println("두 오브젝트는 다른 객체입니다.");
}
}
}
컴파일 결과
두 오브젝트는 같은 객체입니다.
'Java' 카테고리의 다른 글
[JAVA] 패키지(package), import문 (0) | 2021.05.06 |
---|---|
[JAVA]final 키워드와 상수(static final)의 이해 (0) | 2021.05.06 |
[JAVA]정적 멤버와 static, 정적 블록 (0) | 2021.05.05 |
[JAVA]JVM이 사용하는 메모리 영역(Runtime Data Area) (0) | 2021.05.05 |
[Java] JVM에 대한 이해와 설치 (0) | 2021.05.05 |