다잘하고싶어

싱글톤 이해하기 (with 인터페이스 사용 예제) 본문

이론학습/JAVA

싱글톤 이해하기 (with 인터페이스 사용 예제)

챙영잉 2023. 1. 25. 16:33

싱글톤 코드 구현 순서

(1) 기본생성자를 막아서 외부에서 만들 수 없게 한다

private StudentManager(){}

(2) 외부에서는 생성 못하니까 나라도 만들어서 내가 가지고 있어야 한다.

private StudentManager instance = new StudentManager();

(3) private 하게 만들었으니 외부에서 접근하려면 public 한 메서드가 하나 필요하겠다.

public StudentManager getInstance(){
return instance;
}

(4) but! 외부에서 사용할 때 인스턴스가 없어서 아직 사용할 수 없는 상황이므로 static을 붙여서 미리 메모리에 올려둬야겠다!

private StudentManager(){}

private StudentManager instance = new StudentManager();

public static StudentManager getInstance(){

   return instance;
}

(5) 그러나 이러면 instance 에 빨간줄 뜬다. 왜? instance 가 안만들어졌는데 관련된 메서드를 만들 수 없으므로! 그래서 기본생성자에도 static 붙여서 같이 올려둬야겠다.

private static StudentManager(){}

private StudentManager instance = new StudentManager();

public static StudentManager getInstance(){
return instance;
}

외부에서 한번만 호출할 수 있다. 한번 호출하면 여러번 호출해서 사용할 수는 없음!

 

(5-2) 아래와 같이 표현할 수도 있다. (5 또는 5-2 중 택 1)

private static StudentManager(){}

private StudentManager instance;

public static StudentManager getInstance(){
   if(instance == null){
		instance = new StudentManager(); 
	 }
	return instance;
}

static 을 왜 써야 할까?

  • 외부에서 불러서 쓸때의 문제점?
  • 인스턴스가 안만들어 졌는데 불러서 사용해야하는 상황이 된다!
  • 외부에서 getInstance() 사용하는데, 아직 안만들어진 상황이 된다. ⇒ static 붙여서 미리 메모리 상에 올려둬야 한다.

 

 


인터페이스 사용 예제 

설명 : 

(1) 영화( Movie ) 클래스를 관리하는 (2) 매니저인터페이스( IMovieManager ) , 매니저인터페이스를 구현하는 (3) 클래스( MovieManagerImpl ) 가 존재함. 

public class MovieManagerImpl implements IMovieManager{

 private static IMovieManager instance = new MovieManagerImpl();
    
    private MovieManagerImpl() {};
       
    public static IMovieManager getInstance() {
    	return instance;
    }
    
    ....
    //아래는 영화를 관리하는 메서드들이 있음
    ....
   
  }

▶  private static IMovieManager instance = new MovieManagerImpl();

     인터페이스는 객체를 생성할 수 없으므로, 그것을 구현한 클래스로 객체를 생성해준다

 

위에서 생성한 getInstance 를 사용해서 객체를 호출하고, MovieManagerImpl 클래스 안의 메소드들을 사용하려면?

 

 IMovieManager  → 매니저 클래스에서 리턴자료형을 IMovieManager 으로 설정해두었으므로 여기선 이렇게 사용했으나 , MovieManagerImpl 로 해도 상관없다! (어차피 인터페이스 이므로, 구현클래스로 알아서 찾아가서 사용함)

 

 MovieManagerImpl.getInstance( )    이미 싱글톤을 static 으로 선언해서 작성했으므로, 이미 getInstance 메소드는 메모리상에 클래스영역에 올라가있다.

따라서 클래스이름으로 메소드를 불러와서 사용이 가능하다.