자바는 call by value? call by reference?

자바에서 메소드 인자의 전달이 call by value냐 call by reference냐 하는 이야기는 꽤
해묵은 논쟁 중 하나입니다.

java에서 object형을 전달할 때 일견 call by reference 인 것같아 보일 수 있습니다만,
실제로 자바는 primitive, reference 타입 모두 call by value입니다.

아래의 코드가 reference 타입도 call by value라는 사실을 극명하게 보여줄 수 있겠네요.

[code]
////// 테스트용 클래스///////
public class TargetClass {
    private String param;    
   
    public String getText() {
        return param;
    }

     public void setText(String param) {
        this.param = param;
    }
}
[/code]

[code]
///// 테스트 시도할 main 클래스/////////////
public class CallByValue {

   public static void main(String[] args){

     CallByValue cbv = new CallByValue();
     TargetClass tc = new TargetClass();
   
     tc.setText( new String("처음 입력 값입니다."));

      System.out.println( " 변경 전 : "+ tc.getText()+" "+ tc.hashCode() );

     //아래 코드에서 tc변경을 시도합니다.
     cbv.changeObject(tc);

     //이후 내용을 찍어볼까요? tc에 변화가 없다면 call by value일테고
     //변화가 있다면 call by reference이겠죠.
     System.out.println( " 변경 후 : "+ tc.getText()+" "+ tc.hashCode() );
   }

   public void changeObject( TargetClass obj){
     //넘어온 인자를 null 처리합니다.
     obj = null;
   }

}
[/code]

자바 레퍼런스타입이 정말 call by reference에 의한 전달이라면 changeObject( TargetClass obj)이
수행되고 나면 tc는 null 이어야 하지만 그렇지 않죠. 실제로 자바도 reference type을 인자로 전달할
때에 reference를 넘기지만 바로 그 reference가 아니라 reference의 사본의 값을 넘기므로 진정한
의미에서 call by reference로 볼 수 없으며, 이는 위 코드로도 충분히 증명이 되고 있습니다.

사실, 자바에서 인자 전달이 call by value냐 call by reference냐 하는 해묵은 논쟁보다는 실제로 어떻게
인자가 전달되는지 이해하고 코드를 작성하는 게 더 중요하겠지요.

추가 : http://pungjoo.tistory.com/8 아티클에는 finalize()메소드를 이용하여 call by value임을 증명하고있네요.

2009/03/27 21:11 2009/03/27 21:11
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. Blog Icon
    비밀방문자

    관리자만 볼 수 있는 댓글입니다.

  2. Blog Icon
    코딩 지겹다

    그냥 가려다...

    call by value 증명으로 obj 에 null 을 대입했는데..
    obj = null; 대입하지 말고 obj.setText("변경전")
    이렇게 대입해보면 tc 값이 바뀌는걸 알 수 있습니다.

    레퍼런스 변수(참조변수)을 함수의 인자로 넘기면 힙에 저장된 실객체는 복사를 안합니다. 참조 값만 넘겨주지요..

    call by value 냐 call by value냐 call by reference 냐가 중요한게 아니라
    함수의 인자로 변수가 넘어 왔을 때 그 변수를 통해서 실객체의 값을 변동할 수 있느냐 못하냐 입니다.

    위에서는 변동할 수 있다가 정답입니다.

    다른 초보 개발자가 이글 보고 잘 못 인식할까봐 몇 자 적었습니다.

  3. Blog Icon
    지나가다

    메소드에 인자 전달할때는 래퍼런스를 복제해서 넘긴다고 알고있는데 아닌가요?

    테스트 결과는 당연한데 풀이가 아리송 하군요.

  4. Blog Icon
    Lele

    jvm의 동작과관련하여 좀 더 공부해 보셔야 할듯하네요... 게다가 Java의 대표적인 Immutable 객체 String을 call by value, call reference 의 예로들고 있는 점 또한 큰 오류라 생각합니다. 지나가다.....

  5. Blog Icon
    지나가는

    잘알고 포스팅 하세요.완벽히 잘못된 예제 입니다

  6. Blog Icon
    지나가는

    맞는 포스팅인 것 같은데 뭐가 잘못되었다는건지?

  7. Blog Icon
    행인13

    잘못된 예제가 이에용


    http://trypsr.tistory.com/74
    이 글을 참고 하세요.

  8. Blog Icon
    컴돌이

    제대로 된 예제가 맞는데요..
    call by reference는 결국 주소값이 call by value로 전달되기 때문에 발생하는거죠.

  9. Blog Icon
    대박

    그렇게 따지면 C언어도 Call by value인 셈이 되는 겁니다.
    포인터의 값도 결국은 값을 넘기는거니까요.

    call by reference의 의미는 해당 변수의 주소 값을 인자 값으로 넘기는 것을 의미 합니다.
    위의 예제에서도 tc의 주소값을 넘기게 되므로 call by referece가 됩니다.

  10. Blog Icon
    대박

    cbv.changeObject(tc);
    를 통해,
    public void changeObject( TargetClass obj)
    obj가 tc의 주소값을 가지게 되어
    obj의 내용을 수정하게되면 tc의 내용도 수정되겠지만
    obj = null;을 하게되면
    obj가 가르키는 주소값이 null 값으로 바꾸게 되어 가리키는 곳을 잃게 됩니다.
    윗분들 말대로 잘못된 예제이며 tc.setText로 해서 문자열을 변경하는걸로 테스트 하는게 옳은 걸로 보입니다.

  11. Blog Icon
    속터지는행인

    결론요약, 아래 링크 참고
    http://stackoverflow.com/questions/17419257/does-java-use-call-by-value-or-call-by-reference
    -----------------------------------------------------
    http://trypsr.tistory.com/74 // 파워 오답
    위 블로그 주소글처럼 이해하고 c++ 넘어와보세요.
    c++의 *와 &만나는순간 오지게 털리니까.
    현재 블로그글이 올바르게 이해한 예제입니다. 프로그램 한번만 짜서 돌려보면 버그 나서 탈탈 털리겠구만, 탁상공론으로 올바른 글 잘못된 예제라고 몰아붙이는 사람들때문에 글 올립니다.

    행인13/Lele/지나가는/대박님이 올린글은 잘못된 글입니다. c/c++에서 & 선언의 의미를 제대로 이해하지 못한거 같군요. 그 중에서 대박님은 c/c++의 개념조차 흔들리고 계시네요.
    c/c++에서의 changeObject( TestClass* a );
    의 경우 call by value가 맞습니다.
    changeObject( TestCalss& a );
    의 경우는 call by reference 입니다.
    혹시나 물어보겠습니다.
    changeObject( TestClass*& a ); 는 c/c++에서 call by value 일까요 call by reference일까요? call by reference입니다. 포인터의 레퍼런스입니다. 바로위의경우는 클래스 인스턴스의 레퍼런스이고, 맨위는 클래스 인스턴스의 포인터값입니다.

    첨언하자면, 자바에는 레퍼런스할 수 있는 방법을 제공조차 하지 않기 때문에 이해가 힘들고 다른 언어와 같이 비교하셔야 이해가 가능합니다. ( c#은 ref라는 명령어로 존재하지만 java에는 레퍼런스 연산자 자체가 없습니다. 자바에서 c/c++의 &에 해당하는 연산자가 있던가요? )
    3차원을 사는 저희가 4차원의 모습을 상상하지 못하듯, 레퍼런스개념이 없는 자바만으로는 이해가 불가능합니다.
    그리고 현인이 달을 가리키는데 손가락만 보고있네요. 이글의 핵심은 내가 원하는 instance의 멤버변수들을 제대로 변화시키는게 중요하지 call by value냐 call by reference냐 그게 중요하다고 적은글이 아닙니다. 동작 원리를 이해하는게 더 중요합니다. 그래야 내가 원하는 동작을 얻어낼수있으니까.

    2003년에도 올라온 참으로 해묵은 논쟁이네요.
    http://okjsp.net/seq/32431

  12. Blog Icon
    들개

    하아.. 이거 신기하네요. 저도 저게 call by reference 라고 생각해왔는데.. 이 글을 보고 테스트 해보니 실제로 (주소)값 복사가 이루어지는군요.

    아마도
    1. tc의 실제 값을 저장한 메모리 공간이 있고
    2. tc는 그 메모리 공간에 대한 주소값을 값으로 가진 변수이고
    3. changeObject()의 인자로 들어온 obj 변수는 새로 생성된 변수이고
    4. obj 변수에는 tc의 실제 값의 메모리 주소값에 대한 복사가 이루어진다.

    이해는 한 듯한데, 하나 궁금한 것은 왜 자바가 이런식으로 구현되었을까 하는 점이네요..
    이렇게 함으로써 얻는 장점이 있을텐데 말이죠.

    잘보고 갑니다.

  13. Blog Icon
    개발 종사자

    8년전 글이네요.
    작성자분도 그만큼 경험이 생기셨으니 이제는 이해하시겠지만 몇 자 적어봅니다.
    자바의 기본동작이 PBV니 PBR하는 글은 이미 수도없이 바왔습니다.
    실재로 많은 전문가들이 PBV라고 확인했기에 이에 토를 달고 싶지는 않네요.
    그런데 자바를 실재로 사용해보면 PBR처럼 동작하는 경우를 많이 보 실 수 있습니다.
    이상하지요.(ㅎㅎ웃음) 네 저도 이상하다고 생각합니다. 어던 메카니즘으로 움직이길래 이럴까요?
    솔직히 저도 잘 모릅니다. 다만 오브젝트를 상속받은 객체들에게서 자주 보입니다.
    이제는 동작방식을 놓고 싸우지 마시고 자바의 동작원리를 이해하시면 됩니다.
    primitive 타입의 변수와 immutable 객체들은 실 데이터들을 직접 가지고 있는 녀석들이죠.
    다른 데이터를 할당하면 객체가 새로 생성되어버립니다. 이전의 값들은 어딘가에서 떠돌다가 GC에 의해서 사라져버립니다.
    list나 map같은 주소를 기반으로 동작하는 객체들은 좀 다릅니다.
    변수의 목적이 값을 저장하기 위함인데, 제 생각으로는 값을 저장하기 위한 목적 보다는 값들을 저장하거나 또는 값들간의 관계를 연결하기 위함이라고 생각합니다.
    때문에 위와같은 객체들은 PBR처럼 보입니다. PBR이라고 생각해도 됩니다. 프로그래밍을 해보면 그렇게 동작하거든요.
    각 변수들이 동작하는 방식을 이해하고 적당한 방법으로 그것을 사용할 줄 아는게 더 중요하다고 생각합니다.
    어차피 PBV, PBR 개념을 알고 그에 맞게 사용하면 되는거고, 각 변수들이 어떤식으로 동작하는지 알면 되는겁니다.

  14. 지나가던 신입개발자인데, 많은 토론이 오고가는것 같아 답글 남겨봅니다.
    우선 위에서 정리되었듯 자바는 CBV가 맞습니다.
    다만, Call By Reference 처럼 동작한다고 여겨지는 이유는, 객체의 값에 대한 복사가 아닌 참조변수의 값에 대한 복사가 이루어지기 때문입니다.
    위 코드를 예시로 들자면 tc라는 참조변수는 "tc가 참조하는 객체의 주소"를 stack 에 저장합니다. 그리고 이 저장된 "객체의 주소값" 또한 stack 에서의 주소를 가지게 되죠.
    ("stack 에서의 주소", "tc가 참조하는 객체의 주소") 를 ("tcRef", "rValue")라고 부르겠습니다.
    이때 이 tc를 함수의 인자로 넘겨주면, 우선 tcRef를 통해 stack 에 접근합니다, 이때 rValue를 얻게되는데요. 이 rValue라는 값을 복사한 뒤, changeObject의 인자인 obj로서 할당합니다. 즉 obj라는 참조변수가 생기고, 이 참조변수는 똑같이 rValue를 값으로 하여 stack 에 저장됩니다. 즉 ("objRef", "rValue")형태가 새로 생기는거죠.

    그렇기때문에 결과적으로 obj와 tc는 같은 인스턴스를 참조하는 서로 다른 두 참조변수가 되는 것 입니다.

    윗분중, 이를 CBV라고 칭할 경우 C언어도 CBV에 해당하는지에 대해 의문을 제기해주신 분이 계셧는데요.
    C언어는 포인터를 통해 tc 라는 참조변수에 대한 주소값, 즉 tcRef 자체를 인자로서 넘길 수 있습니다. 이때 포인터 형식 즉 주소형식으로 보낼 수 있기 때문에 CBR이라고 칭하는 것 입니다.

    Java에서는 소스코드상에서 C의 포인터처럼 실제 stack의 메모리값을 변수로서 저장하거나(*) 이 값을 통해 메모리에 저장된 값을 가져오기 (&)어렵습니다. (적어도 제가 아는 방법중에서는 없어요. reflection 쪽 기술중에 있을 수 도 있어서 확실친 않습니다.)

    따라서 Java가 자연스럽게 CBV방식을 따르게 되었다 라고 인지하시면 될 것 같습니다.

    이미 어느정도 정리된 토픽에 많이 늦게 참여하는듯 해서 조심스럽네요. 다들 추운 겨울따뜻하고 좋은 하루 보내시길 바라며 글을 마칩니다.

제 10회 자바 개발자 컨퍼런스

올해로 10번째를 맞이하는 한국 자바 개발자 컨퍼런스.
해를 맞이할수록 강의 내용도 알차지고, 진행도 매끄러워지는걸 느낀다.
그에 반해 올해는 어쩐 일인지 참관자 수가 그 어느 해보다 적은 것 같다. 재작년의 절반정도일까..?
불과 이삼 년 전만 해도 북적거렸는데.. 올 핸 조용하고 차분한 느낌.
뭐, 북적대는 것보단 이편이 훨씬 좋긴 하지만 주최 측인 JCO나 협찬 기업의 느낌은 좀 다르겠지?
이것도 다 어수선한 시국탓인가....?

2009/02/28 19:35 2009/02/28 19:35
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 2009/03/01 01:15
    2009 자바 개발자 컨퍼런스 후기 Tracked from cutewebi 희정냥★
  2. 2009/03/03 01:41
  1. 다녀오셨군요. 전 업무 문제도 있고, 이번 컨퍼런스 운영이 영 맘에 안들어서 포기.

    아마도 올해 한산할 정도로 사람이 없다고 느끼셨으면 저같은 생각을 한 사람이 많아서 일거예요.
    선착순 세션 예약제라는게 예약에 성공한 사람은 좋지만 그렇지 못한 사람은 사전 등록을 하던 말던 결국 현장에서 전쟁을 치러야 하니까 아예 포기하게 되는거죠.쩝.

    올해 듣고 싶은 세션이 몇 개 있었는데 사전 등록하러 가보니 이미 예약은 다 차고, 그렇다고 사전등록했다고 해서 이점이 있는것도 아니고... 작년처럼 전쟁통에 끼어들기 싫어 깔끔히 포기했습니다.
    내년에는 얼마나 바뀔지 두고봐야죠.

  2. Blog Icon
    서비

    그런일이 있었던겨?
    나도 사전 예약 소식을 늦게들어서 신청할땐 듣고싶었던게 하나도 남지 않았었거든..
    이희승씨의 네트워크랑 최철우씨의 Hudson 강의를 듣고 싶었는데..
    우습게도 현장에서는 참관자가 적어서 사전 예약이랑 상관없이 듣고 싶은강의 다 볼 수 있었다는...

스트럿츠 2.1 릴리즈!! Committer 인터뷰

스트럿츠 2.1.이 릴리즈 되었습니다. 요즘 MS쪽 어플리케이션 개발 프로젝트를 하고있지만 여전히 자바쪽 흐름을 읽는것도 게을리 하고 있지 않습니다만, 쉽지 않네요.

스트럿츠 2.1은 많은 양의 코드를 Plug-In Framework로 옮기는 리펙토링, Convention plug-in에 의한 XML 설정 감소, 향상된 REST 지원에 초첨을 두고 진행되었습니다.

InfoQ에서 스트럿츠2 커미터인 Musachy Barroso씨와 인터뷰한 기사가 올라와서 포스팅 합니다.

2.0과 2.1의 차이점은 무엇인가요?
많은 수의 버그픽스가 있었습니다. 그리고 REST, Convention, Java Template과 같은 플러그인이 추가되었습니다.

많은 기능이 플러그-인 형태로 변경되었습니다. 이렇게 한 이유는 무엇인가요?
스트럿츠 코어에는 진정한 core만을 남기자는 아이디어에서 출발했습니다. 그리고 나머지는 플러그인에 집어 넣는거죠. 이렇게 하면서 코드의 유지보수가 쉬워 졌습니다. 그러면서 Dojo 플러그인 같은 것들은 더 이상 스트럿츠에서 지원하지 않습니다. 이런 변화는 제거된 플러그인을 사용하지 않는 개발자와 작은 footprint를 원하는 개발자 이외의 사람에게 직접적인 장점은 없습니다.
 
Ajax 태그를 depreciate 한 이유는 무엇인가요?
Struts2의 ajax 태그는 Dojo 0.4.x에 기반하고 있습니다. 그것을 Dojo의 최신버전에 맞춰 포팅하는것은 모든 ajax 태그의 코드를 다시 작성해야한 다는것과도 같은 이야기입니다. Dojo의 새로운 버전은 너무 빨리 출시되고 마이너 버전에서도 변경되는 코드의 양이 너무 많습니다. 태그가 Dojo의 모든 기능을 다 포함하고 있지 않기때문에 개발자는 주로 Dojo 라이브러리를 직접 사용하는 경향이 있습니다. 이런 이유들과 ajax 태그 개발 지원자의 부족으로 ajax 태그를 depreciate 했습니다.

어떤 이유로 CodeBehind 플러그인들을 Convention 플러그인으로 바꾸게 되었나요?
Convention은 외부 프로젝트였고 늦게 Struts에 추가되었습니다. Convention은 좀 더 빠른 ClassPath Scanner, 더 나은 Configuration elements, 로깅, 다양한 configuration 옵션, configuation reloading, 더 나은 문서화 등을 지원합니다.

Java Template 플러그인은 무엇인가요?
Java Template은 FreeMarker를 이용하여 java만으로 구현한 'simple theme' 구현체입니다. 이 플러그인의 태그는 재작성이 불가능한 약점이 있는 원래의 그것보다 4~5배 가량 빠르게 동작합니다.

다른 많은 Web Framework가 있는데 우리는 왜 Strtus2를 선택해야 하나요?
스트럿츠2는 아마도 가장 약한 커플링(loosely-coupled)으로 구현된 프레임워크일 겁니다. 많은 기능이 커스터마이징 없이, 혹은 약간의 커스터마이징만으로 사용할 수 있으며, 프레임워크를 익히기가 쉽습니다. 약한 커플링은 스트럿츠의 실체에 대한 지식 없이도 비지니스 로직을 작성 할 수 있도록 해 줍니다. 그러면서도 스트럿츠는 대용량 트래픽을 발생하는 사이트에서 유연한 확장성을 담보하고 있다는 점입니다.

마지막으로 한마디.
스트럿츠 2.1 출시까지 오랜 기간 공을들였습니다. 우리는 스트럿츠 프레임워크의 빌드와 릴리즈 프로세스 개선을 위해 정말 열심히 일하고 있습니다. 앞으로는 좀 더 짧은 주기로 새로운 버전이 릴리즈 되는것을 기대하셔도 좋습니다.
2009/02/03 16:37 2009/02/03 16:37
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Java VisualVM

dev.java.net에 등록되어있는 VisualVM이라는 자바 프로라일러. 넷빈즈에 기본 포함된 프로파일러의 stand alone
버전인지 VisualVM을 넷빈즈 프로파일러로 집어 넣은건지는 잘 모르겟지만 UI나 기능이 거의 비슷.

아래 소개영상을 보고 마음에 든다면 https://visualvm.dev.java.net 에서 더 많은 정보를 접하실 수 있습니다.
http://java.sun.com/javase/6/docs/technotes/guides/visualvm/index.html 에는 튜토리얼과 개발자를 위한
Document가 준비되어 있습니다.

2009/01/19 02:06 2009/01/19 02:06
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

java.beans.XMLDecoder와 java.beans.XMLEncoder를 이용한 Java객체의 xml 변환

자바 객체와 XML간의 변환에관해서는 몇 가지 라이브러리들이 존재하고 있습니다만 이번 시간에는 Java SDK에
기본으로 포함되어 있는 java.beans.XMLDecoder와 java.beans.XMLEncoder를 이용하여 자바객체<->XML간
변환 방법을 알아보겠습니다.

java.beans.XMLDecoder와 java.beans.XMLEncoder클래스는 J2SE 1.4 버전부터 이용할 수 있습니다.

우선, XML로 변환하고 XML로부터 복원할  적당한 자바 클래스를 작성합니다.
[code]
/*
 * Setter와 Getter를 가진 전형적인 JavaBean 클래스입니다.
 */

package com.yunsobi.beanxmltranslate;

import java.awt.Point;
import java.util.ArrayList;

/**
 *
 * @author 신윤섭
 */
public class SampleBean {
    private int[] scores;
    private String name;
    private Point seat;
    private ArrayList entry;

    public int[] getScores() {
 return scores;
    }

    public void setScores(int[] scores) {
 this.scores = scores;
    }

    public String getName() {
 return name;
    }

    public void setName(String name) {
 this.name = name;
    }

    public Point getSeat() {
 return seat;
    }

    public void setSeat(Point seat) {
 this.seat = seat;
    }

    public ArrayList getEntry() {
 return entry;
    }

    public void setEntry(ArrayList entry) {
 this.entry = entry;
    }

}

[/code]
보시면 아시겠지만 int 배열과 String, Point, ArrayList 객체를 갖는 전형적인 자바빈 객체 하나를 만들었습니다.

이제, 이 SampleBean 클래스를 xml로 변환하고 변환한 xml로 부터 SampleBean객체를 복원하는 코드를 작성합니다.
[code]
/*
 * java.beans.XMLDecoder와 java.beans.XMLEncoder는
 * Java객체를 XML로
 * XML에서 Java 객체로 변환하는 쉬운 방법을 제공 합니다.
 */
package com.yunsobi.beanxmltranslate;

import java.awt.Point;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;

/**
 *
 * @author 신윤섭
 */
public class BeanXmlTranslator {

    public static void main(String args[]) throws Exception {
 
 //xml로 변환할 클래스를 생성
 SampleBean sample = new SampleBean();
 //파라메터를 세팅해 봅시다.
 sample.setScores(new int[]{100, 90, 75}); //int[]
 sample.setName("Gore"); //String
 sample.setSeat(new Point(5, 3)); //java.awt.Point
 //ArrayList에 String과 Point도 넣어보구요..
 ArrayList entry = new ArrayList();
 entry.add("우리는");
 entry.add("하나다");
 entry.add(new Point(1,1));
 sample.setEntry(entry);
 
 //자.. 객체를 XML로 변환 시킵니다.
 XMLEncoder encoder = new XMLEncoder(
     new BufferedOutputStream(
     new FileOutputStream("C:\\Sample.xml")));
 encoder.writeObject(sample);
 encoder.close();
 //객체 레퍼런스를 찍어보구요..
 System.out.println(sample);
 
 //이젠 XML에서 객체로 복원시켜 봅니다.
 XMLDecoder decoder = new XMLDecoder(
     new BufferedInputStream(
     new FileInputStream("C:\\Sample.xml")));
 SampleBean sample2 = (SampleBean) decoder.readObject();
 decoder.close();
 //객체 레퍼런스를 찍어보구요..
 System.out.println(sample2);
    }
}

[/code]
예.. 변환의 핵심은 XMLEncoder 클래스의 writeObject() 메소드와 XMLDecoder  클래스의 readObject() 메소드
에 있습니다.

객체를 xml로 변환한 결과를 한번 볼까요?
[code]
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.5.0_13" class="java.beans.XMLDecoder">
 <object class="com.yunsobi.beanxmltranslate.SampleBean">
  <void property="entry">
   <object class="java.util.ArrayList">
    <void method="add">
     <string>우리는</string>
    </void>
    <void method="add">
     <string>하나다</string>
    </void>
    <void method="add">
     <object class="java.awt.Point">
      <int>1</int>
      <int>1</int>
     </object>
    </void>
   </object>
  </void>
  <void property="name">
   <string>Gore</string>
  </void>
  <void property="scores">
   <array class="int" length="3">
    <void index="0">
     <int>100</int>
    </void>
    <void index="1">
     <int>90</int>
    </void>
    <void index="2">
     <int>75</int>
    </void>
   </array>
  </void>
  <void property="seat">
   <object class="java.awt.Point">
    <int>5</int>
    <int>3</int>
   </object>
  </void>
 </object>
</java>

[/code]
객체의 타입과 할당된 값이 깔끔한 xml문서로 작성된것을 확인 하실 수 있습니다.

자바에는 객체 직렬화(Serialize) 란게 있지요..
위 XMLDecoder와 XMLEncoder가 직렬화 기능을 이용하는건지 아닌지 확인 해 볼까요?
가장 정확한 방법은 XMLDecoder와 XMLEncoder의 소스를 보는것이겠지만 이미 위 예제 소스만으로도
충분히 예상 하실 수 있습니다. 위 예제의 SampleBean 이 Serializable 하지 않음에도 xml문서로 생성되었습니다.
예.. XMLDecoder와 XMLEncoder 내부적으로 java Reflection을 이용하여 xml, 객체간 변환을 수행하고 있습니다.

java Reflection을 이용한다고 했습니다. 이는 getXXX, setXXX 메소드가 없다면 해당 변수를 xml로 만들어내지
못하고 객체로 복원해 내지도 못함을 의미합니다.

또 하나, XMLEncoder를 통해 변환된 xml은 문서의 형태로 보아도 외부 시스템과의 정보의 교환보다는
객체의 상태저장/복원을 목적으로 사용하는게 더 어울릴거란 생각이 드네요.

2009/01/08 21:01 2009/01/08 21:01
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Java 7 로드맵 업데이트와 커뮤니티의 반응.

2009년 12월 수정 : Java 7에 클로저를 도입하기로 했네요.( http://www.yunsobi.com/blog/513 )

2010년 초반 출시를 목표하고있는 Java 7의 기능을 Java SE의 수석 엔지니어 Mark Reinhold가 Devoxx에 게시한 이후 여러 반응이 나오고 있습니다. 비록 그의 발표가 완전히 결정나지 않은 사항에 대한 잠정적인 내용이라곤 해도 커뮤니티 - 특히 클로저(Closure)의 누락을 주시하는 - 의 반응은 대단합니다.

Mark의 소식을 전한 Hamlet D'Arcy는 그의 블로그에 Java 7 Update from Mark Reinhold at Devoxx란 제목으로 Devoxx에 발표한 Java 7 중요한 새로운 기능을 요약해 올렸습니다.
모듈화 - JSR-294와 Project Jigsaw.
JSR 292 - JVM의 dynamic language 지원
JSR 203 - 진정한 비동기 I/O( non blocking I/O가 아닌)로 구현되는 더 새로워진 I/O API
JSR TBD - 아래에 기술하는것 같은 약간의 언어적 변화
   - 안전한 rethrow
   - Null dereference 표현식 : '?' 신택스를 이용한 Null 체크
   - 향상된 타입 추론
   - Multi-catch : catch 절에 ','를 이용하여 다수의 Exception 기술
JSR 296 - 스윙 어플리케이션 프레임워크
6u10 기능들의 개선(자바 커널, 퀵스타트,플러그인 등)

위 내용과 함께, 심사숙고했지만 Java 7에 포함되지 않을 몇몇 기능도 언급했습니다.
Closure - 의견을 통일하지 못해서.
구상화 제네릭 ( Reified generics )
퍼스트 클래스 프로퍼티
연산자 오버로딩
BigDecimal Syntax
JSR 295 - Beans Binding

이에대해 Java.net 에는 "Java 7에서 제외된 아래 기능 중 당신이 가장 관심을 두고 있는것은 무엇?"이란 주제로 투표가 진행되고 있습니다.
Java 7 and closure

많은 이들이 Closure의 부재에 대해 관심을 갖고 있군요.


Ricky Clarkson같은 사람은 극단적으로 Closure없이는 자바는 죽을 것이라고까지 표현하고있습니다.
So it's confirmed. Despite James Gosling wanting closures, despite 3 working closure prototype compilers, despite every other JVM language supporting closures, Java 7 will not have closures.
Martin Kneissl 역시 Java7에 Closure가 빠진것을 아쉬워하는 사람 중 하나입니다.
It should have closures instead of the new style "for" loop added in Java 5. It should have closures in Java 6. Now it seems that it will not get closures in Java 7. Closures are not that difficult to understand. At least when you compare them to anonymous inner classes in Java. Others disagree. I don't follow the reasoning of the closure opponents when they say that because there are stupid Java programmers out there you should limit the Language trying to prevent them from doing too much harm. That's just impossible. Incompetent programmers will shoot themselves in the foot in any language. Fortunately there are other languages on the JVM that can use the real strength of Java: libraries, portability, and (to some extent) tooling.
이 외에도 정말 많은 개발자들이 자바언어의 Closure 미 지원을 아쉬워합니다.

이번 발표와 커뮤니티의 반응을 통해 너무나 많은 개발자들이 클로저를 원하고 있다는 사실을 알수 있었습니다. 아직 Java 7의 모든 기능 확정되지 않은 상황이기에 커뮤니티의 반응에따라 기능이 추가될 여지도 배제할 순 없지만 개인적으로도 개발의 편의성을 고려하여 언어차원에서 클로저를 지원하면 좋겠다는 생각입니다.
현재 한국 자바 개발 현장에선 1.4가 주류를 이루고 있다고 보여지고 많지 않은 곳에서 1.5 이상이 쓰이고 있는 현실에 비추어보면 1.7이 현장에서 침투하기까진 적지않은 시간이 필요하겠지만요..

Closure에 대해 관심을 갖으신 자바개발자라면 "Neal Gafter의 자바를위한 클로저 프리젠테이션" 을 훑어 보시는것을 추천합니다.
2009/01/05 21:52 2009/01/05 21:52
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 전 자바팬은 아니지만 어째 제가 더 아쉽군요^^

  2. Blog Icon
    서비

    Generics(JSR-14 였었나요?)가 JSR에 올라가서 1.5에 추가되기까지 8년이라는 시간이 걸렸죠.
    기존 코드와의 역방향 호환성을 유지하면서 도입의 영향을 최소화하기 위해 그렇게나 긴 시간을 들여 고민을 한 것인데요.
    클로저를 도입하는데도 저런 긴 시간을 들인다면 그 사이 어떤 전개가 펼쳐질지 궁금합니다.

Servlet 3.0 스펙에 기인한 보안 논쟁

서블릿 API에 근간한 대부분의 자바 웹 어플리케이션 프레임웍은 web.xml파일에 하나 이상의 서블릿, 필터, 리스너 등 웹 어플리케이션에 관계한 설정을 기술해야만 합니다. 의존관계에 있는 WEB-INF/lib 디렉토리의 jar들도 포함해서 말이죠.
EE6의 한 부분을 구성하는 Servlet 3.0 스펙인 JSR-315은 이것을 바꿀 방법을 모색하고 있습니다. 서블릿 3.0 스펙은 현재 Public Review 상태이면 그 내용은 아래 링크에서 확인하실 수 있습니다.

JSR-000315 JavaTM Servlet 3.0 Specification

서블릿 3.0 스펙에는 무설정(Zero Configuration) 지향과 이식성(Plugability) 향상을 목표로 다음과 같은 새로운 기능이 추가됩니다.
    1. annotation의 추가 : 서블릿 3.0 스펙에는 서블릿의 url-mapping 정보를 제공하기위한 @Servlet과 같은 수 개의 새로운 어노테이션(@ServletFilter, @FilterMapping 등)이 추가됩니다.
    2. web.xml의 분할(fragments) 설정 지원 : 서블릿 정의, 필터 혹은 리스너 등을 각각 지정한 설정 파일을 web.xml에 merge하는 방식을 채택해 개개의 웹 프레임워크 jar 파일들의 각자 고유한 설정을 가질 수 있도록 하였습니다.
Flag(metadata-complete)는 annotation과 fragment 모두의 스캐닝을 제어하는데 이용됩니다.

위와 같은 사양 추가로 인해 원치않는 서블릿이나 필터들의 배포로 야기될 수 있는 보안 위협에 Expert Group내에서도 적지않은 논쟁을 펼치고 있습니다. 물론, 그런 보안 위협은 제거할 수 있을만큼 충분히 유연하다는 의견도 만만치 않구요.
이에 대한 Expert Group의 잠정적인 결론은 커뮤니티의 피드백을 받아보자는 쪽인것 같습니다.

Greg Wilkins는 Automatic Scanning 과 분할된 설정파일의 merge를 예로든 그의 글을 통해 <include>라는 옵셔널 엘리먼트를 추가하는 방식을 제안했습니다.
"Without a web.xml or with a 3.0 web.xml that does not list any inclusions,
the default would be to search all of WEB-INF for annotated servlets and filters,
TLD listeners and web.xml fragments as currently proposed. If however,
a web.xml contained <include> element, then the discovery process would be
modified as the following examples illustrate:
<include src="WEB-INF/lib/dwr.jar"/>
<include src="WEB-INF/lib/cometd.jar"/>
<include src="WEB-INF/classes"/>
This include would scan only the dwr.jar and cometd.jar for annotations,
TLD fragments and web.xml fragments, the WEB-INF/classes directory would be scanned for
annotated servlets. No other jars or classes would be scanned unless listed in their
own include elsewhere in the web.xml."
Specification 리더중의 한 명인 Rajiv Mordani는 위와 같은 방법에 놀랍긴 해도 수긍할 순 없다고 하네요.
"Greg Wilkins의 제안하는 방법은 의도하지 않은 서블릿과 필터들이 노출되는 것을 우려하는
곳에나 먹히는 매우 특별한 경우로 그것은 프레임워크 개발자의 문제이며 특정 컴포넌트를
노출하지 않기를 원하는 이용자의 문제는 아니라고 생각한다. 이런 경우라면 flag를 이용하여
jar의 집합으로부터 효율적으로 스캐닝을 컨트롤 할 수 있다."  

다른 두 가지 가능성에 대해 올해 Java One Conference에서 Expert Group 사이에서 논의가 있었습니다.
한 가지 방법은 web fragments와 annotations의 스캐닝 여부를 활성화(enable/disable)하는 두 번째 flag를
metadata-complete에 추가하는 방법이 있겠습니다.
Rajiv Mordani의 요지는 어노테이션 메카니즘은 이미 web.xml 파일의 설정을 상속받을 수 있도록 구현 되었기
때문에, 이런 방법을 통해서도 원하는 수준의 제어가 가능하다는 것입니다.
"When you use annotations to declare servlets and Filters then you must have a url-mapping
/ FilterMapping attribute on the corresponding servlet / Filter.
In this way there is no convention by which a servlet is exposed without having an explicit mapping.
Also, as with the rest of the Java EE platform, specifically technologies like EJB and Web Services,
the deployment descriptor is used to override information that is specified via annotations....
If you didn't want any of the annotations to be processed at all by the container and wanted to specify
all the configuration via the deployment descriptor, then, like with the rest of the Java EE 5 platform,
we have the metadata-complete element in the descriptor. If the element is present and set to "true" then
the container will not process any annotations and just use the configuration specified in the descriptor.
This provides a way [to] disable the auto-scanning for those that have concerns about performance,
and security.”

마지막 방법은 아래와 유사한 방식으로 서블릿과 필터를 무효화하는 메카니즘을 web.xml에 기술하자는것
<servlet>
      <servlet-name>FrameworkServlet</servlet-name>
      <enabled>false</enabled>    
</servlet>
등이 있습니다.

해당 이슈에 관심이 있거나 feedback을 원하는 분은 jsr-315-comments@jcp.org으로 의견을 보내실 수 있습니다.
2008/12/29 15:05 2008/12/29 15:05
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. Blog Icon

    서블릿 3.0에서 서버 푸쉬를 지원한다고 하던데 요런 이슈도 있었군요~
    건강 꼭 챙기시공 조만간 뵈용 ㅋㅋ

Java Blueprints web application layout 과 Jakarta web application layout의 차이

** 본 포스팅은 2006년 12월 20일 네이버 블로그에 포스팅한 내용을 백업, 내용을 보강한 것입니다. **

자바 진영에서 웹어플리케이션(jsp,servlet,jsf,struts,webwork 등을 통틀어)을 구성하는데는 크게 두가지의 표준디렉토리 레이아웃이 존재한다.
( 모든 웹 프로젝트가 표준을 따르는것은 아니며 각각의 프로젝트마다 달라질 수있다. 여기서는 두 표준이 제시하는 디렉토리 레이아웃을
살펴보고자 할 따름이다.)

하나는 SUN에서 내 놓은 JAVA Blueprint, 나머지 하나는 자카르타 프로젝트이다.
두 레이아웃의 차이는 아래 다이어그램으로 표현 할 수 있다.

java blueprint web application layout 과 jakarta web application layout의 차이


주황색으로 구분지어 놓은 부분이 두 구성간의 디렉토리 차이이다.

J2EE 환경을 구축하기 위해선 Java Blurprint 형식의 레이아웃이 더 알맞은 형식이라 생각한다.
netbeans 에서 웹 어플리케이션 프로젝트를 생성 하면 위의 두 형식의 표준을 모두 지원한다.
메뉴 -> File -> New Project... -> 프로젝트 카테고리에서 Web 선택 -> next 하면 아래와 같은 대화창이 뜬다.

넷빈즈에서 웹어플리케이션 레이아웃 선택 옵션


붉은 색 박스 안과 같이 두 양식 중 하나를 선택 할 수 있으며 이 두 양식의 선택에 따라 아래와 같은 표준 레이아웃으로 프로젝트가 생성 된다.
(추가 : 현재의 넷빈즈는(버전 6.0이상) 위와 같은 옵션이 사라지고 Java BluePrints형식에 맞추어 디렉토리가 설정됩니다. )

웹어플리케이션간 디렉토리의 차이


맨 위 디렉토리 형식에 추가하여 nbproject 와 test 디렉토리가 추가로 생성 되는데 nbproject에는 해당 웹 프로젝트에 대한 메타 데이타와
build.xml에 기술 되어야 할 앤트 스크립트의 실제 내용이 배치되며, test 디렉토리에는 test용 클래스등을 구성 할 수 있는 디렉토리로 존재하게 된다.

* MANIFEST.MF ?
Executable JAR 파일을 생성 할 때 main 클래스를 지정 하게 되는데
이 내용을 기술 하는 텍스트 파일이다.

그 기술 내용은

Mainfest-Version: 1.0
Main-Class: [filename] (.class 없이)
Created-By: [생성자 정보] (필요한 내용을 자유롭게 기술...)

이며 
실행은 콘솔에서
java -jar jarfilename.jar [엔터]
혹은 jre 가 설치 되었다면  jar 파일을 더블클릭 하는것으로 실행이 가능하다.

2008/12/23 11:14 2008/12/23 11:14
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

자바 제한자 정리 : Modifires Matrix in Java

자바를 입문하면 가장 처음에 다루는 것중 하나인 제한자를 정리하는 차원에서 각 제한자별로 사용가능한 곳과 그렇지 않은 곳을 구분해
일람을 작성해 봤습니다. 흔히 접하는 접근 제한자 외에도 잘 사용하지 않는 native라던지 strictft 같은 제한자도 함께 표기합니다.

대상 변수 메소드 생성자 클래스 인터페이스
제한자 외부 내부 외부 내부
abstract X O X O O O O
final O O X O O X X
native X O X X X X X
private O O O X O X O
protected O O O X O X O
public O O O O O O O
static O O X X O X O
synchronized X O X X X X X
transient O X X X X X X
volatile O X X X X X X
strictfp X O X O O O O


제한자 사용 규칙 ( 곰곰히 따져보면 아래 룰과 같이 될 수 밖에 없습니다.)
 - 메소드는 public, protected, private, default 중 오직 하나의 접근 제한자를 갖습니다.
 - 클래스는 abstract와 final을 동시에 지정할 수 없습니다.
 - abstract 메소드는 private, static, final, native, strictfp, synchronized 중 어떤 제한자도 사용할 수 없습니다.
 - 메소드는 native, strictfp를 동시에 지정할 수 없습니다.
 - abstract와 native 메소드는 body를 갖지 않습니다.
     예) abstract void someMethos();
     예) native void someMethos();
 - abstract 메소드를 갖는 클래스는 해당 abstract메소드를 구현해야만 합니다.
 - final 변수는 volatile일 수 없습니다.

java_langspec-3.0.pdf

Java Language Spec 3.0




위와 관련한 Sun의 공식 문서는 아래 url에서 참조하실 수 있습니다.
 Java Language Specification SE 3.0
  final Variables
  Class Modifires
  Field Modifires
  Constructor Modifires
  Interface Modifires
  Evolution of Classes
  FP-strict Expressions
2008/12/15 18:32 2008/12/15 18:32
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

넷빈즈 6.5 출시 (NetBeans 6.5 released)

주말사이 넷빈즈 6.5 버전이 출시되었습니다.
넷빈즈 릴리즈 페이지에서 이야기하고 있는 6.5버전 하이라이트는 아래와 같습니다.
자바 이외의 언어 지원 강화에 역점을 둔 느낌입니다.
아래 소개하고있는 기능들과 더불어 넷빈즈 6.5에서 지원하는 모든 기능 목록은
http://www.netbeans.org/features/all.html 에서 확인하실 수 있습니다.

NetBeans 6.5 download : http://www.netbeans.org/downloads/index.html

Feature Highlights

PHP

  • PHP Editor (Code completion, syntactic and semantic code highlighting)
  • Support for heredoc notation and PHTML
  • Debugging using Xdebug
  • Generators for MySQL database code snippets
PHP Code Completion

JavaScript and Ajax

  • JavaScript Debugging on FireFox & Internet Explorer
  • HTTP transaction monitoring
  • Improved JavaScript and CSS Editor
  • JavaScript Library Manager incl Yahoo UI, Woodstock, jQuery, Dojo, Scriptaculous, Prototype libraries
JavaScript quickfixes popup in the editor

Java EE & Web Development

  • Enhanced support for Spring, Hibernate, JSF, JSF CRUD generator, JPA (Java Persistence API)
  • Create RESTful web services from database tables or from JPA entities
  • Drag and drop SaaS services into PHP files
  • SQL Editor Improvements (code completion, save/recall queries, and more)
  • Improved Eclipse project import and synchronization for Java Web projects
  • Automatic Deploy on Save
web application persistence

JavaFX

  • Create, test, debug, profile, and deploy JavaFX projects
  • JavaFX editor with syntax highlighting, source navigation, code completion, code folding, javadoc pop-ups, and error detection.
  • Live preview of visual elements
  • Code snippet palette for transformations, effects and animations
javafx video cube

Groovy and Grails

  • Develop pure Groovy apps or use Groovy in Java SE projects
  • Groovy editor with code completion, highlighting, and more
  • Grails web application framework
  • Open existing Grails applications without adding metadata
Groovy code editor

Ruby and Rails

  • New Test Runner interface for displaying test results
  • Rake improvements: Rake Runner and a pre-generated Rake file
  • Debugger: Conditional breakpoints and catchpoints
  • Ruby projects accept JVM options from command line
Ruby code editor

GlassFish v3 Prelude for Web Development

  • Modular, OSGi based architecture
  • Small footprint, fast startup and deployment
  • Support for scripting, including JRuby
glassfish app server

C/C++

  • Improved code completion, error highlighting, and semantic highlighting
  • Call graph, Memory window
  • Remote development
  • Packaging of application as tar files, zip files, or SVR4 packages
Call graph

Java ME

  • New project wizard for adding custom components to the Visual Designer Palette
  • New SVG UI components in the enhanced SVG Composer enable rich UI design
  • New Data Binding Custom Components in the Visual Designer Palette
  • Upgraded obfuscation tool to ProGuard 4.2 and test framework to JMUnit 1.1.0
Java ME SVG palette

Java Debugger

  • New multi-threaded debugging with improved UI and work-flow
  • Smart Step Into with method selection right inside expression
  • Deadlock detection with visual indication
swing treemodel view editor

Java SE

  • Automatic Compile on Save
  • Improved Eclipse project import and synchronization
  • Java Call Hierarchy
  • Analyze Javadoc
  • Swing GUI Builder can generate simple or fully qualified class names
swing treemodel view editor

IDE Tools and Usability

  • CamelCase code completion
  • Customize formatting settings per project
  • One IDE-wide QuickSearch shortcut for files/symbols/types, IDE actions, options, and docs
  • Support for Windows UNC paths (shared network folders)
netbeans ide quicksearch



2008/11/23 03:28 2008/11/23 03:28
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 2008/11/27 02:46
    드디어 NetBeans 6.5 정식 릴리즈 Tracked from Alchemize Your Self

객체 지향론자를 위한 함수 프로그래밍(Functional programming)


어제 포스팅한 Java 개발자 입장에서 바라본 .Net의 Delegate란 글에 daybreaker님께서 주신 댓글을 통하여
함수형 프로그래밍을 다시 한번 생각해볼 기회를 가질 수 있었습니다.

자바스크립트, php등이 단순 '스크립트 언어'라는 오명을 떨쳐내기위해 OO적 개념을 받아들이고있는 것과는
대조적으로 기존 OO언어들이 옜 언어들이 가지고 있던 함수형 프로그래밍 기법을 수용하고 있는게 재미있네요.

자바 개발자가 함수형 프로그래밍의 맛을 느껴볼 만 한 aticle이 있어 링크 걸어 봅니다.
함수 프로그래밍 기술을 사용하여 고급 JavaScript 작성하기
객체 지향론자를 위한 함수 프로그래밍 (IBM Developer Works)
자바를 이용한 함수 프로그래밍(Functional programming)

덧. .Net Framework의 클래스 인스턴스에 메소드 붙이기 기능도 참 당황스러웠는데,
이건 다음 기회에 이야기해 보도록 하겠습니다.

2008/11/19 17:32 2008/11/19 17:32
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 2010/07/28 11:58
    [소프트웨어공학] 객체지향이란? 객체지향 정리 (OO - Object Oriented Summary) Tracked from 월풍도원(月風道院) - Delight on the Simple Life.

Java 개발자 입장에서 바라본 .Net의 Delegate


지난 수년간 JAVA로 개발을 해 오다 작년부터 필요에의해 MS의 .Net Framework와 C#으로 프로젝트를 진행하고 있다.

.Net Framework와 C#이란 언어를 다루면서 처음으로 접한 문화 충격이라면 Property와 Delegate일 거다.
MS진영 개발자라면 당연한것으로 받아들이고 있을 두 개념을 처음 접했을때의 신선함이란!

자바 개발자들을 위해 간략하게 첨언하면
.Net에서 이야기하는 Property란 java 세상에서는 쉽게말해 getter와 setter에 해당하는데 요걸 코드로 표현하는 방법이 재미있다.
(물론 이 property란게 코드의 표현이 재미있다의 수준에서 그치는 건 절대 아니다.)
그리고 .Net에서 이야기하는 Delegate는 메소드 레퍼런스의 OOP적인 Wrapper이다.
이 Delegate란게 Java언어에서도 구현은 할 수 있지만 .Net에서와 같은 우아한 코드로 표현되진 않는다.
( Java는 OOP 개념으로 접근하여 교과서스럽게 코드로 표현하기 때문일거다..
여튼 Java에서는 없는 개념이라고 맘편히 생각해도 되겠다. )

뭐? '메소드 레퍼런스의 OOP적인..'이 어쨌다고? 문자로 표현하니 뭘 이야기하는 건지 금방 못알아듣겠지만 개념이 그렇다.
(C의 표현을 빌자면 '함수의 포인터' 정도로 불릴 수 있겠다.) 나 역시 코드를보고서야 위 말의 의미를 알 수 있었으니까..

풀어 말하자면 클래스 인스턴스의 레퍼런스를 다른 클래스 인스턴스의 메소드에 전달하는것과 마찬가지로
메소드의 레퍼런스를 객체 다루듯이 다른 클래스 인스턴스의 메소드에 전달하는것이 가능하다.
놀랍지 않은가? 메소드를 객체처럼 주고 받을 수 있다니!!

이게 사용하다보면 은근히 편하다. Java 세상에선 Callback을 받기위해 자신의 레퍼런스를 넘겨야 가능할 일을
.Net에서는 Callback 메소드를 싼 클래스를 넘겨 버리면 그만이니...

확실히 최근에 나온 언어일수록 개발의 편의성이 높긴하다. Java에도 조금 유연성을 발휘하여 이런 개념을 도입하면 어떨까?
[상업적으로 가장 성공한 OOP언어가 Java가 아니던가. Java에 Generic 개념이 도입되었을때도 자바스럽지
않다며 유난을 떠는 사람들도 많았으니 .net의 delegate 개념을 언어 차원에서 지원한다면 이건 더이상 java가 아니다며
너스레를 떠는 사람이 넘쳐날지도.. ]

2008/11/18 22:42 2008/11/18 22:42
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 결국 그 delegate가 Python 언어의 람다 함수나 Javascript의 익명 함수와 같은 역할을 하죠. 원래 Lisp 같은 함수형 프로그래밍 언어 쪽에서 나온 개념인데 이게 은근 편리(?)하다보니 요즘은 원래 함수형 언어가 아닌 언어에서도 많이 지원하는 추세인 것 같습니다.

  2. Blog Icon
    서비

    예 daybreaker님께서 주신 말씀대로입니다.
    본질을 이해하고나면 표현하는 방법이 무슨 대수겠습니까만은..
    이게 시작을 대중적인 OOP언어로 한 저같은 사람은 생소한 코드
    표기방법과 쓰임에 당황+놀라움을 동시에 경험하기도 한답니다.. ^^

  3. Blog Icon

    자바보다 먼저나온 Delphi 에도 있는기능인데요....

  4. Blog Icon
    김코더

    기능은 앞으로도 나올언어들거 개발되어 배포되는것도 수두룩합니다
    적용시점이 관건이지..

WebRowSet 을 이용한 JDBC 활용하기 4부

ResultSet 가공하기


WebRowSet 클래스의 deleteRow() 메소드를 이용하여 특정 row의 데이터를 삭제할 수 있습니다.
비슷한 방법으로 특정 row의 값을 업데이트 하거나 이동할 수 있습니다.

코드 조각을 보면서 이야기 해 볼까요.
[code]
... ... ...
ResultSet rs =  stmt.executeQuery("select * from student ");
WebRowSet wrs = new WebRowSetImpl();
wrs.populate(rs);
wrs.absolute(1); //첫번째 row로 커서를 옮깁니다.
wrs.deleteRow(); //커서가 위치한 row를 삭제합니다.
wrs.absolute(2); //두번째 row로 커서를 옮깁니다.
wrs.updateInt(4,20);//커서가 위치한 row의 4번째 컬럼 값을 20으로 변경합니다.
... ... ...
[/code]
코드의 처음 세줄은 ResultSet으로부터 WebRowSet을 만들어내고 있으며, 다음 두줄은 ResultSet의 데이터에서
첫번째 Row를 삭제하고 있습니다. 마지막 두줄은 두번째 Row의 4번째 Column값을 20으로 변경하고 있습니다.

위와같은 처리를 거친 결과의 data eliment는 아래와 같습니다.
[code]
 <data>
   <deleteRow>
     <columnValue>200</columnValue>
     <columnValue>Jack</columnValue>
     <columnValue>Dakota</columnValue>
     <columnValue>21</columnValue>
   </deleteRow>
   <currentRow>
     <columnValue>100</columnValue>
     <columnValue>John</columnValue>
     <columnValue>Doe</columnValue>
     <columnValue>26</columnValue>
     <updateRow>20</updateRow>
   </currentRow>
 </data>
[/code]
xml의 결과를 보면 첫번째 row에 대해 <deleteRow> 태그를 이용하여 삭제된 row임을 표시하고
두번째 row에서 <updateRow> 태그를 이용하여 4번째 column이 26에서 20으로 업데이트 되었음을
나타내고 있습니다.



변경사항 Commit 하기


위에 살펴본 과정은 단지 ResultSet의 데이타를 가공했을 뿐으로 commit을 수행하기 전까지는
database에 변경된 값들이 반영되지 않습니다.
변경된 데이터를 database에 적용하기 위해 acceptChanges() 메소드를 이용할 수 있습니다.
[code]
... ... ...
wrs.acceptChanges();
... ... ...
[/code]


다음편에 계속..
2008/11/16 02:22 2008/11/16 02:22
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

SCJP 5.0 인증 시험 시뮬레이터


내가 SCJP (Sun Certified Java Programmer) 시험을 치른 게 2003년이었고 그때는 JDK 1.3을 기준으로 시험을 치렀다..
지금은 JDK 5.0 기준으로 시험을 치를 텐데 SCJP시험 시뮬레이터도 있네?
하긴 뭐  시험관련된 별별 에뮬레이터나 시뮬레이터가 존재하는데.. SCJP라고 별수 있겠어?
워낙 덤프가 판을 치는 나라이고 보니 외국 인증시험을(그것도 낮은 급의) 패스한다고 해서 본인에게
큰 이득이 있는 것도 아니다만...

심심풀이로 라도 자신의 자바 기본기를 확인해 보고 싶은 사람에게라면 도움이 되지 않을까?
시뮬레이터를 배포하는 사이트에서는, 완전 무료에 실제 시험 환경이랑 완전히 똑같은, 이 시뮬레이터를
pass 한다면 실제 시험의 pass를 100% 보증한다고 하니  관심 있는 분들은 한번 들러보자.  

배포 사이트 : http://www.examlab.tk/
SCExamLab.exe

SCJP 5.0 시험 시뮬레이터

2008/11/12 10:50 2008/11/12 10:50
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WebRowSet 을 이용한 JDBC 활용하기 3부

ResultSet 출력하기


자. 이제 위의 예제코드의 ResultSet을 XML데이터로 변형 해 봅시다.
이를 위해 com.sun.rowset.WebRowSetImple 클래스를 이용할 수 있습니다.
위 예제 코드에 몇 라인의 코드를 추가함으로써 result set을 XML 파일로 출력 할 수 있습니다.

[code]
... ... ...
ResultSet rs =  stmt.executeQuery("select * from student");
WebRowSet wrs = new WebRowSetImpl();
wrs.populate(rs);
try {
  wrs.writeXml(
  new FileOutputStream("student.xml"));
} catch (FileNotFoundException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}
... ... ...
[/code]

wrs.writeXML()의 출력형태는 WebRowSet scheme definition. 의 형태를 따르며
출력은 properties, metadata, data의 세 부분으로 구분 되어집니다.
일반적인 출력 레이아웃은 다음과 같습니다.

[code]
<?xml version="1.0"?>
<webRowSet xmlns= "http://java.sun.com/xml/ns/jdbc"
           xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation= "http://java.sun.com/xml/ns/jdbc 
           http://java.sun.com/xml/ns/jdbc/webrowset.xsd">
 <properties>
       ... ... ...
 </properties>
 <metadata>
       ... ... ...
 </metadata>
 <data>
       ... ... ...
</data>
</webRowSet>
[/code]

<properties> 태그는 provider( isolation leve, RowSet type 등)를 의미 합니다. <metadata> 태그는 해당 데이타베이스의 테이블의 갯수, 이름, 컬럼타입 등을 나타내며, 마지막으로 <data> 태그는 해당 테이블의 실제 정보를 기술합니다.

[code]
 <data>
   <currentRow>
     <columnValue>200 < /columnValue>
     <columnValue>Jack</columnValue>
     <columnValue>Dakota</columnValue>
     <columnValue>21</columnValue>
   </currentRow>
   <currentRow>
     <columnValue>100</columnValue>
     <columnValue>John</columnValue>
     <columnValue>Doe</columnValue>
     <columnValue>26</columnValue>
   </currentRow>
 </data>
[/code]

위의 예에서 보이는 <currentRow> 태그는 WebRowSet의 각 Row에 저장되어있는 데이터를 나타냅니다. insert, update, delete같은 데이터 조작은 다음편에서 계속하겠습니다.

2008/11/11 13:03 2008/11/11 13:03
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다