본문 바로가기
공부/java

자바(java)의 싱글톤 패턴

by 샤샤샤샤 2023. 1. 23.

싱글톤 만들기

싱글톤은 프로그램 안에 유일한 객체를 말한다.

마치 nft코인처럼, 클래스로 만든 객체가 단 하나만 존재하는 객체인 것이다.

만드는 법은 다음과 같다.

class UniqueOne{
    int no = 1;
    private static UniqueOnesingleton= new UniqueOne();
    static UniqueOne getInstance(){
        returnsingleton;
    }
}

이는 하나의 공식과도 같다.

일단 명령어 하나하나 살펴보자. 

싱글톤 클래스의 no속성에 10을 부여했다.

그리고 클래스 안에서, 자기 클래스를 객체화 했다. 이때 private 예약어를 써서 캡슐화, 즉, 쉽게 접근 할수 없게 만드는 은닉화를 했고, 이어서  static 예약어를 통해 고정된 메모리 주소값에 저장했다.

getInstance는 일단 지금은 싱글톤을 가져오는 함수라고만 이해하자.

즉, 싱글톤은 단 하나의 메모리 주소값만을 사용함으로, 객체별로 서로 영향을 안주는 다른 클래스와는 달리, 하나의 반 영구적인 데이터처럼 사용 가능하다.

 

//싱글톤 만들기
//싱글톤(Singleton) : 프로그램 안의 유일한 객체를 의미함.
// 클래스는 new를 통해서 여러 객체를 반복적으로 찍어 낼 수 있다.
// 하지만, 중요한 데이타를 유지/저장할 수 없다.
// 붕어빵1, 붕어빵2, 붕어빵3 객체에서 어디에 데이타를 저장하고, 가져올 것인가?
// 그래서 프로그램안에서 유일한 객체 - "절대붕어빵" 한개만 만든다!
// 그리고 그 안에 중요한 정보를 저장한다.
class FishBun { //일반 붕어빵 : 일반 객체
    int bunNo = 10;
}
class UniqueFishBun{ //절대 붕어빵 : 싱글톤
    int bunNo = 20;
    private static UniqueFishBunsingleton= new UniqueFishBun();
    static UniqueFishBun getInstance(){
        returnsingleton;
    }
}

public class ex77 {
    public static void main(String[] args) {
        //일반 붕어빵
        FishBun bun1 = new FishBun();
        FishBun bun2 = new FishBun();
        FishBun bun3 = new FishBun();
        System.out.println( bun1 ); //0x3b07d329
        bun1.bunNo = 100;
        System.out.println( bun2 ); //0x41629346
        System.out.println( bun2.bunNo ); //10이 찍힌다.
        System.out.println( bun3 ); //0x404b9385
        //다이나믹하게 생성된 bun1,bun2,bun3는
        //생성과 소멸이 자유롭게 이루어진다. 힙(Heap) 영역 메모리사용.
        //생성 : new할때
        //소멸 : 블록(영역) 벗어날때, 또는 null값을 줄때
        //    : GC(Garbage Collector)가 자동으로 처리해줌.
        bun1 = null;

        //절대 붕어빵 : 싱글톤 사용
        //getInstance()함수를 통해 가져옴.
        UniqueFishBun uBun1 = UniqueFishBun.getInstance();
        UniqueFishBun uBun2 = UniqueFishBun.getInstance();
        UniqueFishBun uBun3 = UniqueFishBun.getInstance();
        System.out.println( uBun1 );//0x682a0b20
        System.out.println( uBun2 );//0x682a0b20
        System.out.println( uBun3 );//0x682a0b20
        uBun1.bunNo = 200;
        System.out.println( uBun2.bunNo );//200으로 찍힘.
    }
}