본문 바로가기
Development/JAVA

[자바]싱글턴 패턴(Singleton Pattern)과 콜백함수(Callback)(1)

by True Life 2016. 10. 29.


[자바]싱글턴 패턴(Singleton Pattern)과 콜백함수


자바 네트워크 프로그래밍시 TCP/UDP를 막론하고 Socket 객체는 필수적이다.

이 네트웤 프로그래밍시 단순한 상상만으로 안되는게 몇가지 있다.


여기서 이 소켓 객체를 관리하는 법

데이터를 주고 받는 법

프레임 내 컴포넌트들을 다루는 법


싱글턴 패턴


여기서 소켓 객체 관리는 싱글턴 패턴이라는 디자인 패턴을 이용한다. 디자인 패턴이란 문학에서 기승전결과 같다. 프로그래밍시 다루는 어떤 형식을 패턴으로 정리를 한 것이다. 하나의 기법이라고나 할까.


싱글턴 패턴은 이름과 같이 싱글, 하나의 객체를 다루는 것이다.

소켓은 매우 약한 존재다. 조금만 삐그덕 하면 Exception을 내세우고 죽어버린다.

특히 중복 소켓 선언시 하나는 반드시 죽을 것이다.

네트워크 프로그래밍에 있어 1:1 통신시 소켓은 반드시 하나이다.

이걸 싱글턴 패턴을 사용하지 않고 객체들의 소통에 의해 관리한다면..

(소켓을 사용할)모든 객체의 생성자에는 Socket parameter가 들어가야 한다.

물론 자바는 객체에 대해 call by reference이니 기껏해야 주소값 하나겠지만..

그거 하나하나 코딩도 귀찮을 뿐더러 readLine()등의 메소드가 스레드 충돌나지 않게 주의해야 한다.

그렇다. 멀티쓰레드가 안되는것이다. A는 이 내용을 원하는데 B에서 저 내용을 원했다? 그럼 망한다.


그래서 소켓을 전역으로 관리한다. 소켓을 위한 소켓 래퍼 클래스이다.


프로그래밍의 세계가 방대하듯이 하나의 패턴에도 해결해야할 다양한 오류들이 있다.

따라서 싱글턴 패턴의 종류에도 많은것이 있는데.. 세가지만 살펴보겠다.


먼저 가장 단순한 Eager Initialzation이다.

여기서는 기능적 측면이라기보다는 싱글턴 패턴이 뭔지에 대해서 살피기 바란다.



1. 먼저 private static으로 선언되어있는 instance는 클래스 로딩시 바로 생성된다.

2. static이기 때문에 단 하나로만 구성되어있으며 직접 호출할 수 없고 getInstance()를 통해서만 가져올 수 있다.

3. private 생성자에 의해 또 다른 객체를 생성하는건 불가능하다.


따라서 "하나뿐인" 객체인 것이다.


getInstance도 static이기 때문에 EagerInitialization.getInstance() 이따위로 불러올 수 있다.


그런데 '클래스 로딩시'란 프로그램 시작시 하는 동작이므로 사용하지 않아도 초기에 실행된다.

그래서 단순한 Lazy Initialization이 있다.





앞에서 말했듯이 사용하지 않으면 할당/생성할 필요가 없다는 점을 보완, 필요할때만 객체를 생성하는 것이다.

굳이 설명하지 않는다.


마지막으로 initialization on demand holder idiom다.



이것의 장점은 Thread safe이다.

물론 앞서 말했던 패턴에서 getInstance()에 synchronized하면 되겠지만 비용이 많다.

이렇게 하면 클래스 로딩 시점 메커니즘(자바 jvm 메커니즘상 알아서 구현되어 있겠지 뭐^^;)을 활용하여 thread safe할 수 있따고 한다. [사실 필자도 정확하게 잘 모르겠다. 나중에 필요할때 알게 되겠지? 하하]


콜백함수


두번째로 프레임 내 컴포넌트들을 다루는법에 대해 보자

생각을 해보자. 한 객체(여기서는 싱글턴패턴 객체겠지)에서 다른 객체의 컴포넌트를 다룬다?

그러려면 그 한 객체(소켓래퍼클래스)에 JFrame등의 레퍼런스할 수 있는 값을 넘겨줘야겠지.

그러면 그 소켓에서 수십개의 객체를 전부 다루냐? 개에바다.


그래서 사용할 수 있는게 콜백함수다.


알지 모르겠지만 callback 함수 구현 자체도 하나의 디자인 패턴이다! ㅎㅎ

 - 그래서 다음 포스팅에서 계속하겠다ㅎ