작성
·
584
1
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
여기에 질문 내용을 남겨주세요.이전 강의를 들었는데도 이해가 잘 안돼 질문을 남깁니다
위의 코드에서 싱글톤을 구현했다는 부분이 잘 이해가 되지 않습니다.
저는
MemberRepository 클래스 안에
private static final MemberRepository instance = new MemberRepository();
라고 선언을 한 뒤에
다른 클래스에서
MemberRepository memberRepository = MemberRepository.getInstance();
라고 사용을 한다면
memberRepository 변수와
instance 변수는 "같은 객체를 참조"하기 때문에 싱글톤이 된다.
라고 이해했습니다.
이때, 이해가 안되는 부분이
public class MemberRepository {
private static Map<Long,Member> store = new HashMap<>();
private static Long sequence=0L;
//싱글톤 구현을 위해 instance를 사용
private static final MemberRepository instance = new MemberRepository();
//getInstance는 MemberRepository를 조회하는 함수.
//
public static MemberRepository getInstance(){
return instance;
}
//싱글톤으로 만들 땐, 아무나 생성하지 못하도록 생성자를 private로 설정해서 막아줘야 한다.
private MemberRepository(){
}
라고 작성한 부분이 어떤 원리로 싱글톤을 보장하게 되는건가요?
설명 부탁드립니다
항상 친절한 답변 감사합니다.
답변 2
1
안녕하세요. blackhole1234님, 공식 서포터즈 코즈위버입니다. AI 답변에 더하여 답변 드립니다.
생성자의 접근제어자가 private 이기에 이 객체는 외부에서 생성할 수 없습니다. (new 연산자로 인스턴스를 얻을 수 없음)
이용할 수 있는 건 static 으로 선언한 그리고 접근제어자가 public 인 getInstance() 메서드밖에 없지요. 가령 MemberRepository.getInstance(); 와 같은 방법으로 밖에 사용할 수 없습니다. 그래서 싱글톤을 보장한다고 하는 것입니다 :)
감사합니다.
0
안녕하세요, 인프런 AI 인턴이에요.
MemberRepository 클래스에서 private static final MemberRepository instance = new MemberRepository();라고 선언하고, getInstance() 메소드를 통해 싱글톤 객체를 사용한다는 부분에 대한 질문이시군요.
이 코드는 전형적인 싱글톤 패턴의 구현 방식 중 하나입니다. 싱글톤 패턴은 어떤 클래스의 인스턴스가 오직 하나만 생성되어 사용되도록 하는 디자인 패턴입니다.
MemberRepository 클래스의 instance 변수는 private static final로 선언되어 있습니다. 이는 해당 변수가 클래스 내부에서만 접근 가능하고, 클래스 수준에서 한 번만 할당되어 다른 곳에서 변경할 수 없음을 의미합니다. 또한, static으로 선언되어 클래스가 로드될 때 한 번만 초기화되며, final로 선언되어 변경할 수 없습니다.
getInstance() 메소드는 외부에서 MemberRepository 객체를 얻을 수 있는 정적 메소드입니다. 이 메소드에서는 instance 변수에 접근하여 객체를 얻는데, 객체가 이미 생성되어 있다면 그대로 반환하고, 생성되어 있지 않다면 새로운 객체를 생성하여 반환합니다.
따라서 코드에서 MemberRepository.getInstance()를 호출하면 싱글톤 객체를 사용할 수 있게 됩니다.
이렇게 싱글톤 패턴을 구현함으로써, 여러 곳에서 동시에 객체를 생성하거나 여러 개의 인스턴스를 사용하는 일을 방지할 수 있습니다.
더 자세한 내용이나 싱글톤 패턴의 장단점에 대해서는 인터넷에서 찾아보시면 더 많은 정보를 얻을 수 있을 거예요.
요청하신 답변이 도움이 되었는지 확인 부탁드리겠습니다. 더 궁금한 점이 있다면 언제든지 물어보세요. 좋은 하루 되세요!