public static void main(String[] args) {
SomeComponent sc1 = SomeComponent.getInstance(); // 첫번째 instance 호출시에만 instance가 호출되고, 그 후에는 항상 같은 인스턴스를 반환 ★★★
sc1.test();
SomeComponent sc2 = SomeComponent.getInstance();
sc2.test();
// Component클래스
// 네이버처럼 수십년동안 다양한 사람들이 하나의 거대한 .코드를 유지/보수 해야할 때
// =====================================
// 싱글톤
// System a = new System(); --> 이걸 쓰지 못한다는 이야기
// System 클래스의 생성자는 private으로 선언되어 있어 직접 인스턴스를 생성할 수 없음
// 따라서 위와 같이 new 연산자를 사용하여 System 클래스의 인스턴스를 생성하려고 하면 컴파일 오류가 발생!
// System 클래스는 정적 메서드와 필드로 구성되어 있으며, 인스턴스 생성 없이도 이를 사용할 수 있음 (앞의 static같은 느낌?)
}
// 싱글톤(디자인 패턴) : 어떤 클래스가 단 하나의 인스턴스만을 가지도록 보장하는 패턴
// --> 생성자를 private으로 만들어 외부에서 인스턴스 생성을 막음
// 오직 하나의 인스턴스만을 가짐
// --> 이 인스턴스는 애플리케이션 내에서 전역적으로 접근 가능하며, 여러 곳에서 생성되지 않음
class SomeComponent{
private static SomeComponent instance = new SomeComponent(); // 클래스의 생성과 동시에 선언됨
// 1) 클래스 내에서 유일한 인스턴스를 저장하기 위한 private 정적 변수를 선언
private SomeComponent(){ // 이 클래스는 이제 절대! new로 호출이 안된다.
// SomeComponent getInstance로만 호출 가능해짐
}
// 2) 생성자를 private으로 선언하여 외부에서 객체 생성을 막는다.
// 이렇게 하면 클래스 외부에서 new SomeComponenent()와 같이 직접 객체를 생성할 수 없다!!!
public static final SomeComponent getInstance() { // ★★★★ 호출방법 : 클래스명.getInstance
// if (instance == null) {
// instance = new SomeComponent(); // 90년대 방법. 요즘은 final
// }
return instance;
}
// 3) getInstance 메서드는 클래스의 유일한 인스턴스를 생성하거나
// 이미 생성된 인스턴스를 반환하는 역할을 함
// 이 메서드는 클래스 메서드로서, '클래스 이름을 통해 호출할 수 있다!!!'
// 일반적인 코드
private int v1;
public void test() {
System.out.println(v1);
}
}
'JAVA > DAY 13 _ 23.09.04' 카테고리의 다른 글
Star UML (0) | 2023.09.11 |
---|---|
Class review (0) | 2023.09.11 |
final (0) | 2023.09.04 |
static 2 (0) | 2023.09.04 |
method 오버로딩 & static변수 (0) | 2023.09.04 |