달력

72025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

Thread ^^;;

HomeWork 2009. 12. 23. 19:23
 Thread와 Runnable의 java.lang에 있으므로 import문 없이 사용이 가능함.

* Thread클래스를 하위클래스에서 상속받아서 사용하는 경우는 run()에서 보다 구체적인 작업을 하기 위한 목적으로 사용하길 바람...(이런 방식은 비추천됨.)

* Runnable인터페이스를 상속받아서 사용하기를 권장함.

 

* Thread클래스나 Runnable인터페이스를 상속받아 구현하는 클래스에 run()에서 작업할 내용(메서드)을 기술함.

 

* 주요메서드

- 동기화: synchronized 키워드 사용(공유자원에 락(lock)걸기)

- wait(): 스레드를 NotRunnable 상태로 만듦.

- notify(), notifyAll(): NotRunnable상태의 스레드를 Runnable상태로 만듦.

Thread.sleep() //InterruptedException예외발생. try~catch사용. 실행하고자 하는 스레드를 잠시 멈춤.. , 대기상태

 

* 스레드의 실행은 스레드스케쥴러에 의해서 관리됨...

만일 스레드의 실행방식에 어느정도의 순번을 기대코자 한다면 sleep()메서드를 활용할것.

 

* 자바에서는 애플리케이션 내부의 모든 스레드가 종료되지 않으면 JVM이 종료되지 않음.

 

* 두개 이상의 스레드 사용시 고려사항....

- 두개 이상의 스레드가 하나의 객체 데이터에 접근할 경우...

즉 서로 다른 스택 두개에서 실행되는 메서드가 동일한 객체에 대한 게터 또는 세터 메서드를 호출할 경우 문제가 발생할 수 있음...

이전에 자신이 했던 작업을 기억하지 못하기 때문에 실행하다  대기상태에 들어가게 되면

객체의 데이터가 변화했음을 감지하지 못하고 예상치 못한 결과값을 출력할 수 있슴.

 

* 스레드를 사용할 때 객체를 안전하게 만들고 싶다면 ...

다른 스레드가 같은 객체의 같은 메서드에 들어가기 전에 끝까지 실행되어야만 하는 메서드를 결정하여 synchronized로 동기화시킴.

 

* 락은 매서드마다 하나씩 있는 것이 아니고 객체마다 하나씩 있슴.

즉, 동기화된 메서드 하나에 스레드 두개가 들어갈수 없슴.

 

* 동기화의 목적은 처리중의 데이터를 외부로부터 보호하기 위함.

 

* 동기화를 할 경우 꼭 필요한 부분에만 사용할것...

- 동기화의 단점은 프로그램의 속도를 저하시키며,

여러군데 동기화를 적용할 경우 데드락이 발생할수 있슴.

(주의요망 : 두개 이상의 객체와 두개 이상의 스레드가 있을경우....)


'HomeWork' 카테고리의 다른 글

초간단 JSTL 집고 넘어가자!!  (0) 2010.01.19
GridBagLayout~ㅎㅎ  (0) 2010.01.15
JSON#2(JavaScript Object Notation)  (0) 2009.12.22
JSON 데이터  (0) 2009.12.22
Dom(Document Object Model) 알아보기~!!  (0) 2009.12.21
Posted by 인천총각
|





1. synchronized 키워드를 사용한다.




2. 인스턴스를 필요할 때 생성하지 말고, 처음부터 만들어 버린다.


3. DCL(Double Checking Locking)을 써서 getInstance()에서 동기화 되는 부분에 대한 체크를 줄입니다.


유일무이한 객체

  • 싱글턴패턴은 인스턴스가 하나 뿐인 특별한 객체를 만들 수 있게 해주는 패턴이다.
  • 어떤 용도로 쓰는 건가?
    • 스레드 풀이라던가, 캐시, 대화상자, 사용자설정, 디바이스드라이버 등등 객체가 전체프로그램에서 오직 하나만 생성되어야 하는 경우에 사용한다.
  • 그럼 전역변수로 static 으로 선언해서 사용하면 되지 않느냐?
    전역 변수로 객체를 생성하면 어플리케이션이 실행 될 때 객체가 생성될 것이다.(P208 맨밑줄)
    그 객체가 자원을 많이 차지 한다면 사용도 되기전에, 괜히 자원만 차지한다. 사용하지 않는다면 아무 쓸 데 없는 객체가 되겠지.

고전적인 싱글턴 패턴 구현법

  • 조심하세요.. 이 코드에 문제가 있다는 것을 알게 될 것입니다

public class Singleton {
 
  //private으로 Sinleton클래스의 유일한 인스턴스를 저장하기 위한 정적 변수를 선언
  private static Singleton uniqueInstance;

  //생성자를 private로 선언했기 때문에 Singleton에서만 클래스를 만들 수 있다.
  private Singleton() {}

  //클래스의 인스턴스를 만들어서 리턴해 준다.
  public static Singleton getInstance() {
    if(uniqueInstance == null) {
      uniqueInstance = new Singleton();
    }
    return uniqueInstance;
  }

}



초콜릿 공장

  • 만약 애플리케이션에서 ChocolateBoiler 인스턴스가 두 개 이상 만들어지게 되면 어떤 문제가 생길까?


 public class ChocolateBoiler {
  private boolean empty;
  private boolean boiled;
 
  private ChocolateBoiler() {
    //이 코드는 보일러가 비어있을 때만 돌아갑니다
    empty = true;
    boiled = false;
  }
 
  public void fill() {
    if (isEmpty()) {
      //보일러가 비어있을 때만 재료를 집어 넣습니다.
      //원료를 가득 채우고 나면 empty와 boiled 플래그를 false로 설정합니다.
      empty = false;
      boiled = false;
      // 보일러에 우유/초콜릿을 혼합한 재료를 집어넣음
    }
  }
 
  public void drain() {
    //보일러가 가득 차 있고(비어있지 않고), 다 끓여진 상태에서만
     //보일러에 들어있는 재료를 다음 단계로 넘깁니다.
    //보일러를 다 비우고 나면 empty 플래그를 다시 true로 설정합니다.
    if (!isEmpty() && isBoiled()) {
      // 끓인 재료를 다음 단계로 넘김
      empty = true;
    }
  }

//보일러가 가득 차 있고 아직 끓지 않은 상태에서만
//초콜릿과 우유가 혼합된 재료를 끓입니다.
//재료가 다 끓고 나면 boiled 플래그를 true로 설정합니다  
  public void boil() {
    if (!isEmpty() && !isBoiled()) {
      // 재료를 끓임
      boiled = true;
    }
  }

  public boolean isEmpty() {
    return empty;
  }
 
  public boolean isBoiled() {
    return boiled;
  }
}


public class ChocolateBoiler {
  private static ChocolateBoilerSingleton cb;
  private boolean empty;
  private boolean boiled;
 
  private ChocolateBoiler() { empty = true;
    boiled = false;
  }

  public static ChocolateBoilerSingleton getInstance(){
    if(cb == null)
      cb = new ChocolateBoilerSingleton();

    return cb;
  } 
 
  public void fill() {
    if (isEmpty()) {
      empty = false;
      boiled = false;
    }
  }
 
  public void drain() {
    if (!isEmpty() && isBoiled()) {
      empty = true;
    }
  }


  public void boil() {
    if (!isEmpty() && !isBoiled()) { boiled = true;
    }
  }

  public boolean isEmpty() {
    return empty;
  }
 
  public boolean isBoiled() {
    return boiled;
  }
}


싱글턴 패턴의 정의

  • 싱글턴 패턴은 해당 클래스의 인스턴스가 하나만 만들어진다,
  • 어디서든지 그 인스턴스에 접근할 수 있도록 한다.
  • 클래스에서 자신의 단 하나뿐인 인스턴스를 관리하도록 만들면 된다.


문제가 생겼다.

도대체 무슨 일이 일어난 거지? 새로 만든 싱글턴 코드가 얼마 전까지만 해도 문제 없이 잘 돌아가고 있었는데.
조금 전에 다중 스레드를 사용하도록 초콜릿 보일러 컨트롤러를 최적화시킨 걸 빼면 이런 문제를 일으킬 만한 게없는데...

두 개의 스레드에서 여기에 있는 코드를 실행시킨다고 가정해 보면.
두 스레드가 다른 보일러 객체를 사용하게 될 가능성은 없는지 따져 보자.
 ChocolateBoiler boiler = ChocolateBoiler.getInstance(); fill(); boil(); drain();

멀티스레딩 문제 해결 방법

  • getInstance()를 동기화시키기만 하면 멀티스레딩과 관련된 문제가 간단하게 해결된다.

public class Singleton {
  private static Singleton uniqueInstance;
  // 기타 인스턴스 변수
  private Singleton() {}
 
  //synchronized 키워드만 추가하면 두 스레드가 이 메소드를 동시에 실행시키는 일은 일어나지 않게 된다.
  public static synchronized Singleton getInstance() {
    if (uniqueInstance == null) {
       uniqueInstance = new Singleton();
    }
    return uniqueInstance;
  }
// 기타 메소드
}
  • 이렇게 하면 문제가 해결되긴 하겠지만, 동기화를하면 속도 문제가 생기지 않나?
    동기화는 불필요한 오버헤드만 증가시킬 수 있다.

  • 더 효율적인 방법은 없을까요?

    1. getInstance()의 속도가 그리 중요하지 않다면 그냥 내비 둔다.

    • 메소드를 동기화하면 성능이 100배 정도 저하된다는 것은 기억해 두자
    • 만약 getInstance( )가 애플리케이션에서 병목으로 작용한다면 다른 방법을 생각해봐야 한다.

    2. 인스턴스를 필요할 때 생성하지 말고, 처음부터 만들어 버린다.


    public class Singleton {
      private static Singleton uniqueInstance = new Singleton();

      private Singleton() {}

      public static Singleton getInstance() {
        return uniqueInstance;
      }
    }
  • 이런 접근법을 사용하면 클래스가 로딩될 때 JVM에서 Singleton의 유일한 인스턴스를 생성해 준다.
  •  

    3. DCL(Double-Checking Locking)을 써서 getInstance()에서 동기화되는 부분을 줄인다.

    • DCL(Double-Checking Locking)을 사용하면, 일단 인스턴스가 생성되어 있는지 확인한 다음, 생성되어 있지 않았을 때만 동기화를 할 수 있다.
    • volatile 키워드를 사용하여 멀티스레딩을 쓰더라도 uniqueInstance 변수가 Singleton 인스턴스로 초기화 되는 과정이 올바르게 할 수 있다.
    • DCL은 자바 1.4 이전 버전에서는 쓸 수 없다

    public class Singleton {
      private volatile static Singleton uniqueInstance;

      private Singleton() {}

      public static Singleton getInstance() { if (uniqueInstance == null) {
          //이렇게 하면 처음에만 동기화 된다
          synchronized (Singleton.class) {
            if (uniqueInstance == null) {
              uniqueInstance = new Singleton();
            }
          }
        }
        return uniqueInstance;
      }
    }

    핵심 정리

    • 어떤 클래스에 싱글턴 패턴을 적용하면 애플리케이션에 그 클래스의 인스턴스가 최대 한 개 까지만 있도록 할 수 있다.
    • 싱글턴 패턴을 이용하면 유일한 인스턴스를 어디서든지 접근할 수 있도록 할 수 있다.
    • 자바에서 싱글턴 패턴을 구현 할 때는 private 생성자와 정적 메소드, 정적 변수를 사용 한다.
    • 다중 스레드를 사용하는 애플리케이션에서는 속도와 자원 문제를 파악해보고 적절한 구현법을 사용해야 한다.
    • DCL을 사용하는 방법은 자바2 버전 5(자바 1.5)보다 전에 나온 버전에서는 쓸 수 없다는 점에 주의.
    • 클래스 로더가 여러 개 있으면 싱글턴이 제대로 작동하지 않고, 여러 개의 인스턴스가 생길 수 있다.

    --------------------------------------------------------------------------------------------------------

    О situation : 초코릿 공장

     

    초코릿 끓이는 장치를 컴퓨터로 제어한다.

     

    보일러에서 초콜릿과 우유를 받아서 초코바를 만드는 단계로 넘겨준다.

     

    재료를 넣고 끓이고 비우고 하는 단계를 순서대로 거쳐야 하는데 여러 개의 객체가 생성되면 해당 작업의 동기화가

     

    맞질 않아 단계가 뒤죽박죽이 되어 버린다.

     

    즉 각각의 동작들이 동기화가 되어야만 한다는 말이다.

     

     

    О point : 한 개의 인스턴스만 생성하는 객체를 만든다.

     

    객체의 생성자를 private 로 선언한다,

     

    인스턴스를 생성하여 반환하는 static 메소드를 선언한다.

     

    New 부분을 동기화하여 상호배재 현상에 대응한다.

    <?xml:namespace prefix = o /> 

     

    О solution :

     

    싱글턴 1 >

     

    Public class Singleton {

     

                 Private volatile static Singleton uniqueInstance;

     

                 Private Singleton(){}

     

                 Public static Singleton getInstance(){

                               If(UniqueInstance == null){ 

                               //메소드 전체를 동기화 시키지 않기 때문에 UniqueInstance 가 생성되지 않은

                               //처음 1번 빼고는 오버헤드를 발생시키지 않는다.

                                            Synchronized (Singleton.class){

                                                         If(UniqueInstance == null){

                                                                      uniqueInstance = new Singleton();

    }

    }

    }

    }

     

    }

     

    싱글턴2 >

     

    Public class Singleton {

     

                 Private volatile static Singleton uniqueInstance = new Singleton();

     

                 Private Singleton(){}

     

                 Public static Singleton getInstance(){

    return uniqueInstance;

                 }

     

    }

     

    처음에만 동기화하여 오버헤드를 줄인다. uniqueInstance null이 아니면 동기화 되지 않는 것이다.

     

    О thinking :

     

    전역변수 vs 싱글턴

     

    전역변수를 사용할 경우 처음부터 끝까지 인스턴스를 가지고 있어야 하므로 자원의 낭비가 심하다.

     

    해당클래스가 하나만 만들어지고 어디서든지 그 인스턴스에 접근 할 수 있도록 한다.

     

    새로운 인스턴스가 생성되는 것이 아니란 것이다.

      

    싱글턴이 쓰이는 경우

     

    ->>>>>>>>>>> 

     

    1) 스레드 풀 (서버 프로그램 할때 데몬 스레드 만들어본 경험있을 것이다)

     

    2) 사용자 설정, 레지스트리 설정등의 환경설정 관련 객체

     

       3) 로그 기록용 객체, 프린터, 그래픽 카드 같은 디바이스 드라이버

    ----------------------------------------------------------------------------------------------------


    Java 를 사용하여 Singleton 패턴을 구현할 경우 주의해야 할 사항이 있다. 멀티 쓰레드 환경에서 하나 이상의 객체가 생성되는 현상이 발견된다는 것이다.
    이 현상을 어디서 접하게 되었는고 하니... Tomcat 기반의 웹 어플리케이션을 개발하면서 Singleton 패턴으로 커넥션풀 라이브러리를 만들어 두었다. 여러분도 알다시피 Tomcat에는 클래스파일이 변경되었는지 자동으로 감지하는 "Watch Dog" 이라는 기능이 탑재되어 있어서, 클래스의 변경을 감지하여 웹 어플리케이션(컨텍스트)을 다시 로딩하는 작업을 수행한다. 당시 데이터베이스의 커넥션 자원을 너무 많이 소모하는 것 같아서 디버깅 작업에 착수하였는데, WatchDog에 의하여 클래스를 다시 로딩할 때 Singleton 패턴으로 정의한 클래스의 객체가 여러 개 생겼음을 발견하게 되었다!!!
    당연히 Singleton 패턴을 사용하면 같은 JVM 상에서는 오직 하나만 존재할 것으로 생각했던 내게 큰 충격이 아닐 수 없었다. 하여 문제를 해결하고자 검색해보니 멀티 쓰레드 환경에서 이런 문제가 꽤나 자주 있었음을 알 수 있었으며, 다음의 두 아티클을 찾을 수 있었다. 이 글들은 Java에서의 Singleton 패턴 구현 방식에 대하여 가장 잘 정리하고 있다:
    1. http://www-106.ibm.com/developerworks/java/library/j-dcl.html?dwzone=java
    2. http://c2.com/cgi/wiki?JavaSingleton
    첫 번째 자료는 IBM 에 게시된 자료인데 그냥 참고로 읽고, 주로 두 번째 자료를 숙독하기 바란다. 내가 두 번째 자료를 접했을 당시에는 아래와 같은 해결책이 제시되어 있었다.
    public class Singleton {   // <b>final</b> 키워드를 사용한 것에 주의할 것!   private static final Singleton _theInstance = new Singleton();    private Singleton() {    }    // <b>synchronized</b> 키워드가 사용되지 않았다는 점도 눈여겨 보자   public static Singleton getInstance() {      return _theInstance;    }  }
    위 해결책은 Darren Hobbs 가 제안한 방법으로 Java Spec에 근거하여 제시한 방법이다. 하지만 Adam 은 이 방식이 거의 대부분의 상황에 잘 적용되긴 하지만 Tomcat 과 JBoss 두 컨테이너에서 테스트 해보니 생성자(constructor)에서 멤버 변수를 초기화하지 못하는 문제가 발견되었다고 문제를 제기하였다.
    최근에 다시 두 번째 링크를 방문해 본 결과, Josh Bloch의 "Effective Java" 책 저술작업에 기여했던 Scot Floess 라는 사람이 David Geary가 JavaWorld에 게재한 글에 대해 Thread-safety 문제를 지적하며 제시한 해결책을 접할 수 있었다(※ 참고 : http://www.javaworld.com/javaworld/jw-05-2003/jw-0530-letters.html). 일단 Darren Hobbs 가 제안한 방법과 거의 같지만, 1) 클래스 선언 시 final 키워드를 붙여 상속이 불가능하도록 하였으며, 2) static 의 inner class를 사용하여 Singleton 패턴의 클래스를 감싸고 있는 형태가 다르다. 분명 이런 형태로 Singleton 패턴의 클래스를 생성하는 작업은 그 자체로 매우 무거운 작업이긴 하지만, 간단하면서도 완벽한 방식의 Singleton 패턴 구현 방식이라고 한다. 자세한 것은 링크를 참고하도록 하자.
     /*  * final 키워드를 사용하여 이 클래스로부터 상속이 불가능하도록 하였다.  */ public final class Singleton {    // static inner class (여기도 final 키워드 사용) 를 사용하여 Singleton 클래스의    // 객체를 생성함    private static final class SingletonHolder {       // 역시 이 내부에서도 static final 키워드 사용       static final Singleton singleton = new Singleton();     }     private Singleton() {}     public static Singleton getInstance() {       return SingletonHolder.singleton;     }  }
    --------------------------------------------------------------------------------------------------------

    전역 변수 vs Singleton

    단순 static과 싱글턴의 차이점은:싱글턴이 static 객체로 구현되더라도, 메모리나 자원을 필요로 하기전까지 기다렸다 생성하는 게으른 초기화를 할 수 있다는 것입니다.
    또다른 차이는, static 크래스는 interface를 구현할 수 없습니다.
    interface에 의해 표현되는 클래스를 구현하기 위해선 싱글톤 패턴으로 만들어야 합니다.



    --------------------------------------------------------------------------------------------------------

    싱글톤 은 디자인 패턴 중에 한 가지의 방법입니다.

    디자인 패턴이란  선배 개발자들의 개발 방법 중 괜찬타 싶은 방법에 이름을 붙여 놓은 것입니다. 즉. 패턴들은 자바라는 언어뿐만 아니라 씨 씨플 씨샵 파이톤 등등 여러 곳에서 응용되어질 수 있는 방법입니다.

     

    그럼 싱글톤 디자인 패턴은 어떤 개발 방법일까요?

     

    우리는 객체를 생성할때 new  라는 키워드를 사용합니다

     

    A a=new A();

     

    이렇게  객체를 생성하면

    heap 영역에는 A 클래스의 인스턴스(생성된 객체)가  생성 되어 지고

    그 A 클래스의 인스턴스 를  가르 키는 a 라는 변수가 스택에 저장 되어 집니다.

     

    그리고

     

    A a=new A();

    A b=new A();

    를 할경우엔

     

     

    이런식으로 메모리 상에 올라 오게 됩니다.

    한 가지 유념해야 할것이 있습니다. 힙 영역에 객체가 올라오고 내려 올때 시간이 많이 걸립니다.

    그리고 스택 저 화살표 연결 고리가 끊어지면 GC(가비지 컬렉션) 의 대상이 되는데 GC  수거 작업이 진행될시 컴퓨터가 멈춰 질정도로 느려지기 도 합니다.

     

    그래서  자주 사용되는 객체를 생성할 땐

     

     

    이런식으로 heap 영역에 한개만 올려놓고 스택에선 같은 객체를 가르키도록 코딩하는 것이 바로 싱글톤 디자인 패턴입니다.

    저런 식으로 해놓을 경우 힙영역에 객체가 올라 가고 내려가는 시간을 줄이고 또한 힙영역의 메모리 역시 쓰레기 객체들을 줄일수 있는 방법이 됩니다.

     

    그러나 ~ 한가지 조심할 점이 있습니다.

    a와 b 가 똑같은 객체를 가르키고 있기 때문에 A 클래스의 멤버 변수 역시 공유한다는 사실입니다.

    즉 a 에서 멤벼 변수값을 바꾸게 되면 b 의 멤버 변수 역시 값이 바뀌게 되어 이점 유념하여서 싱글톤 디자인 패턴을 사용할 객체 인지 판별을 해야합니다.

     

    즉  싱글톤 패턴은 멤버 변수가 없이 멤버 함수들만 으로 구성되어진 클래스 들에서 많이 사용되어 집니다

     

     

    ---싱글톤 디자인 패턴을 적용한  객체 만드는법--

     

    여러가지 방법이 있으나 가장 간단한 방법을 알려드리겠습니다.

     

    public class A{

    static A aInstence=new A();

    public static A getInstence(){

    return aInstence; 

    }

    private A(){

    }

    }

     

    ---------

    바로 위의 방법입니다

    위 의 방법으로 설계된 객체를 생성할 때는

    A a=new A();

    로 하면 에러가 나게 됩니다. 왜냐마혐 생성자가  private 로 되어 있기 때문입니다.

    그래서 스태틱 변수인 getIntence() 라는 메서드를 통해서 인스턴를 받아야합니다

     

    A a=A.getInstence();

    A b=A.getInstence();

     

    이렇게 할경우  힙영역에 A 인스턴스는 하나올라 오게 되고, a 와 b 는 같은 인스턴스를 가리키게 됩니다.

    'Design Patterns' 카테고리의 다른 글

    Command Pattern 알아보기-  (0) 2009.12.30
    스트래티지 패턴 2 (Head First 파헤치기 ver.1)  (0) 2009.11.12
    스트래티지 패턴(Strategy Pattern)  (0) 2009.11.12
    Observer Pattern  (0) 2009.11.11
    Singleton Pattern -  (0) 2009.11.11
    Posted by 인천총각
    |

    Json (JavaScript Object Notation) 이라는 데이터 형식이 있는데, 생각보다 매우 유용하다.
    표준은 Standard ECMA-262 3rd Edition—December 1999 (http://json.org/) 에 나와 있다.

    Json 은 XML 처럼 어떤 information 을 hierarchical 하게 보여주는 표현방법인데,
    그 형식의 간단함에 비해 매우 편리하게 dynamic 한 방식으로 data 를 나타내게 해준다.
    왜 이걸 진작에 활용하지 않았을까 싶을 정도로 강력한 기능에 감탄을 할 정도다.

    1. Json 포맷
    크게 보면 Json 은 세 가지 포맷만 알면 된다.

    (1) 객체
    형식 : { Name : Value, Name : Value, ... }
    설명 : Name 은 그냥 변수이름틱한 string, Value 는 Json Object, Json Array, 또는 Json Value 다.
    Value 형식이 Json Object 가 될 수 있다는 것은 nested 된다는 뜻이다.
    예제 : { "ID" : "ABC1213", "NAME" : "Youngin Shin", "Parameters" : { "Age" : 34, "Gener" : "M", ... } }

    (2) 배열
    형식 : [ Value, Value, Value, ... ]
    설명 : Name 없이 value 만 있는 배열. [] 로 열고 닫음. 여기서도 Value 는 Json Object, Json Array,
    또는 Json Value 다. Value 형식이 Json Array 가 될 수 있다는 것은 nested 된다는 뜻이다.
    예제 : { "ClickTimes" : [0, 2, 3, 5, 6, 8], "Users" : [ { "ID" : "1" }, { "ID" : "2" }, ... ] }

    (3) 값
    형식 및 설명 : 숫자 또는 문자열 등등..
    예제 : 위 예제들에서 [ ] 나 { } 로 둘러싸인 것들 말고 나머지 atomic 한 것들..

    2. Json 의 장점
    Json 를 좀 써본 결과 내가 느끼는 실용적인 측면에서의 장점은 ...

    (1) 매우 compact 하다. 몇 개의 [ ], { }, : 등등으로 모든 정보를 구조적으로 표현하니까..
    XML 이나 HTML 등 SGML 계열의 언어를 보면 <TAG> ... </TAG> 형식에 들어가는 문자가 너무 많아서..
    자칫 error 가 나기 쉽고 데이터가 어디서 어떻게 잘리는 지 눈으로 보고 파악하기도 매우 어렵다. 그보다,
    데이터의 사이즈가 이런 tag 들 때문에 실제 들어있는 정보에 비해 많이 커진다. 거기 비해 Json 은 거의
    최소한의 구분을 위한 수준으로 [ ], { }, : 등이 들어 있는 듯 느껴진다. 실제 그렇기에 Google 및 MS 등의
    회사들에서는 핵심적인 검색 데이터를 Json 으로 표현하고 있다.

    (2) XML parser 에 비해 Json parser 의 사용법이 훠얼씬 간단하다.
    XML 로 표현된 데이터를 읽어들이고, 이를 tree 형식으로 메모리에서 재구성하기 위해 XML parser 를
    써봤거나 써보려고 했던 사람은 얼마나 복잡하고 잘 안되는 지 알 것이다. XmlNode 이 뭐니 여러가지의
    클래스들이 쓰여서 parsing 해야되는데, 각종 컴파일 에러가 나든가 아니면 멀쩡한 XML 이 parse 되도
    아무런 정보가 memory 에 안생기는 등의 문제를 해결해야하는 수고에 짜증이 많이 났다. 이걸 되도록
    하기 위해 XML 을 다시 재편집하고 앉아 있다보면 원래 잘 표현되어 있던 XML 은 어디로 가고, 매우
    이상한 구조로 변해버린 XML 보면 화가 나기도 한다. 또 뭐 새로운 정보를 좀 더 넣으려고 XML 을
    재구성하게 되면 또 parsing  이 안되는 문제에 봉착하고...

    여기 비해 Json parser 사용법은 그야말로 너무나 간단하다. 예를 들어 C# 용 Json library 를 쓰면..

    JsonValue jvItem = JsonParser.Parse(strJsonText);

    이러면 끝이다. XML parser 도 이러면 얼마나 좋아?

    (3) " 를 제외한 [ ] 나 { } 는 " " 안에 있으면 따로 escape 하지 않아도 된다!!!
    이거는 참 별 거 아닌데도, 아주 편리하게 느껴진다. 예를 들면..

    { "Name" : "{ }, [ ], : ... " }

    위와같은 표현이 가능한다는 말. 물론 " 를 " " 안에 넣으려면 \" 로 escape 해야된다.

    3. Json Parser
    Microsoft 내부 Live Search 팀에서 사용하는 .NET 용 JsonParser 라이브러리를 나는 사용하고 있는데,
    다른 public domain 에서도 library 구하는 것은 어렵지 않을 듯 하다. 공개된 System.Json 도 있다.
    Json.Serialize, Deserialize 를 적절히 사용하면 되긴한데 좀 불편한 감이 없지 않다.

    하여간... Json 을 알고난 이후, 거의 모든 data 및 configuration 작업은 모조리 Json 으로 하고 있다.
    text parsing 을 일일이 손으로 짜면 참 귀찮고, yacc/lex 를 쓰면 너무 번거로운 것을 생각하면..
    그야말로 만능이 아닐 수 없다.

    'HomeWork' 카테고리의 다른 글

    GridBagLayout~ㅎㅎ  (0) 2010.01.15
    Thread ^^;;  (0) 2009.12.23
    JSON 데이터  (0) 2009.12.22
    Dom(Document Object Model) 알아보기~!!  (0) 2009.12.21
    JQuery-  (0) 2009.12.15
    Posted by 인천총각
    |