안녕하세요, 스코리아입니다.
오늘은 자바 static을 활용하여 싱글톤 패턴을 구현해 보겠습니다.
싱글톤 패턴은 자바 스프링의 핵심 기능 중 하나로도 등장하는데요, 싱글톤 패턴은 자바의 다양한 프레임워크에서 사용되고 있는 매우 중요한 개념입니다.
싱글톤 패턴 (singleton pattern)이란?
- 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
- 예를 들면 DB 커넥션의 경우 http 호출이 올 때마다 1개씩 생성되는 것은 비효율적이므로, 커넥션이 단 한 개만 생성된 상태로 해당 인스턴스를 공유해야 합니다.
- 싱글톤 패턴은 static 변수, 메소드를 활용하여 구현할 수 있습니다.
싱글톤 패턴 구현해 보기
School.java 파일을 만들고, 딱 1개의 인스턴스만 생성될 수 있도록 만들고 그 인스턴스를 가져올 수 있도록 하는 메소드를 만들어봅시다.
public class School {
private static School instance = new School(); // 인스턴스 만들기 (최초 1회)
private School() {} // 생성자 - 외부 호출 막기
public static School getInstance() { // 인스턴스 가져오기
if(instance == null) {
instance = new School();
}
return instance;
}
}
- new School()을 통해 인스턴스를 최초 생성하였고, 이 인스턴스를 static로 선언하여 프로그램이 메모리에 로딩되는 시점에 메모리를 할당합니다. (static에 대한 자세한 내용 참고하기: https://skorea6.tistory.com/12 )
- 싱글톤 패턴을 지키려면, 인스턴스가 1개만 유지될 수 있도록 해야 하므로, 외부에서 기본 생성자로 호출하지 못하도록 기본 생성자를 private로 막아두었습니다.
- getInstance() 메소드를 public으로 설정하여, 해당 메소드를 통해서만 인스턴스를 가져올 수 있도록 하였습니다. 메소드를 static으로 설정하여, 클래스이름으로 직접 참조가 가능하게끔 만들었습니다.
싱글톤 패턴 사용해 보기
public class SchoolTest {
public static void main(String[] args) {
School school1 = School.getInstance();
School school2 = School.getInstance();
System.out.println(school1 == school2); // true
}
}
- School 클래스에서 getInstance() 메소드를 static으로 선언하였으므로, 클래스이름인 School로 직접 참조가 가능합니다. (School.getInstance() 사용)
- 싱글톤 패턴은 단 1개의 인스턴스만 유지될 수 있도록 하는 게 핵심입니다.
- 예제를 보면, new 키워드를 이용하여 School 인스턴스를 별도로 생성하지 않고, getInstance() 메소드를 통해 이미 만들어진 인스턴스를 가져오기만 하였습니다.
- 출력되는 값은 true입니다. school1과 school2가 동일한 인스턴스로, school1의 인스턴스 메모리 주소와 school2의 인스턴스 메모리 주소가 같기 때문입니다.
- 정리하자면, 싱글톤의 구조는 위 그림과 같습니다.
- 한 개의 인스턴스를 private static로 선언한 뒤, getInstance() 메소드를 통해서만 이미 만들어진 인스턴스를 호출하는 방식입니다.
지금까지 자바(Java) 싱글톤 패턴의 의미(뜻)와 구현하고 사용하는 방법에 대해서 알아보았습니다.
읽어주셔서, 감사합니다.
'JAVA > 객체지향' 카테고리의 다른 글
자바 자동타입변환(업케스팅 형변환) 의미, 사용 방법 (2) | 2023.08.29 |
---|---|
자바 객체 간의 상속(extend) 의미, 구현방법 (2) | 2023.08.25 |
자바 static 변수 뜻, 의미, 사용방법 그리고 유효범위 (3) | 2023.08.17 |
자바 this / this() 뜻, 의미, 사용방법에 대해서 (1) | 2023.08.15 |
자바 접근 제어 지시자와 정보은닉을 활용한 캡슐화 (객체지향) (0) | 2023.08.14 |