리틀 싱글톤
객체를 어떻게 생성 합니까 ?
- new MyObject();
다른 객체에서 MyObject를 만들고 싶어한다면 어떻게 해야 하죠? MyObject에 대해서 new 연산자를 다시 쓸 수 있나요?
- 물론 가능하죠.
클래스만 있으면 언제든지 인스턴스를 만들 수 있는 거죠?
- 예, public 으로 선언된 거라면 별 문제 없습니다.
만약 public 으로 선언되지 않았으면요?
- 만약 public 클래스로 선언하지 않은 클래스라면 같은 패키지 안에 있는 클래스에서만 인스턴스를 만들 수 있습니다.하지만 같은 패키지에 속한 클래스에서는 여전히 인스턴스를 두 개 이상 만들 수 있죠.
흠.. 흥미롭군요.. 이렇게 할수있는건 혹시 아나요 ?
public MyClass{
private MyClass() {}
}
- 아, 그런 건 한 번도 생각해보지 못했습니다. 하지만 문법적으로는 전혀 문제가 없는 것 같네요.
저 코드에 대해서 설명해 보겠습니까?
- 생성자가 private으로 선언되어 있기 때문에 인스턴스를 만들 수 없는 클래스 같군요.
private으로 생성된 생성자를 사용할 수 있는 객체가 과연 존재할까요?
- 흠... MyClass에 있는 코드에서만 호출할 수 있는 것 같은데, 그렇다면 절대 객체의 인스턴스를 만들 수 없는 것 아닌가요?
왜 안 되죠?
- 생성자를 호출하려면 일단 그 클래스의 인스턴스가 있어야 되는데, 다른 클래스에서 이 클래스에서 이 클래스의 인스턴스를 만들 수 없기 때문에 인스턴스를 만드는 것이 불가능합니다. 닭이 먼저냐 달걀이 먼저냐 하는 것과 같은 문제라고 볼 수 있습니다. MyClass형식의 객체에서만 private으로 선언된 생성자를 사용할 수 있고, 다른 어떤 클래스에서도 "new MyClass()"라고 할 수 없기 때문에 결국 인스턴스를 만들 수 없게 되는 거죠.
그래요. 그건 그렇고... 이건 어떻게 해석할 수 있을까요 ?
public MyClass{
public static MyClass getInstance() {}
}
- MyClass에 정적 메소드가 있습니다. 그 정적 메소드는 다음과 같은 식으로 호출할 수 있습니다. MyClass.getInstance();
왜 객체 이름을 사용하지 않고 MyClass라는 클래스 이름을 그냥 사용했죠?
- getInstance()는 정적 메소드입니다. 클래스 메소드라고 부르기도 하죠. 정적 메소드를 지칭할 때는 클래스 이름을 써야 합니다.
신기하군요. 그럼 이렇게 합쳐 놓으면 어떨까요? 그럼 MyClass의 인스턴스를 만들 수 있지 않나요?
public MyClass{
private MyClass() {}
public static MyClass getInstance(){
return new MyClass();
}
}
- 아, 그렇게 할 수도 있겠네요.
그러면 이제 객체 인스턴스를 만들 수 있는 방법을 알 수 있겠죠?
- MyClass.getInstance();
MyClass의 인스턴스가 하나만 만들어질 수 있도록 코드를 마무리해 볼 수 있겠습니까?
- 예, 할 수 있을 것 같아요.
★이 포스트가 유용하셨다면 javaiyagi블로그를 구독하세요
객체를 어떻게 생성 합니까 ?
- new MyObject();
다른 객체에서 MyObject를 만들고 싶어한다면 어떻게 해야 하죠? MyObject에 대해서 new 연산자를 다시 쓸 수 있나요?
- 물론 가능하죠.
클래스만 있으면 언제든지 인스턴스를 만들 수 있는 거죠?
- 예, public 으로 선언된 거라면 별 문제 없습니다.
만약 public 으로 선언되지 않았으면요?
- 만약 public 클래스로 선언하지 않은 클래스라면 같은 패키지 안에 있는 클래스에서만 인스턴스를 만들 수 있습니다.하지만 같은 패키지에 속한 클래스에서는 여전히 인스턴스를 두 개 이상 만들 수 있죠.
흠.. 흥미롭군요.. 이렇게 할수있는건 혹시 아나요 ?
public MyClass{
private MyClass() {}
}
- 아, 그런 건 한 번도 생각해보지 못했습니다. 하지만 문법적으로는 전혀 문제가 없는 것 같네요.
저 코드에 대해서 설명해 보겠습니까?
- 생성자가 private으로 선언되어 있기 때문에 인스턴스를 만들 수 없는 클래스 같군요.
private으로 생성된 생성자를 사용할 수 있는 객체가 과연 존재할까요?
- 흠... MyClass에 있는 코드에서만 호출할 수 있는 것 같은데, 그렇다면 절대 객체의 인스턴스를 만들 수 없는 것 아닌가요?
왜 안 되죠?
- 생성자를 호출하려면 일단 그 클래스의 인스턴스가 있어야 되는데, 다른 클래스에서 이 클래스에서 이 클래스의 인스턴스를 만들 수 없기 때문에 인스턴스를 만드는 것이 불가능합니다. 닭이 먼저냐 달걀이 먼저냐 하는 것과 같은 문제라고 볼 수 있습니다. MyClass형식의 객체에서만 private으로 선언된 생성자를 사용할 수 있고, 다른 어떤 클래스에서도 "new MyClass()"라고 할 수 없기 때문에 결국 인스턴스를 만들 수 없게 되는 거죠.
그래요. 그건 그렇고... 이건 어떻게 해석할 수 있을까요 ?
public MyClass{
public static MyClass getInstance() {}
}
- MyClass에 정적 메소드가 있습니다. 그 정적 메소드는 다음과 같은 식으로 호출할 수 있습니다. MyClass.getInstance();
왜 객체 이름을 사용하지 않고 MyClass라는 클래스 이름을 그냥 사용했죠?
- getInstance()는 정적 메소드입니다. 클래스 메소드라고 부르기도 하죠. 정적 메소드를 지칭할 때는 클래스 이름을 써야 합니다.
신기하군요. 그럼 이렇게 합쳐 놓으면 어떨까요? 그럼 MyClass의 인스턴스를 만들 수 있지 않나요?
public MyClass{
private MyClass() {}
public static MyClass getInstance(){
return new MyClass();
}
}
- 아, 그렇게 할 수도 있겠네요.
그러면 이제 객체 인스턴스를 만들 수 있는 방법을 알 수 있겠죠?
- MyClass.getInstance();
MyClass의 인스턴스가 하나만 만들어질 수 있도록 코드를 마무리해 볼 수 있겠습니까?
- 예, 할 수 있을 것 같아요.
★이 포스트가 유용하셨다면 javaiyagi블로그를 구독하세요