해결된 질문
작성
·
459
·
수정됨
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니까 객체생성이 안되서 인스턴스 메서드를 사용을 못하니까 그런거 아닌가요??...
답변주시면 정말 감사하겠습니다.