-
Java | Singleton Pattern 싱글톤 패턴JAVA/JAVA 2020. 2. 11. 17:19
Singleton Pattern 싱글톤 패턴
객체 지향 프로그램에서 인스턴스를 단 하나만 생성하는 디자인 패턴
- 객체를 하나만 생성한 뒤 공유해서 사용
- 웹에서 자주 사용되는 기법
동시접속을 효율적으로 처리할 수 있음 - 메모리 절약 목적
Design Pattern 디자인 패턴
객체 지향 프로그램을 어떻게 구현해야
좀 더 유연하고 재활용성이 높은 프로그램으로 만들 수 있는지를 정리한 내용- 프로그램 특성에 따른 설계 유형을 이론화한 것
- 특정 알고리즘이나 프로그래밍 언어를 위한 라이브러리가 아니라
객체 지향적으로 설계하는 방법을 설명한 것
싱글톤 패턴 작성법 with 예제
단계 ①_생성자에 private 부여
컴파일러가 기본 생성자를 만들지 못하게 하고
외부 클래스에서 임의로 해당 클래스의 인스턴스를 생성하지 못하도록 함package j200211; public class SingTest { // 생성자에 private 부여 private SingTest() { } }
단계 ②_클래스 내부에 static으로 유일한 인스턴스 생성
프로그램 내에서 사용할 인스턴스가 하나는 필요하기 때문에
클래스 내부에서 인스턴스 생성 후 외부에서 접근하지 못하도록
pivate 접근 제어자 부여package j200211; public class SingTest { // 유일한 인스턴스 생성, 공유를 위해 static으로 지정 private static SingTest st = new SingTest(); private SingTest() { } }
단계 ③_외부에서 참조할 수 있는 public 메소드 작성
private으로 설정된 유일한 인스턴스를
외부에서도 사용할 수 있도록 public 메소드 작성외부 클래스에서 해당 클래스의 인스턴스를 생성할 수 없기 때문에
인스턴스 반환 메소드는 반드시 static으로 선언해야 함package j200211; public class SingTest { private static SingTest instance = new SingTest(); private SingTest() { } // 외부에서 인스턴스를 참조할 수 있도록 getInstance() 메소드 작성 public static SingTest getInstance() { // synchronized: 객체 참조시 작업이 중복되지 않도록 함 synchronized (SingTest.class) { // instance가 없다면 instance 변수에 객체 생성 if (instance == null) { instance = new SingTest(); } // instance 정적 멤버 변수 반환 → 외부 참조 가능 return instance; } } }
단계 ④_실제 사용 코드 작성
package j200211; public class Test { public static void main(String[] args) { // 객체 생성, SingTest 클래스의 인스턴스를 반환 받음 SingTest st1 = SingTest.getInstance(); SingTest st2 = SingTest.getInstance(); // 동일한 인스턴스인지 비교 if (st1 == st2) { System.out.println("st1 주소: " + st1); System.out.println("st2 주소: " + st2); System.out.println("같은 인스턴스 입니다."); } /* st1 주소: j200211.SingTest@15db9742 st2 주소: j200211.SingTest@15db9742 같은 인스턴스 입니다. */ } }
디자인 패턴 중 하나인 싱글톤 패턴에 대해 알아보았습니다.
싱글톤 패턴은 객체를 하나만 생성한 뒤 그것을 공유해서 사용하도록 하는 설계 방식을 의미합니다.
메모리 절약과 동시 접속 처리에 자주 쓰이는 패턴이라고 하니 알아둘 필요가 있겠습니다.
또한 디자인 패턴의 경우 객체 지향 프로그래밍 언어라면 대동소이하게 참조할 수 있기 때문에
다른 객체 지향 언어를 배울 때에도 도움이 될 수 있을 것입니다.
'JAVA > JAVA' 카테고리의 다른 글
Java | Network (2) ServerSoket & Socket (0) 2020.02.11 Java | Network (1) InetAddress & URL (0) 2020.02.11 Java | I/O RandomAccessFile (0) 2020.02.11 Java | Thread (3) Synchronization 동기화 (1) 2020.02.11 Java | Thread (2) Thread 생성 & Multi Thread (0) 2020.02.10