본문 바로가기
개발/Design Pattern

01.SingleTon Pattern

by pastry 2014. 12. 13.

각 프로그래밍 언어마다 사용법의 차이는 있겠으나 일반적으로 페턴을 쓰는 목적과 기능하는 방식은 같으므로 요즘에 쓰는 자바를 기준으로 정리해 볼까 한다.

 

그럼 싱글톤 페턴이 뭔지 개념적인 내용을 알아보도록 하자.

 

싱글톤 페턴은 객체가 하나만 존재해야 할때 사용하게되는 페턴이다. 이 객체가 하나만 존재한다는 이야기는 Class를 작성해서, 혹은 이미 존재하는 Class에서, 객체화(instance화) 할때 heap영역에 메모리가 올라가게 되는데 heap에 해당 클레스의 인스턴스는 유일무이하게 존재시키려는 방법이다. 전에 유니티로 러닝게임을 만들었을때 게임 데이타를 관리하는 class는 하나만 존재해야 했는데(DB를 연동하지 않았기 때문에 모든 값이 저장되는 곳은 그 하나의 클레스 내부 collection 형태로 작성했었다) 그때 사용했었던 페턴이 SingleTon이였다. 그때는 사용 목적과 페턴의 특징을 잘 파악하지 못한 상태에서 활용했는데 이번에 모의인사관리 프로그램을 작성하면서 DB를 접근하는 class를 다른 클래스에서 사용할 필요가 있었다. static으로 만들면 되는건 대충 알것 같은데 어떤식으로 해야 할까? DB를 사용해야되는 모든 클레스에 변수로 DB관리 class를 넣어주는 일은 비효율적이고 어떻게 봐도 바람직하지 않은 방법이다. 이럴때 싱글톤 페턴을 사용하면 좋다.

 

사용법에대한 기본적인 개요는

 

1.생성자를 private로 만들어서 임의로 객체 생성을 하지 못하게 한다.

2.패턴이 적용되는 class내 변수 선언부에서 자기 자신을 생성하고 객체화 시켜 메모리에 값을 넣어두게 만든다.

이때, 변수의 접근자는 provate로 해놔야 하는데, 그렇게 하지 않으면 외부에서 직접 접근으로 저장되어 있는 값을 변경할 여지가 있기 때문이다.

3.이제 싱글톤이 적용된 클레스의 인스턴스를 받을 수 있는 메소드를 생성하면 된다. 이때 값을 넘겨주는 메소드는 static으로 작성해서 어디서든 접근이 가능하게 static영역으로 올라가게 만든다.

 

 

가장 간단한 싱글톤 페턴 적용법이다. 객체지향의 다른 언어에서도 1,2,3의 과정을 거쳐 페턴을 적용할 수 있을것이다.

다만 이 방식은 클레스가 load될때 변수를 생성하면서 자동으로 자기자신의 변수도 생성하게 됨으로 getInstance()의 사용시점 이전부터 인스턴스가 생성이 되어있기때문에 (관점에 따라 사실 별 의미가 없을수도 있지만) 사용이전에 메모리 낭비가 있다고 볼 수 있다. 이게 신경쓰인다면 이런식으로 구현해보자.

 

 

변수에서 자기 자신의 객체 변수를 빼고 클래스 내부에 static 클래스를 두어 getInstance()를 호출할때 내부의 static클래스에 접근하게 만든다. 이때 내부 클래스에 변수가 선언이 되면서 getInstance()호출시점에서 메모리에 올라가게 된다. class가 메모리에 올라가는 시점에 변수와 메소드도 같이 올라가게 되므로  getInstance()로 static 클래스 내부의 변수에 접근할때  생성하는것이다. 그런데 내가 지금 class가 메모리에 올라갈때 class 내부 변수와 메소드가 메모리에 올라간다고 했는데 그럼 위의 코드의 InnerClass도 SingleTon클래스 안에 있으니까 SingleTon클래스가 메모리에 올라갈때 같이 올라가는거 아닐까? 라는 의문을 갖을 수 있지만 메모리 생성은 new로 해야하기때문에 잘못된 생각.(은 내가 하고 따로 코드를 짜서 확인해봤다. 나같은 생각이 든 분들이 있을수도 있으니.. 아래에 코드를 남겨두니 한번 실행해보고 결과값을 보고 확인해 보길 바란다.)

 

public class InnerClassTest {
 static class Inner{
  Inner(){
   System.out.println("inner class is just created!");
  }
  static String str="string for checking.";
 }
 public static void main(String[] args){
  System.out.println("hello world!");
  System.out.println(Inner.str);
  Inner inner = new Inner();
 }
}

 

패턴을 찾아보면서 왜 이런식으로 구현을 해야하는지를 찾아보게 되는데 그때마다 정말 어설프게 알고있구나를 깊게 느낀다. 모두 모래성으로 지식을 쌓지 않길 바라면서 이렇게 singleTon에 대한 설명을 마친다.

 

 

 

 

 

'개발 > Design Pattern' 카테고리의 다른 글

자바 디자인 패턴 잘 정리되어있는곳  (2) 2014.11.27

댓글