Java/Java 이론

[JAVA] singleton 패턴

2주녘 2023. 8. 3. 12:43
반응형
싱글톤 패턴

애플리케이션 전체에서 단 한 개의 객체만 생성해서 사용하고 싶다면 싱글톤 패턴을 적용할 수 있다.

싱글톤 패턴의 핵심은 생성자를 private 접근 제한해서 외부에서 new 연산자로 생성자를 호출할 수 없게 막는 것이다.

 

다음은 싱글톤 패턴의 전체 코드를 보여준다.

 

public class Singleton {

 

// private 접근 권한을 갖는 정적 필드 선언과 초기화

private static Singleton singleton = new Singleton();  ------------------------------------- (1)

 

// private 접근 권한을 갖는 생성자 선언

private Singleton() {

 

}

 

// public 접근 권한을 갖는 정적 메소드 선언

public static Singleton getInstance () {   -------------------------------------------------------(2)

return singleton;

}

 

}

(1)에서는 자신의 타입으로 정적 필드를 선언하고 미리 객체를 생성해서 초기화시킨다. 그리고 private 접근 제한자를 붙여 외부에서 정적 필드 값을 변경하지 못하도록 막는다.

(2)에서는 정적 필드값을 리턴하는 getInstrance() 정적 메소드를 public으로 선언하였다.

외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 것이다. getInstance() 메소드가 리턴하는 객체는

정적필드가 참조하는 참조하는 싱글톤 객체이다.

따라서 아래 코드에서 변수 1(obj1)과 변수 2(obj2)가 참조하는 객체는 동일한 객체가 된다.

Singleton obj1 = Singleton.getInstance();

Singleton obj2 = Singleton.getInstance();

obj1 과 obj2 는 싱글톤 객체를 참조한다

// 같은 주소값을 갖는지 확인

System.out.println(obj1);

System.out.println(obj2);

ex_06.Singleton@6f2b958e

ex_06.Singleton@6f2b958e

==== 같은 주소값임을 확인

[예제]

public class Company {

 

// 싱글톤 패턴으로 설계하는 방법

// heap 메모리에 오직 객체가 하나만 존재해야 될 경우 사용가능하다.

 

// 1. 생성자는 private으로 선언해야한다.

private Company() {}

 

// 2. 클래스 내부에 유일한 private 인스턴스를 객체를 생성

private static Company instance = new Company(); // 선언과 동시에 초기화

 

// 3. 외부에서 유일한 instance 변수에 접근할 수 있는 메서드를 제공해야한다.

public static Company getInstance() {

if(instance == null) {

instance = new Company();

}

return instance;

}

 

} // end of class

public class CompanyMainTest {

 

public static void main(String[] args) {

// 1.

// 생성자를 private로 선언했기 때문에

// 기본 생성자로 호출할 수 없다.

// Company company = new Company();

 

// 2.

// Company.instance -> 접근 제어 지시자가 private 이다.

 

// 3.

// 외부에서 유일하게 Company 객체 주소값에 접근할 수 있는 메서드

Company naver = Company.getInstance();

Company tenco = Company.getInstance();

System.out.println(naver);

System.out.println(tenco);

Company mata = Company.getInstance();

System.out.println(mata);

 

} // end of main

 

} // end of class

 

반응형