특정 클래스가 단 하나만의 인스턴스를 생성하여 사용하기 위한 패턴
특징
- 생성자가 여러번 호출돼도 실제로 생성되는 객체는 하나만 존재하도록 보장
- 애플리케이션에서 동일한 인스턴스에 접근 가능
- 객체를 필요할 때마다 생성하는 것이 아닌 단 한 번만 생성해서 전역에서 공유하고 사용 가능 (불필요한 자원 생성 방지, 메모리 절약)
- 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체 리턴
예제
- Doorman 클래스에 싱글턴 인스턴스 생성
- main(App 클래스의 main)에서 싱글턴에 접근하여 호출
- 여러 번 호출한 객체들이 같은지 해쉬코드 호출로 확인
package ch04;
// 추상 클래스 => 상속 가능
public abstract class Animal {
public abstract String getName();
}
package ch04;
// 고양이 Object
// Animal 상속
public class Cat extends Animal {
private String name = "고양이";
// 부모와의 동일 메소드 오버라이드
public String getName() {
return name;
}
}
package ch04;
// 쥐 Object
// Animal 상속
public class Mouse extends Animal {
private String name = "쥐";
// 부모와의 동일 메소드 오버라이드
public String getName() {
return name;
}
}
package ch04;
public class Doorman {
// 싱글턴 => App 클래스에서 접근 가능 (전역에서 공유하고 사용 가능)
// static을 붙이면 프로그램 실행전에 메모리에 띄워짐(로드됨)
// => 기본 생성자를 private로 접근 불가능하게 막아놨기때문에 여기에 접근하라고
static Doorman instance = new Doorman();
// 기본 생성자
// private로 접근불가능하게 막음
private Doorman() {}
// 이 클래스의 책임
public void 쫓아내(Animal animal) {
System.out.println(animal.getName() + " 쫓아내");
}
}
package ch04;
public class App {
public static void main(String[] args) {
// 싱글턴
// 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체 리턴
// => 이 경우, 호출된 Doorman 두 개가 같다는 뜻
Doorman doorman = Doorman.instance;
Doorman doorman1 = Doorman.instance;
// 두 객체가 같은지 확인 용 해쉬코드 출력
// 싱글턴은 여러번 호출돼도 생성되는 객체는 하나라서 둘이 같음
// hashcode : 단방향 암호화(이메일 난수), 충돌(중복)확률이 낮음
System.out.println(doorman.hashCode());
System.out.println(doorman1.hashCode());
Cat cat = new Cat();
Mouse mouse = new Mouse();
doorman.쫓아내(cat);
doorman.쫓아내(mouse);
}
}Share article