본문 바로가기

STUDY/# java design pattern

[Design Pattern] 자바 싱글톤 패턴 (JAVA Singleton Pattern) by commin

반응형

[Design Pattern]

자바 싱글톤 패턴 (JAVA Singleton Pattern) 

by commin

 

안녕하세요 commin 입니다.

새해가 밝고 제나이도 한살 더 먹어 이렇게 인사를 드리게되었습니다. 

매번 블로그를 다시 시작할때마다 앞으로는 정말 열심히 하겠다.

 다짐하는 글을 써놓고 다시 들어오지않는 그런 불상사를 여러번 반복 하다보니,

 이제 앞으로 어떻게 블로깅을 열심히하겠다는 말을 쓰는 것보다 그냥 쓴다고해놓고

 안쓴 부분부터 빨리 쓰는게 좋을 것 같다는 생각이 들어 

이렇게 Singleton Pattern 강좌를 가지고 오게되었습니다.

 

이 글을 보시는 분들에게 새해 복 많이 받으시라는 말을 전하면서 그냥 바로 강좌를 쓰도록하겠습니다 ㅎ

이거쓴다고해놓은게 보니까 1년 전이더군요 ㅎㅎ 자, 각설하고 바로 예제부터 시작하겠습니다.

 

 

 

 

일단, 준비해야 할 클래스들을 클래스 다이어그램으로 표시해보았습니다.

Main 클래스는 테스트를 하기위해 main 메서드를 포함한 클래스입니다.

Normal 클래스는 생성자만 존재하는 클래스입니다. 싱글톤패턴을 사용하는 이유를 설명하기 위해 만들었습니다.

Singleton 클래스는 생성자와 getInstance() 라는 메서드를 포함한 클래스입니다. 여기서 중요한점은 생성자가

private로 지정되어있다는 점입니다. 좀더 밑에 자세히 설명하도록할게요. 그럼 Normal 클래스부터 만들어보겠습니다.

 


 

 

Normal.class

 

1
2
3
4
5
6
7
package singleton_pattern;
 
public class Normal {
    public Normal() {
        System.out.println("Normal Instance Created..");
    }
}
 

 

 


 

정말 간촐하고 성의없게 만들었습니다. 괜찮습니다. 

저는 new 연산자로 인스턴스를 만드는것과 싱글톤패턴을 이용하여 인스턴스를 만드는것의 차이를 보고싶은거니깐요.

자, 다음으로 Singleton 클래스를 만들어보겠습니다.


Singleton.class

1
2
3
4
5
6
7
8
9
10
11
package singleton_pattern;
 
public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton() {
        System.out.println("Singleton Instance Created..");
    }
    public static Singleton getInstance() {
        return singleton;
    }
}
 

Singleton 클래스를 만들 때 눈여겨봐야 할 부분은 바로 생성자 부분입니다.

대부분 생성자를 만들 때 public으로 선언하는데, 지금 싱글톤패턴에서는 private로 선언합니다. 왜그럴까요?

이렇게 private 로 생성자를 만들어놓으면 new 연산자에 제약이 생깁니다.

만약 new 연산자로 객체를 만들려고 시도를 하면 eclipse에서는 위 메시지를 이유로 빨간줄 처리하고 컴파일이 되지못하게 막습니다.

Singleton이라는 클래스 객체를 만드는 방법중 new 연산자를 사용하지 못하게 강제하는 것이 

private 생성자라는 점, 기억하시길 바랍니다.

new 연산자로 객체를 생성하지못하는 클래스가 되어버린 Singleton 클래스는

private static Singleton singleton = new Singleton();

이부분에서 정적으로 싱글톤 클래스의 객체를 선언했습니다. 

private 로 생성된 생성자는 자기자신에서는 호출할수있다는 점은 당연히 알고계시죠?

이렇게 생성해 놓은 싱글톤 클래스의 객체를 getInstance 메서드를 통해서 반환하는데요.

이렇게 함으로써 Singleton 객체를 단 한번만 생성해 놓고 다른 클래스에서 반환을 요구할 때 항상 같은 녀석을 

반환시켜 줄 수 있답니다.

 


Main.class

1
2
3
4
5
6
7
8
9
public class Main {
    public static void main(String[] args) {
        Normal normal1 = new Normal();
        Normal normal2 = new Normal();
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
    }
}
cs

 

자, 이제 테스트를 해 봅시다. main 메서드에서 위처럼 코딩하고 돌려보면.

Normal Instance Created..
Normal Instance Created..
Singleton Instance Created..

위처럼 콘솔에 찍히게 됩니다. 무슨 의미일까요?

Normal Instance는 new 연산자로 생성했기때문에 두번이나 Created 가 되었고

그에 반해 Singleton Instance는 Singleton 클래스를 처음 호출 할 때, 딱 한번 created되고 그 뒤에는

만들어지지 않았다는것을 의미하게됩니다.

좀더 정확하게 이해하기 위해 소스를 수정해보죠.

 


Main.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {
    public static void main(String[] args) {
        Normal normal1 = new Normal();
        Normal normal2 = new Normal();
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        
        if(normal1 == normal2) {
            System.out.println("normal1과 normal2는 서로 같습니다.");
        }else {
            System.out.println("normal1과 normal2는 서로 다릅니다.");
        }
        
        if(singleton1 == singleton2) {
            System.out.println("singleton1과 singleton2는 서로 같습니다.");
        }else {
            System.out.println("singleton1과 singleton2는 서로 다릅니다.");
        }
    }
}
cs

결과가 어떻게 나올지, 지금까지 잘 보셨다면 바로 알 수 있겠죠?

Normal Instance Created..
Normal Instance Created..
Singleton Instance Created..
normal1과 normal2는 서로 다릅니다.
singleton1과 singleton2는 서로 같습니다. 

자, 이렇게 싱글톤패턴을 사용하여 만든 객체는 언제나 서로 같다는것을 보증해줍니다.

싱글톤 패턴을 사용하는 이유는 무엇일까요?

  • 고정된 메모리 영역을 사용하도록 단 한번 new 연산자로 인스턴스를 얻어오기때문에 메모리의 낭비를 줄입니다.
  • 전역변수로 선언되고 전역메서드로 호출 하기 때문에 다른 클래스에서 사용하기 쉽습니다.
  • 공통된 객체를 사용해야하는 코딩에서 매번 객체를 생성하지않고 같은 객체를 사용하도록 하면 성능면에서 훌륭해 진답니다.

 

자, 오늘은 정말 오랜만에 자바 강좌를 해봤는데요. 

디자인패턴은 정말 많이 있으니까 이 디자인패턴을 완벽하게 모두 포스팅하는 그날까지 화이팅 해볼게요 !

 

반응형