네이버 카페 코드인에 심심해서 적어 놨던 글을 다시 옮겨옴.
( 워낙 포스팅이 없어서 ;; 요런걸로 때움. ㅋㅋㅋ )
-------
안녕하세요.
 찬 입니다.

우리가 일반적으로 Map이나 HashTable을 쓸때 다음과 같이 사용하지요.

Map map = new HashMap(100);

map.put("찬", new Person( Person.MEN, 29 ) );
map.put("철수", new Person( Person.MEN, 15) );
map.put("영희", new Person( Person.WOMAN , 13 ) );

이때 map에
key로 "찬", "철수", "영희" 와 같이 String을 주고,
value로는 Person 객체를 만들어서 넣어 줍니다.

이때,
map에서는 key 값이 중복되면 기존에 있던 value에다가 새로운 value를 덮어 써 버리게 되는 것처럼 보입니다.

map.put("찬", new Person( Person.MEN, 29 ) );
map.put("철수", new Person( Person.MEN, 15) );
map.put("영희", new Person( Person.WOMAN , 13 ) );
map.put("철수", new Person( Person.WOMAN, 15 ) ) ;  // 으악! 철수를 여자로 만들어 버렸어!!

put할때에는 key의 hashcode를 보고 쓰게 되어 있죠.
즉, "철수".hashCode() 값이 같기 때문에, 예전에 있던 값에다가 덮어써 버리게 됩니다.
( 정확하게 말하면, 원래의 Hash 개념으로는 hashCode가 같은 애들은 bucket에 저장됩니다. 덮어 써 버리지는 않습니다. 하지만 자바의 기본 구현에서는 Key의 hashCode에 맞춰서 하나만 들어 가요. )


그렇다면 String의 hashCode()에 대해서 좀 알아 봅시다.
아래는 String의 hashCode()에 대한 API문서 내용입니다.

hashCode

public int hashCode()
Returns a hashcode for this string. The hashcode for a String object is computed as
 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
using int arithmetic, where s[i] is the ith character of the string, n is the length of the string, and ^ indicates exponentiation. (The hash value of the empty string is zero.)
Overrides:
hashCode in class Object
Returns:
a hash code value for this object.
 

보다시피 String의 hashCode()는 "s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]" 요런 공식에 의해서
값이 반환되게 되어 있는데요, 공식이 무진장 어렵죠. 무슨 말인지도 잘 모르겠고..

공식보다는 hashCode()의 반환값에 대해서 이야기 해 보죠.
hashCode()의 반환값은 int입니다. String 객체의 hashCode()를 가지고 오면 int형태를 반환하게 되죠.


자, 그럼 다시 생각해 봅시다.
int는 총 4byte를 차지할 수 있는 정수형 기본 타입입니다.
4byte로 표현할 수 있는 갯수는 0부터 0xFFFFFFFF(4,294,967,295) 입니다.
즉, hashCode()의 결과는 그 많은 int값 중에서  하나를 반환됩니다.


그렇다면 또 다시 String의 hashCode를 생각해 봅시다.

하지만 String은 무한개를 생성해 낼 수 있습니다. ( "A", "A1",..."AZ", "AA1", "ZZ....ZZZ", "가1A" .... 등등 )
그런데, 이렇게 무한개로 생성해 낼 수 있는 String 객체의 hash code는 int가 반환할 수 있는 숫자중에 하나 입니다.

확률상 서로 다른 String 인데도, 같은 hashcode를 가지는 String이 있을 수 있습니다.


그렇기 때문에,
HashMap이나 Hashtable를 사용할때 아무런 생각없이 String을 key으로 주고 쓰고 있습니다.
재수가 없으면 데이터가 날아 가는 문제가 발생할 수 있습니다.
( 또 다시 이야기 하자면, 데이터가 날아 가지는 않습니다. - 자세한 사항은 HashMap의 코드를 분석해 보세요~ )


그러므로 정말로 반드시 유일한 값이 필요하다고 한다면, hashCode()를 사용해서는 안될것입니다.
char[]을 일일이 가지고 와서 적당히 조작해서 int값으로 만드는 방법을 쓰던지 해야 할것입니다.
( 하지만, 위에서도 말했다시피 - int는 제한적이고 string은 무제한이므로, int를 가지고 어찌할 방법은 없습니다. )

2009년 8월 27일 추가 - 최근에 오래된 글에 대한 코멘트가 많이 달리네요. ㅎ.

지민아빠님의 코멘트처럼, 사실은 hashCode가 같다고 해서 꼭 문제가 되는것은 아닙니다. 
이미 들어 있는 hashCode를 가진 key를 이용해서 put하면, return으로 이전에 들어 있던 Object가 나오거든요.
이 글에서 이야기 하고 싶은것은,
String.hashCode()는 유일한 값을 반환하지 않는다는 것입니다.
그러므로 이글 오해할 가능성이 있는 내용을 포함하고 있습니다.

잘 이해가 되지 않으시는 분들은 이 게시물에 cobus 님께서 달아 두신 comment를 참고하시면 이해가 되실 겁니다. ^_^
2011년 6월 23일 추가 -
오늘 또 어느 익명의 정의에 사도께서는 "이 딴 글은 내려버려라~" 고 적어 주셔서, 내용을 일부 수정합니다.
 
어흑. 진짜 글을 내려 버려야 하나.. 쩝ㅋㅋㅋ


  1. 지민아빠 2008.11.19 00:40 신고

    hashcode 는 같은 값이 나오지만, 그래서 equals 도 같이 사용하는 거잖아요. 내부적으로는 그래서 예비 버킷이 있는.... 흠. 암튼. 유용한 글.. 좋아요. ㅎㅎ

  2. 2009.08.27 12:41 신고

    해쉬가 같으면 같은 빠겟스에 담는다는거고...
    빠겟스 수는 적절하게 조절되어질테고~

    결론이 좀....ㅋㅋㅋ

    여튼 잘봤음

    • Chan 2009.08.27 13:50 신고

      우왕~
      요즘에 오래된 글에 많은 사람들이 코멘트를 남겨주시네~ ㅎㅎ
      위의 글은 제대로 오해할 소지가 많지~ ㅎㅎ
      하지만, 고치긴 귀찮아. ㅋㅋ

  3. 분홍 2010.10.11 17:04 신고

    잘봤습니다. hashcode 의 문제점을 아주 잘 파악한 좋은글이네요...

  4. 흠.. 2011.06.20 18:34 신고

    오해할 소지가 있는 글이 아니고
    아예 개념을 잘 모르고 쓴 글이네요...

    아직도 안지우고 냅두고 있다는 것이 신기합니다..
    나는 바로 내릴 것 같은데..

    • Chan 2011.06.23 18:24 신고

      허허.
      이렇게 오래 된 글을 찾아 주셔서 감사합니다.
      아무래도 내용을 수정해야 겠군요. ^^

  5. 지나가다 2013.08.29 01:55 신고

    해쉬코드는 문자열에 유일합니다.
    char val[] = value;

    for (int i = 0; i < value.length; i++) {
    h = 31 * h + val[i];
    }
    hash = h;
    위가 hashCode() 소스입니다.
    value는 해싱할 문자열이고
    각 글자자릿수의 지수승을 해서 각 문자의 ASCII코드를 더합니다.
    abc 를 입력하면 96354이 나옵니다.

    • 2013.10.23 20:57 신고

      바로 위 "지나가다"님의 코멘트는 잘못 된 내용입니다.
      문자열이 달라도 같은 hashCode가 나올 수 있습니다.

      그 이유는 위의 글에 나와 있습니다.

  6. cobus 2015.11.27 11:10 신고

    글 내용을 잘 이해를 못하신건지 아니면 .hashCode()를 맹신하시는건지...
    본문에 String class의 hashCode() 를 사용했을 때 같은 값이 나오는 예제를 추가하면 논란이 없을 것 같습니다.

    약간 수정되어야 할 부분은 hashCode() 값이 중복될 수 있는 이유를 int의 수와 String의 표현 가능 수가 차이가 나서 중복이 생길 수 있다고 하셨는데 사실은 ASCII code값을 이용해 비트연산의 합으로 hash값을 만들다보니 길이와 상관없이 Hash값 중복이 발생할 수 있습니다. 본문에 추가하면 좋을것 같은 hashCode() 중복 문자열은 아래와 같습니다.

    String a = "Z@S.ME";
    String b = "Z@RN.E";
    if(a.hashCode() == b.hashCode()) {
    System.out.println("same hashcode");
    } else {
    System.out.println("different hashcode");
    }

    결과: same hashcode

    • 2015.12.15 19:41 신고

      cobus님 //
      댓글 감사합니다. ^_^

      저희 의도는 int의 표현 가능 갯수보다 String은 표현가능 갯수가 더 많기 때문에
      String을 int로 mapping 시킨다면 당연히, int 값이 겹치는 경우가 발생할 수 밖에 없다라는 의미로 적었습니다. ( 원론적인건 코드가 필요 없으니까요 ^_^ )

      제가 그 의미를 정확하게 표현하지 못했네요 ^_^

      이 글을 읽으시는 분이 코멘트 남겨 주신 내용을 읽으시면,
      훨씬 더 잘 이해할 수 있을것으로 보입니다. ^_^
      자세한 설명과 구체적인 예를 들어 코멘트 남겨 주셔서 고맙습니다. ^_^

      해당 글에, cobus 님의 코멘트를 확인하라는 내용을 추가 했습니다. ^_^

자바에서 Swing을 사용할때 별 생각없이 만들다 보면,
EDT가 아닌곳에서 Swing Component에 대한 작업을 많이 하려고 한다.

다른 Thread에서 Swing Component에 대해서 어떠한 작업을 했을때,
dead lock이 일어나기 전에는,
어느곳에서 그런것을 썼는지 일일이 알아 내기가 힘들다.

Print 관련 자료를 찾다가 TroubleshootingGuide for Java를 발견해서
살짝 보았는데 참고해 두고 담에 체크할때 먹으면 좋아 보여서 긁어 놓는다.

TroubleshootingGuide for Java SE 6DesktopTechnologies
http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/TSG-Desktop.pdf

4.2.1 IncorrectThreading
Randomexceptions and painting problems are usually the result of incorrect threading usage of Swing. All access to Swing components, unless speciically noted in the javadoc,must be done on the event dispatch thread. This includes anymodels (TableModel, ListModel, and others) that are attached to Swing components.

The best way to check for bad usage of Swing is by way of an instrumented RepaintManager,as illustrated by the following code:

public class CheckThreadViolationRepaintManager extends RepaintManager {

    // it is recommended to pass the complete check
    private boolean completeCheck = true;

    public boolean isCompleteCheck() {
        return completeCheck;
    }

    public void setCompleteCheck(boolean completeCheck) {
        this.completeCheck = completeCheck;
    }

    public synchronized void addInvalidComponent(JComponent component) {
        checkThreadViolations(component);
        super.addInvalidComponent(component);
    }

    public void addDirtyRegion(JComponent component, int x, int y, int w, int h) {
        checkThreadViolations(component);
        super.addDirtyRegion(component, x, y, w, h);
    }

    private void checkThreadViolations(JComponent c) {

        if (!SwingUtilities.isEventDispatchThread() && (completeCheck || c.isShowing())) {

            Exception exception = new Exception();
            boolean repaint = false;
            boolean fromSwing = false;
            StackTraceElement[] stackTrace = exception.getStackTrace();

            for (StackTraceElement st : stackTrace) {
                if (repaint && st.getClassName().startsWith("javax.swing.")) {
                    fromSwing = true;
                }
                if ("repaint".equals(st.getMethodName())) {
                    repaint = true;
                }
            }

            if (repaint && !fromSwing) {
                //no problems here, since repaint() is thread safe
                return;
            }

            exception.printStackTrace();
        }
    }
}
  1. 무적조로™ 2008.11.05 12:59 신고

    어떤 내용인지 감이 잘 안잡힌다 ㅋㅋ
    다시 자세히 설명 좀 해보삼..

    • Chan 2008.11.08 00:55 신고

      뭐.. ㅎㅎ 굳이 깊이 알 필요는 없는.. ㅎㅎ
      알아두면 좋은거고. ㅎㅎ

      1. Swing에서 무언가 작업을 할때에는 EDT에서 해야 한다.
      2. 스윙에서 무슨 작업을 하고나면 보통 repaint를 호출하거나, 혹은 호출이 되는데
      3. 이때 만약 EDT가 아닌 Thread에서 호출하게 되면, 에러를 출력하는 코드

      정도 되는것 같은데. ㅎㅎ

      아직 한번도 안써봐서 ^^;;

Font 및 Character 관련글을 찾아보면, CJK에 대해서 많이 나온다.

여기서 CJK란 중국, 일본, 한국을 뜻한다.
( 아주 가끔씩 혹은 거의 그러지 않지만, CJKV라고도 하는데 V는 베트남을 이야기 한다. )

http://en.wikipedia.org/wiki/CJK


CJK characters

CJK is a collective term for Chinese, Japanese, and Korean, which constitute the main East Asian languages. The term is used in the field of software and communications internationalization.

The term CJKV means CJK plus Vietnamese, which in the past used Han t?/Chinese characters and Ch? Nom prior to adopting Qu?c Ng?.


CJK의 특징은 한자(漢字)를 사용한다는것이다.
( J 와 K의 경우에는 자신의 문자들이 있지만, 한자를 같이사용(병용)하고 있다. )

그리고 이쪽을 보다보면 Kanji 며 Hanzi 며.. 이런 단어가 나온다.
아무튼 간단하게 조사.



위에 말했다시피 CJKV 는 한자를 같이 사용하고 있다.
하지만 문자를 같이 사용할뿐 발음은 서로 다르게 하고 있다.
( 마치, 한국 사람이 모택동이라고 부르고, 중국사람은 마오쩌뚱이라고 부르는것 처럼. )

hanzi나 kanji는 한자를 이야기 할때, 언어권별로 다른 발음을 영어로 나타낸것이다.


한자( Chinese character, Han character )의 발음을

중국 : Hanzi
일본 : Kanji
한국 : Hanja
베트남 : Han t?

라고 한다.

http://en.wikipedia.org/wiki/Chinese_characters

Chinese character

A Chinese character, Han character or Hanzi (simplified Chinese: ?字; traditional Chinese: 漢字; pinyin: Hanzi) is a logogram used in writing Chinese (hanzi), Japanese (kanji), less frequently Korean (hanja), and formerly Vietnamese (han t?).


즉, 쉽게 이해하려고 하면,
Hanzi 던 Kanji 던 Hanja던, 모두 한자를 이야기 하는거다.
단지 발음이 달라서 정확하게 표현하려고 하는거다.



더 정확하게 이야기 하면 Kanji와 Hanzi, 그리고 Hanja는 같지 않다.

세 나라 모두 다 한자를 사용하기는 하지만, 그 한자의 모양새나 발음이 다르다.
일본에서는 한자를 간단하게 변형해서 쓰기 때문에 Kanji와 Hanzi 가 같다고 볼 는 없다.


끝.


참고로. 한자뿐만 아니라, 로마자도 서로 다르게 표현한다.

http://en.wikipedia.org/wiki/Romaja
Romaja literally means Roman letters in Korean, and refers to the Roman alphabet.


http://en.wikipedia.org/wiki/Romanization_of_Japanese
The romanization of Japanese or r?maji (ロ?マ字?) (listen ) is the use of the Latin alphabet to write the Japanese language



다시 참고로, 특정 언어를 로마자(알파벳)으로 바꾸는것으로 romanization 라고 한다.

http://en.wikipedia.org/wiki/Romanization
In linguistics, romanization (or latinization, also spelled romanisation or latinisation) is the representation of a word or language with the Roman (Latin) alphabet, or a system for doing so, where the original word or language uses a different writing system (or none).
  1. 옷장수 2008.09.04 09:30 신고

    깊게 들어가면 일본,한국,중국 각각의 나라에서만 쓰는 한자 있는걸로 아는뎅~

    • Chan 2008.09.04 10:08 신고

      그렇지요~ ㅎㅎ.
      세나라 모두 다 한자를 사용하기는 하지만, 그 한자의 모양새라 발음이 다르다. 라고 적혀 있지만,
      옷장수님 말씀처럼, 고유한 한자인 "문자"를 가지고 있기도 합니다. ㅎ.
      ( 뭐 틀리면.. 저도 잘.. ㅎㅎ )

몇일전 테스트 주도 개발이라는 책을 다 읽었다.

1장부터 16장까지는 은행에서 사용하는 돈(통화)에 관련된 작업을
어떻게 TDD로 만들어 가는지를 실제 코드를 보여주면서 보여주고 있다.

17장 부터는 TDD 자체에 대한 이야기로 되어 있다.

이전에 적었던 부분을 빼고, 책을 읽으면서 줄쳐 놓은 부분을 옮겨 본다.
  • 이러한 접근 방식은 "깔끔한 코드" 부분을 먼저 해결한 후에, "작동하는" 부분을 해결해 가면서 배운것들을 설계에 반영하느라 허둥거리는 아키텍쳐 주도개발과는 정반대다.
  • 시스템이 크다면, 당신이 늘 건드리는 부분들은 절대적으로 견고해야 한다. 그래야 나날이 수정할때 안심할 수 있기 때문이다.
  • "다음에 할일은 무엇인가?"에 관련된 또 다른 질문은 "어떤 테스트들이 추가로 더 필요할까?"다.
  • 그리고 지금 이 글을 쓰는 동안 "Expression(수식)" 메타포를 생각했는데, 설계가 기존과는 완전히 다른 방향으로 흘렀다. .... Expression 메타포는 중복되는 통화를 합치는 세세한 일단의 문제에서 날 해방시켰다. 나는 수식의 성능에 대해 우려 했지만 최적화를 시작하지 전에 어느정도의 사용 통계를 볼때까지 기다리는것에 만족한다.
  • 아주 확신에 찬 사람과 정말 얼렁뚱땅 넘어가는 사람들 제외한다면, 아무리 작은 변화라도 테스트 하지 않고 릴리즈 하지 않는다. ( 만든것만 테스트하는 임시 테스트 코드 )
  • 당신이 변화를 테스트 할 수 있다고 해도, 실제로 변화를 테스트하는 것은 "테스트를 가지고 있다."는 것과 똑같지 않다. ( 계속 유지되는 자동화된 테스트 )
  • 이 경우엔 '테스트'를  '자동화된 테스트'로 치환하면 된다. "내가 이걸 고치면 뭔가 다른 부분을 망가트리지 않았을까?" .... 자동화된 테스트가 있다면 스트레스를 받기 시작할때 테스트를 실행할것이다. .... 테스트를 실행하면 즉시 좋은 느낌을 받게 되고 그러면 작업중에 에허를 낼 일도 줄게 되며, 스트레스도 적어진다.
  • 테스트를 실행하는 것이 서로 어떤 식으로 영향을 미쳐야 좋은가? 아무 영향이 없어야 한다. .... 앞 부분에서 실행된 테스트가 실패한 후 그 영향으로 다음 테스트부터는 시스템이 예측 불가능한 상태에 놓이는 경우가 허다하다.
  • 테스트는 전체 애플리케이션을 대상으로 하는것 보다 좀 더 작은 스케일로 하는것이 좋다. 어쨌건 주된 교훈은 각각의 테세트는 다른 테스트와 완전히 독립적이어야 한다는것이다. 즉, 문제가 하나면 테스트도 하나만 실패해야하고, 문제가 둘이면 테스트도 두개만 실패해야 한다.
  • 테스트를 언제 작성하는것이 좋을까? 테스트 대상이 되는 코드를 작성하기 직전에 작성하는것이 좋다. 코드를 작성한 후에는 테스트를 만들지 않을것이다.
  • 시스템을 배갈할 때 무슨 일 부터 하는가? 완료된 시스팀이 어떨 거라고 알려주는 이야기 부터 작성한다. ( USER STORY를 말한다. 기존의 방법론의 요구사항 문서와 비슷한데 훨씬 짧고 비격식적이다. )
  • 테스트 할 때 어떤 데이터를 사용해야 하는가? 테스트를 읽을 때 쉽고 따라가기 좋을 만한 데이터를 사용하라. .... 1과 2 사이에 어떠한 개념적 차이도 없다면 1을 사용하라.
  • 시스템이 여러 입력을 다루어야 한다면 테스트 역시 여러 입력을 반영해야 한다.
  • 길을 잃은 느낌이 들땐 어떻게 해야 할까? 코드를 다 지워버리고 처음부터 다시 해 보자.

더 많은 내용에 줄을 그어 놓았지만, 그만 옮겨적어야겠다.


아직은 "테스트 주도 개발"에서 "테스트"에 대해서만 와 닿았고, "주도"에 대해서는 잘 모르겠다.
다음에 정리를 다시하면서 "주도" 부분도 다시 한번 알아 봐야 겠다.
  1. leonid 2008.03.19 19:01 신고

    안녕하세요. 이번에 TDD에 대해서 공부를 시작해보았습니다. 아직까지는 온라인에 있는 글과 동영상들만 봤지만 역시 책을 사서 읽어야 할 것 같네요 :)

    • Chan 2008.03.19 22:34 신고

      어이쿠~ 답변 감사합니다. ^_^

      제가 내린 결론은
      TDD는 아직잘 모르겠지만, 확실히 느낀건 TestCase는 많으면 많을 수록 좋다 였습니다. ^_^

내용에 대해서 책임지지 않습니다. ㅋㅋ


CP949는 MS-Windows에서 정한 한글을 나타내는 문자set 이다.
index가 주루룩 나열되어 있고, 거기다가 한글이 하나씩 들어 있는것이다.


원래 글자를 나타낼때에는 index는 총 2byte로 구성되어져 있어도 문제가 없을것 같았나 보다.
하지만 2byte만을 가지고는 세계의 모든 글자를 표시 할 수 없기 때문에
CP( CodePage ) 라는 구분을 해 주어, CP에 따라서 다른 글자가 보이도록 한다는거다.


CodePage는 국가 마다 다르다.
하나의 index가 있을때 CodePage를 바꾸어 버리면 서로 다른 모양의 글자가 나온다는것이다.

9A98이라는 index가 있을때
이것을 CP49 (Korean) 로 인식하고 보면 "슆"이 나온다. 하지만
이것을 CP932 (Japanese Shift-JIS) 로 인식하고 보면 "口"가 나온다.


CP949에 있는 글자들은 Unicode 처럼 조합할 수 있도록 제공해 주지 않는다.
즉, 하나의 index는 완전한 하나의 글자를 이루게 되어 있다.
( 반면 유니코드는 초성 "ㄱ", 중성 "ㅏ" 처럼 글자를 조합해서 나타낼 수 있게도 제공해 준다. )


CP949는 "EUC-KR http://en.wikipedia.org/wiki/EUC-KR#EUC-KR "의 확장판이고
EUC-KR은 "완성형 한글(KSC5601) http://www.itscj.ipsj.or.jp/ISO-IR/149.pdf + 기타등등문자 "의 확장판이다.
"완성형한글(KSC5601)" 역시 index가 정해져 있고 완전한 하나의 글자가 배치되어 있지만,
"똠" 과 같이 표현하지 못하는 문자들이 매우 많았다.
그래서 CP949는 "완성형한글(KSC5601)"에 더 많은 글자를 추가하게 된 것이다.



CP949에서는 Unicode에서 제공해주는 글자보다 덜 제공해 주므로,
CP949에서 나타나지는 글자들은 모두 Unicode로 변환이 가능하나,
반대로 Unicode에서 제공되는 글자를 CP949에서는 표현하지 못할 수 있다.



여담.
사실 CodePage라는 것은 IBM에서 먼저 만들었다.
그리고 시간이 지난뒤 MS에서 한글을 표현하기 위해서 CP949를 정했는데,
Java에서는 이를 MS에서 만든것이라서 MS949로 말하게 된다.

내용에 대해서 책임지지 않습니다. ㅋㅋ


Unicode provides a unique number for every character,
no matter what the platform,
no matter what the program,
no matter what the language.

http://www.unicode.org/standard/WhatIsUnicode.html


위에 설명되어 있는대로다.




유니코드란?

unicode는 모든 문자에 index를 줘 놓은 것이다. 더 이상도 아니고, 더 이하도 아니다.
이 index를 code point라고 부르는데, 그냥 index라고 칭하도록 하자.

'A'라는 글자는 0x0041 이라는 index를 가진다.
'a'라는 글자는 0x0061 이라는 index를 가진다.
'가'라는 글자는 0xac00 이라는 index를 가진다.
( 더 많은 글자와 index를 보려면 http://www.unicode.org/charts/ 를 참고하자 )




표현방법

저렇게 정해져 있는 index를 표시하는 방법에는 UTF와 UCS두가지 종류가 있다.
( UTF - Unicode Transformation Format ,    UCS - Universal Character Set )

UCS
UCS는 몇바이트로 index를 표현할 수 있느냐를 나타낸다.
즉 UCS-2는 2byte로 index를 나타낼꺼고 UCS-4는 4byte를 이용해서 index를 나타낼거라는거다.

UTF
UTF는 몇 비트단위로사용해서 index를 나타낼것인가를 말한다.
UTF-8은 8bit씩 늘려가며 index를 나타낼꺼라는거고,
UTF-16은 16bit씩 index를 나타낼꺼고, UTF-32는 32bit씩 index를 나타낼꺼라는거다.
( 실상 UTF-16과 UCS-2는 같다고 볼 수 있다. 마찬가지로 UTF-32와 UCS-4도 마찬가지다.  하지만 unicode 3.1에 오면서 달라 졌다. )





UTF-16

원래 처음에 unicode의 index는 2byte로 나타낼 수 있었다.
그랬는데, unicode 가 버젼업되어 4.0이 나왔을때에는 0x10FFFF 까지의 index가 생겼다.

처음에는 UTF-16으로 모든 문자를 나타낼 수 있었으나,
( 2byte로 표현할 수 있는 index를 가진 문자 목록을 BMP Basic Multilingual Plane 라고 부른다. )
유니코드 4.0이 나오면서, 2byte로는 0x10FFFF 같은 값을 가리킬 수 없게 되었다.

그래서 UTF-16으로는 BMP에 있는 문자들은 2byte로 처리하고, 
BMP보다 더 높은 index를 가지는 놈들은 4byte로 처리 한다.
문자 index 0x0000 부터 0xFFFF 까지는 2byte로 처리 하고
문자 index 0x10000 부터 0x1FFFF 까지는 4byte로 처리 된다.





UTF-32

UTF-32는 기본적으로 4byte를 사용하기 때문에, 위와 같은 짓을 하지 않아도 된다.





UTF-8

영어권에 있는 사람들은 UTF-16을 쓰면 손해다.
모든 영어는 1byte만 있으면 256개를 표현할 수 있으므로, 모든 문자를 넣을 수 있기 때문이다.

그래서 나온게 UTF-8이다.
영어권은 1byte로 표현하고, 그것보다 높은 index를 가지는것은 2byte 혹은 3byte 혹은 4byte ..
요렇게 늘려 가면서 쓰도록 되어 있다.





서로간의 변환

UTF-8, UTF-16, UTF-32, UCS-2, UCS-4 는
모두 unicode의 문자 index를 나타내기 위한 방법이기 때문에,
서로간의 변환은 당연히 잘 된다. ( UCS-2는 한계를 가지고 있다. )




글자처리

우리가 글자 "가"를 쓴다고 해 보자.  글자 "가"는 1글자이다.
그러므로 "가"를 나타내는 index가 있다. 물론 "나"를 나타내는 index도 있다.

한글로 표현할 수 있는 글자는 매우 많다.
그 많은 글자 모두에게 index를 줄 수가 없다.

현재 사용하고 있는 모든 글자에 index를 준다고 해도,
시간이 지나서 새로운 글자가 추가 되어 index가 모자르게 된다면 어떻게 할것인가?

그래서 유니코드는 완전한 글자를 제공해 주기도 하지만,
글자를 조립할 수 있도록 조립가능한 글자를 제공해 준다.

다시 "가"를 쓴다고 해 보다.
"가"라는 글자는 1개이지만, 실제로는 초성 "ㄱ"과 중성"ㅏ" 가 합쳐져서 만들어진 글자이다.

그러므로 "가"를 표현하는 방법은 완성된 글자 "가"0xAC00가 될 수도 있고,
초성"ㄱ"과 중성"ㅏ"를 조립한 "가"0x1100,0x1161 로 나타낼 수도 있다.
( 초성 "ㄱ"은 0x1100 - HANGUL CHOSEONG KIYEOK )
( 중성 "ㅏ"는 0x1161 - HANGUL JUNGSEON A )

이를 조합할 수 있게 해 주는 index는 1100 부터 있다.
( Hangul Jamo - Korean combining alphabet - http://www.unicode.org/charts/PDF/U1100.pdf )


이는 비단 한글뿐만 아니라,
일본어 역시 완성된 글자가 있기도 하고, 조합할 수 있게도 되어 있다.

영어 역시 그렇다. 영어에서 무슨 글자를 조합하냐 라고 말하겠지만, 
이력서를 나타내는 Resume 의 경우에는 e 와 ' 의 조합으로 이루어 질 수도 있다.


  1. 지민아빠 2008.02.28 09:47 신고

    맞는 말이구만 왜 내용에 책임을 안져요! ㅋㅋ

    • Chan 2008.02.28 09:59 신고

      유니코드랑 UTF관련은 머릿속에 정리 된것을 열심히 읽었는데,
      그 뒤에 글인 CP949 관련 글은 아직 머릿속에 확립이 안되어서.. ㅋㅋㅋ.
      CP949에 "책임질수 없음" 넣어 놓고, 유니코드 글에도 걍 넣었어요.. ㅋㅋ

    • 지민아빠 2008.03.11 12:05 신고

      아참. 펄에서 사용되는 이름이랑 자바에서 사용되는 이름이랑 약간 달라요. CP949, MS949, EUC-KR 의미가 약간 다름.

  2. sanaigon 2009.01.09 09:49 신고

    퍼가용ㅋ

  3. finebe 2009.04.24 14:11 신고

    퍼가요~^^; 공개글로 원치않으시면 말씀해주세요

    • Chan 2009.04.24 18:53 신고

      출처만 밝힌다면 상관없습니다. ㅋㅋ

  4. 2009.07.24 15:40

    비밀댓글입니다

  5. 킴킴 2014.01.20 17:13 신고

    퍼갈게요 ㅎㅎ

  6. carrot1st 2015.07.27 10:39 신고

    퍼갑니다 잘보겠습니다~

  7. 어벙이 2015.08.17 12:41 신고

    퍼갈게요..~~ ^^ 좋은 내용 잘 보고 갑니다..

  8. 라면사리누구야!! 2016.07.28 09:33 신고

    잘보고 갑니다~
    퍼갈게요~~ ^^;

  9. 뚝딱콩망치 2017.03.26 16:51 신고

    내용 참고해서 글써두 될까요 ㅠㅠ 출처는 꼭 남기겠습니다!

출처 :  [영화] The Devil's Advocate (데블스 에드버킷) 

 

크리스마스이브. 할일은 없고, ( 우울하다. 쩝 )
스릴러 영화 추천에 있던 것 중에 안 본거다 싶은것을 하나 선택 했다.

그리고 영화를 보다가 들려오는 알고 있던 영어들. 공부는 해야 겠지?

그래서 정리.

오늘의 영화는 데블스 에드버킷.

사용자 삽입 이미지


남자주인공으로는 키아누리브스와 알파치노가 등장한다.
확실히 알파치노의 연기는 아주 강렬하게 다가온다.

키아누리브스는 영화에서 한 지방에서 잘나가는 변호사인 캐빈로맥스로 나오고,
알파치노는 그를 고용하는 뉴욕의 로펌 대표인 존밀턴으로 나온다.


이 글은 영화 이야기를 하기 위해서 쓴게 아니므로,
소개는 위와 같이 간단하게 마치고 나오는 몇 문장을 정리 해 본다.


지방의 한 법정에서 승리를 따낸 캐빈.
하지만 뻔히 잘못된 피고였음을 알지만, 무죄로 풀려나게 만든다.
재판 후 그의 부인인 매리앤이 그와 동료를 데리고 술집에 들린다.
매리앤 : Damn straight.
해리 : 우리끼리 이야기지만, 그런 범법자를 빼내준 기분이 어떠냐?
매리앤 : Harry, Why don't you quit being a party pooper.
We're not going to discuss the damn case anymore.
Am I right?
캐빈 : no shop talk.

여기서는 party pooper 가 나왔다.
party pooper는 이전에 한번 다루었던 단어이다.

[영어단어] 흥을 깨는 당신은 party pooper

사람들의 지나친 여흥을 막아서는 사람을 party pooper라는 단어로 표현한다.

[예문] Tim called me a party pooper because I left the party just after midnight.
            팀은 내가 자정을 넘기자 마자 파티를 떠났다는 이유로 나를 흥을 깨는 사람이라 불렀다.

흥을 깬다고 해서 party pooper가 꼭 부정적인 의미를 가진 것은 아니다. 지나친 유흥을 막아, 일어날 수도 있는 사고를 미연에 방지하는 것도 party pooper가 하기 때문이다.

party pooper와 같은 의미로 wet blanket이라는 단어도 있다. party pooper의 반대 의미를 가진 단어는 party animal이다.

위에서 Damn straight 는 "원샷!"으로 해석 되었고, ( 하지만 찾을순 없었다. ; )
no shop talk은 "일 이야기는 그만둬" 로 해석 되었다.

Damn straight 는 다음과 같은 뜻을 찾을수 있었다.

http://www.urbandictionary.com/define.php?term=damn+straight 
1. damn straight

a way of agreeing with something

-Ha! You so crazy!
-Damn strait.



2. damn straight

synonyms: word up, right on, amen, agreed upon.

Let's say someone, in a crowded place, shouts, "war sucks!" Damn straight would be an appropriate reponse to that exclamation if you are anti-war.





이 소문은 뉴욕에까지 나게 되고, 밀턴이 캐빈을 스카웃 하게 된다.
이때 캐빈은 엄마를 찾아가서 그 이야기를 하게 되는데..

엄마 : All the way to New York just to pick a jury.
캐빈 : Every dog gets his day.

자주 듣던 말이 나왔다.
근데.. 우리가 듣던 말이랑 조금 틀리다. 그래서 검색을 좀 해 보니깐.
다 비슷 비슷한 말로 쓰이는것 같다.
Every dog has his day.
Every dog gets his day.
Every dog has its day.
Every dog gets its day.


중간에 로펌의 대표인 밀턴이 여러나라 언어를 구사하는것이 나오는데,
최초에 나올때에는 뭔가 좀 있어 보이던데..
한국말이 나오는데가 있는데 ;; 정말.. 못 알아 듣겠던걸...
이건뭐;;; ㅋㅋㅋㅋㅋㅋㅋ

야한 장면이 조금 나오기는 하지만, 스릴러물에는 뭐.. ㅎㅎ
2시간 20분이라는 긴 상영시간이기는 하지만,
빠져들어서 영화를 볼 수 있을것이다. ^_^


추천하는 영화. ㅎ 재미있는 영화. 스릴러 좋아 하는 사람은 시간 되면 꼭 보길. ㅎ

  1. rabbit 2008.02.02 15:56 신고

    can you watch without subtitle? -_-~!

  2. ㅇㅇ 2015.09.21 22:52 신고

    means translation in other language

출처 : http://www.studylang.com/30

 
정전이 되었다.

레이첼 : (Wow) This is so cool, you guys. The entire city's blacked out.

프렌즈에서는 심심하면 you guys. 라는 말이 나온다.
"애들아" 정도로 해석하면 좋을듯 하다.

blacked out 은 까맣다는 뜻이다.
그래서 city가 blacked out 되면 정전이 된거고.
사람이 blacked out 되면, 맛탱이가 갔다. 필름이 끊어졌다는 의미가 된다.


news blackout 은 뉴스에 보도를 하지 못하게 한다는 의미이다.

"등화관제"라는 말이 나오는데..
이건 군대에서 비상 한번 떠 본사람은 잘 아리라 본다.

비상이 함 걸리면. 건물에 모두 불을 끄고, 커튼을 치게 된다.
불빛이 외부에 나가지 않도록 하는것을 등화 관제라고 한다.



 

정전이 되는 바람에 첸들러가 은행 ATM이 있는 곳에 갇힌다.
근데 마침 예쁜 아가씨랑 함께 갇힌다.ㅋㅋ

첸들러 : I am trapped in an ATM vestibule with Jill Goodacre.

ATM은 우리가 일반적으로 말하는 그 현금지급기를 말한다.


그럼 vestibule은 뭘까?
ves·ti·bule〔「입구 에서〕 n.
1
현관, 현관 , 대기실;(현관의) 차 대
2》 (객차 앞뒤있는) 출입 , 연결 복도
3해부전정(前庭), 전실(前室);《특히내이강(內耳腔)
4 (
새로운 에의) 접근로;… 이루수단to
vt.
1
입구방을 설치하다
2
》 (객차 등에) 연결 복도설치하다

뭐냐 -_- 도저히 ATM vestibule 은 연결해서는 잘 해결이 되지 않는다.
하지만 그렇게 알아야지 뭐 힘이 있나?

저 여자의 이름은 전화통화를 엿들어서 알게 되었는데,
그 이름은 Jill 이었다.

그런데 왜 Goodacre 라는 이름을 붙여서 이야기 했을까?

http://en.wikipedia.org/wiki/Jill_Goodacre


Jill Goodacre

Jill Goodacre Connick (born March 29, 1965 in Lubbock, Texas) is a fashion model who appeared extensively in the 1990s Victoria's Secret catalogs. After directing one of his music videos in 1992, Goodacre married Harry Connick, Jr., in 1994. She is the daughter of real estate broker William Goodacre of Boulder, CO and Glenna N. Goodacre, a native of Lubbock, Texas, who resides in Santa Fe, New Mexico. Her mother is now married to Dallas attorney Michael Lee "Mike" Schmidt.


Other works
http://content.answers.com/main/content/img/webpics/Jill_Goodacre.jpg 

Goodacre는 찾지 못했으나 위키피디아에서 Jill Goodacre를 찾았다.
그런데... 위에서 보다시피 ;; 실제로 Friends에 까메오로 출연했다. ;;

그러니깐.. 실제 패션모델이 시트콤에 등장했던 것이다.

ATM 지점에서 뻘쭘한 시간은 계속 지나가고...

질 구데이커 : Would you like some gum?
첸들러 : oh, is it sugarless?

sugarless는 무설탕인지를 말하는것 같다.


 

조이가 처음 이사 왔을때 모니카가 조이에게 반했다는 것을 피비가 말해 버린다.
조이 : You are... you had crush on me?
모니카 : All right. It wasn't crush. it was a dent.

crush는 의미가 엄청 많다. ;;;

그중에서 crush on은 이성에게 반하다는 의미를 가진다.

dent는 인상적이었다는 것으로 보면 된다.


 

갇혀 있던 첸들러는 그냥 껌을 얻어 씹다가 목에 딱 걸린다.
질 구데이커 : Are you all rigth?
첸들러 : ( 여전히 컥컥 거리며 괜찮다는 제스쳐를 보낸다. )
질 구데이커 : Oh my god. you're choking.

목 막힌다는 뜻이다.

재미난것은 감동의 도가니일때 목이 메이는것도 같은것으로 쓰인다.

"숨막히는 감동" 할때.. 진짜 숨이 막히는것과, 감동으로 숨이 막히는것을
한국이던 미국이던 같은 형태로 사용하고 있다는것을 보면 참으로 신기하다.




 

+ Recent posts