싱글톤 패턴(Singleton Pattern)

hamsang·2022년 5월 24일
0

Java

목록 보기
11/36

싱글톤 패턴에 대해 공부해보았습니다. 이번 포스팅에서는 그 내용을 쉽고 간결하게 정리해보도록 하겠습니다.


🤩 싱글톤이 뭐야?

singleton의 사전적 정의는 '단독 개체' 입니다.

싱글톤 패턴이란 프로그램 시작과 종료까지 클래스의 인스턴스를 최초 한 번만 생성하여 사용하는 패턴을 말합니다. (Static과 함께 사용됩니다!)


🙄 사용하는 이유??

프로그램 전역에서 자주 사용되고 일관된 동작을 하는 인스턴스라면 싱글톤 패턴으로 구현하는 것이 훨씬 효율적이기 때문이다. 코드의 중복을 제거하는 것이 프로그램의 덕목이듯... 같은 동작을 반복하기 위해 계속 메모리를 할당하고 해제하는 것은 비효율적이다!

이미 생성해둔 인스턴스를 사용하는 싱글톤 패턴은 이런 문제를 해결해준다.

또한 싱글톤 패턴은 단 하나의 인스턴스만을 생성하기 때문에, 인스턴스가 절대적으로 한개만 존재하는 것을 보증하고 싶을 경우 사용합니다.


😎 그래서 싱글톤이 어디가 좋은데?

첫째, 고정된 메모리 영역을 얻으면서 단 한 번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있습니다!

둘째, 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들과 데이터를 공유하기 쉽습니다.

셋째, 두 번째 이용시부터는 객체 로딩 시간이 현저하게 줄어 성능이 좋아집니다.


😋 Java로 싱글톤 패턴 구현해보기!

회사의 직원들을 객체 지향 프로그램으로 구현해보겠습니다.

직원은 여러 명이겠지만 회사는 하나이다. 이런 경우에 직원 인스턴스는 여러 개를 생성하고 회사 객체는 하나만 생성하게 됩니다.


💻 본격 싱글톤 패턴으로 Company Class 구현하기


🤭 단계 1: 생성자를 private으로 만든다.

싱글톤 패턴에서는 생성자를 반드시 명시적으로 만들고접근 제어자를 private으로 지정해야 합니다. 그래야 컴파일러가 디폴트 생성자를 만들지 않기 때문이죠!

  • 디폴트 생성자는 항상 public이기 때문에 외부 클래스에서 인스턴스를 여러 개 생성할 수 있습니다. 싱글톤 패턴의 의도를 저해하는 요소가 되겠죠?

이렇게 생성된 Company 클래스는 클래스 내부에서만 이 클래스의 생성을 제어할 수 있습니다. 외부에서는 인스턴스를 생성할 수 없는 상태이기도 합니다.

package singleton;

public class Company {
	private Company() {} //접근 제어자를 private으로
}

🤭 단계 2: 클래스 내부에 static으로 유일한 인스턴스 생성하기

이제 준비는 끝났습니다! 우리가 프로그램에서 사용할 인스턴스 하나가 필요합니다.
생성해보겠습니다!

package singleton;

public class Company {
	private static Company instance = new Company( ); //유일하게 생성한 인스턴스
    private Company () {}
}

private으로 객체를 생성했습니다. 외부에서 이 인스턴스에 접근하지 못하도록 제한해 오류를 방지합니다.


🤭 단계 3: 외부에서 참조할 수 있는 public 메서드 만들기

이제 private으로 선언한 유일한 인스턴스를 외부에서도 사용할 수 있도록 설정해야 합니다.
이를 위해 public 메서드를 생성해주겠습니다.

package singleton;

public class Company {
	...
    //인스턴스를 외부에서 참조할 수 있도록 public get() 메서드 구현
    public static Company getInstance () {
		if (instance==null) {
        	instance = new Company();
        }
    return instance; //유일하게 생성한 인스턴스 반환
    }
}

이 메서드는 유일하게 생성한 인스턴스를 반환합니다. 이때 인스턴스를 반환하는 메서드는 반드시 static으로 선언합니다. getInstance() 메서드는 인스턴스 생성과 상관없이 호출할 수 있어야 하기 때문이죠


🤭 단계 4: 실제로 사용하는 코드를 만들어보자!

유일한 인스턴스를 대입한 두 변수의 주소 값이 같은지 비교해 확인해보겠습니다.
싱글톤 패턴이 잘 사용되었다면 두 변수가 하나의 값을 공유하기 때문에 true가 출력될 것입니다!


package singleton;

public class CompanyTest {
	public static void main (String[] args) {
    
	Company myCompany1 = Company.getInstance();
    Company myCompany2 = Company.getInstance();
    
    //두 변수가 같은 주소인지 확인
    System.out.println(myCompany1 == myCompany2);
    
    }
}

true 가 출력됩니다.

같은 참조 값을 가지는 동일한 인스턴스임을 알 수 있습니다. 열 번, 백 번을 호출해도 항상 같은 주소의 인스턴스가 반환될 것입니다.

또 Company 클래스는 내부에 생성된 유일한 인스턴스 외에는 더 이상 인스턴스를 생성할 수 없습니다!


이와 같이 static을 사용하여 유일한 객체를 생성하는 싱글톤 패턴을 구현해보았습니다!

profile
햄생

0개의 댓글

관련 채용 정보