본문 바로가기
교육, 학습/멀티캠퍼스_풀 스택

JAVA 문법 - 싱글톤 패턴만들기(static과 private)

by 개발하는 경제학도 2022. 1. 14.

강의 소개

현재 수강하고 있는 멀티캠퍼스 k-digital 지능형 웹서비스 풀 스택 과정을 수강하며 적은 내용입니다.

교재로는 자바의 정석을 사용하고 있습니다.


 

싱글톤(Singleton)

 

싱글톤은 디자인 패턴 중의 하나로, 여러 번 생성자를 호출해도 단 한 개의 인스턴스만 만들도록 강제하는 것이다. 

메모리에 불필요한 인스턴스들이 생성되어 메모리가 낭비되는 것을 막아주고, 외부에서 동일 인스턴스를 계속 공유해서 사용할 수 있게 해 준다.

 

구현 코드

class Singleton {

	static private Singleton me = new Singleton(); // 2번.
	
    private Singleton() {   // 1번. 
		System.out.println("Singleton 생성자 호출");
	}
	
    static Singleton getInstance() {  // 3번.
		return me;
	}
}

1번 코드부터 3번 코드로 싱글톤을 순차적으로 이해할 수 있다.

 

우선, 1번 코드에서 생성자에 private을 붙여 다른 클래스에서 new 연산자로 생성자를 호출하지 못하도록 제한하였다.

private은 내부 클래스에서만 접근할 수 있는 제어자이기 때문에 내부 클래스에서만 인스턴스를 생성할 수 있게 한다.

 

2번 코드에서는 내부 클래스에서만 호출할 수 있는 1번의 생성자를 호출한 코드이다.

이로써 1개의 인스턴스가 생성되었고, 생성된 인스턴스에 static을 붙임으로써 run을 할 때 가장 먼저 메모리에 할당되어 공유될 수 있게 된다. 또한, private을 붙여 필드를 외부에서 변경할 수 없게 했다.

 

마지막 코드 3번이다. getInstance메서드는 앞서 생성된 1개의 인스턴스를 리턴해준다.

getInstance메서드에서는 static을 붙여두었는데, 앞선 코드에서 외부에서 이 클래스의 생성자를 호출하지 못하게 하여, 인스턴스를 생성하지 못하게 했다. 생성자 호출이 불가하기에 getInstance메서드를 외부에서 사용하기 위해서 static을 붙이는 것이다.

 

외부에서 인스턴스를 받을 수 있는 방법은 오로지 이렇게 getInstance메서드를 호출하는 방법뿐이다.

 

// 외부 클래스에서 getInstance메서드를 호출

public class SingletonTest {

	public static void main(String[] args) {
//		Singleton s1 = new Singleton();  // private 이라서 호출 불가
		
		// "Singleton 생성자 호출" 출력이 1번만 된다.
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();

		if (s1 == s2 ) {
			System.out.println("s1 주소:" + s1 + "와 s2의 주소:" + s2);
			System.out.println("같은 인스턴스입니다.");
		  }
		// s1, 2는 모두 같은 인스턴스이다.(= 동일한 인스턴스를 참조한다. 주소도 같다.)
        }
}

 

코드와 같이 외부에서 몇 번이고 getInstance메서드를 호출해도 같은 인스턴스를 보여줄 것이다. 그리고 당연히 같은 인스턴스이기에 그 인스턴스의 주소도 모두 같다.

 

출처: 자바의 정석(남궁 성 저), 멀티캠퍼스

참고자료: 이것이 자바다(신용권 저)

댓글