반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 받은 트랙백

글 보관함

[JAVA] getInstance() 와 관련해서....

2014. 3. 10. 22:42 | Posted by 솔웅


우리 팀에서 관리하는 어플리케이션 중에 Oracle에서 Teradata로 데이터 migration 하는 작업을 도와주는 어플리케이션이 있습니다. 데이터를 옮기는 건 아니고 옮긴 후 두 데이터를 비교해 주는 어플리케이션 인데요.

사용자들이 두 데이터를 비교할 때 데이터를 trim 한 후에 비교해 달라고 하는 요청이 들어왔습니다.

제가 관리하는 어플리케이션은 아니지만 담당자가 어떻게 처리하나 유심히 봤거든요.

담당자는 singleton을 이용하더라구요.

해당 값들을 갖고 있는 custom 객체가 Singleton 패턴으로 선언 됐더라구요.

저는 custom 객체 선언 부분은 안 보고 로직 있는 부분에서만 찾으려고 하다가 헤맸는데 인도에 있는 담당자는 깔끔하게 처리했더라구요.

오늘 한가지 배웠습니다. ^^

customobject test = customobject.getInstance(value.toString().trim());

해당 object 에 getInstance 메소드가 있으면 Singleton 방식으로 객체를 관리 하는 것이고 안의 value를 관리하고 싶으면 이 getInstance를 사용해서 관리하면 됩니다.

하나 배운김에 Singleton 클래스에 대해 확실하게 배우고 가려고 누군가가 올려 놓은 tutorial 하나 보고 갑니다.



Java - How to use Singleton Class ?

Singleton은 객체 생성을 control 하기 위한 목적으로 사용됩니다. 객체의 갯수를 오직 하나로 제한하죠. 한개의 Singleton instance가 있으면 Singleton의 instance 필드들은 한개의 클래스에 한번만 발생하게 됩니다. static 필드와 비슷하죠. Singleton은 종종 데이터베이스 커넥션이나 socket 연결 등에 사용 됩니다.


예를 들어 데이터베이스에 한개의 connection만 가능할 때 JDBC로 multithreading을 하다 보면 문제가 발생할 수 있습니다. 이 Singleton은 한번에 한개의 connection혹은 한개의 thread 만 만들어 지도록 관리를 할 수 있습니다.



Implementing Singletons:

Example 1:


제일 쉽게 구현하는 방법은 private 생성자와 필드를 만들어서 result를 hold 하는 방법입니다. 그리고 static accessor method 를 getInstance() 같은 이름으로 만들어서 사용합니다.

private field는 static initializer block안에서 할당 될 수 있습니다. getInstance() 메소드는 반드시 public이어야 하고 여기서 해당 instance를 return 합니다.


// File Name: Singleton.java
public class Singleton {

   private static Singleton singleton = new Singleton( );
   
   /* A private Constructor prevents any other 
    * class from instantiating.
    */
   private Singleton(){ }
   
   /* Static 'instance' method */
   public static Singleton getInstance( ) {
      return singleton;
   }
   /* Other methods protected by singleton-ness */
   protected static void demoMethod( ) {
      System.out.println("demoMethod for singleton"); 
   }
}


아래에 singleton 객체를 생성할 main program file 이 있습니다.

// File Name: SingletonDemo.java
public class SingletonDemo {
   public static void main(String[] args) {
      Singleton tmp = Singleton.getInstance( );
      tmp.demoMethod( );
   }
}


그 결과는 아래와 같을 겁니다.

demoMethod for singleton







Example 2:

아래는 고전적인 Singleton 디자인 패턴입니다.

public class ClassicSingleton {

   private static ClassicSingleton instance = null;
   protected ClassicSingleton() {
      // Exists only to defeat instantiation.
   }
   public static ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
}


ClassicSingleton 클래스는 singleton 인스턴스를 static reference로 관리 합니다. 그리고 그 reference를 static getInstance() 메소드에서 반환을 하죠.

여기의 ClassicSingleton 클래스는 singleton;을 생성하는데 lazy instantiation이라고 알려진 방법을 사용합니다. singleton 인스턴스는 getInstance()가 첫번째로 호출되기 전까지는 생성되지 않습니다. 이 방법은 singleton이 필요한 때에만 생성이 되도록 합니다.

반응형

Comment

  1. 유용한 정보 잘 보고 가요 ^^

  2. 신재선 2015.02.12 14:51

    좋은 정보와 쉬운 설명에 감사합니다