인프런 커뮤니티 질문&답변

코딩먹는하마님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

싱글톤 패턴

static SingletonService getInstance() 질문입니다.

해결된 질문

작성

·

455

·

수정됨

0

다른 사람분 질문 답변중에

public class SingletonService {
 //1. static 영역에 객체를 딱 1개만 생성해둔다.
 private static final SingletonService instance = new SingletonService();
 //2. public으로 열어서 객체 인스터스가 필요하면 이 static 메서드를 통해서만 조회하도록
허용한다.
 public static SingletonService getInstance() {
 return instance;
 }
 //3. 생성자를 private으로 선언해서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다.
 private SingletonService() {
 }
 public void logic() {
 System.out.println("싱글톤 객체 로직 호출");
 }
}

이 코드의 static SingletonService getInstance()에 대한 글을 읽고 궁금한점이 생겨 질문드립니다.

안녕하세요, lsj59285 님! 공식 서포터즈 codesweaver 입니다.

우선 멤버변수 instance 가 private 접근 제어자 이기에 외부에서 이 멤버변수에 직접 접근할 수 없습니다.

게다가 생성자도 private 이기에 객체를 생성하여 사용할 수도 없지요.

instance에 접근할 수 있는 방법이 필요한데 그게 getInstance() 메서드 입니다.

인스턴스를 생성하지 않고 접근해야 하니 static 이어야 하고요.

 

그리고 getInstance() 에서 멤버변수 instance 에 접근하는데요 이 때,

static 영역에서 instance (힙 영역)을 참조할 수 없습니다.

static 은 프로그램에서 유일한 영역이고, 인스턴스는 N개로 늘어날 수 있습니다.

즉 1:N 관계를 갖습니다. 그래서 인스턴스가 static 영역을 참조할 순 있으나, static이 인스턴스를 참조할 순 없습니다. (어떤 인스턴스를 지칭하는지 알 수 없기 때문에)

그래서 instance 도 static 영역에 두어 getInstance() 메서드가 접근할 수 있도록 한 것입니다.

감사합니다.

 

getInstance()가 static 메서드라서 instance 도 static 영역에 두었다고 하셨는데 instance는 공유할 수 있도록 static 영역으로 먼저 보냈 게 아닌가요??...

getInstance()를 static영역으로 보낸건 생성자가 private니까 객체생성이 안되서 인스턴스 메서드를 사용을 못하니까 그런거 아닌가요??...

답변주시면 정말 감사하겠습니다.

 

 

답변 1

0

안녕하세요 박희재님.

이해하고 계신 부분이 맞습니다.

감사합니다.