자바는 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라는 사실을 극명하게 보여줄 수 있겠네요.


////// 테스트용 클래스///////
public class TargetClass {
private String param;

public String getText() {
return param;
}

public void setText(String param) {
this.param = param;
}
}




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

public static void main(String[] args){

CallByValue cbv = new CallByValue();
TargetClass tc = new TargetClass();

tc.setText("처음 입력 값입니다.");

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;
}

}


자바 레퍼런스타입이 정말 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임을 증명하고있네요.

이 글의 관련글
  • 자바 파일복사 코드와 성능 1. :: Java File Copy Code & Perfomance Issue. part 1 (4)
  • 스트럿츠 2.1 릴리즈!! Committer 인터뷰
  • 자바 날짜/시간 계산 예제 코드 :: Java Date Code Snippet (3)
  • SCJP 5.0 인증 시험 시뮬레이터
  • 자바 애플리케이션에서 동적으로 PDF 파일 생성하기
  • 자바 제한자 정리 : Modifires Matrix in Java
  • 넷빈즈 6.5 출시 (NetBeans 6.5 released)
  • java.beans.XMLDecoder와 java.beans.XMLEncoder를 이용한 Java객체의 xml 변환
  • 제 10회 자바 개발자 컨퍼런스 (2)
  • JAVA Base64 Encoding / Decoding
  • JMS ( Java Messaging System ) :: 자바 메세징 시스템
  • 자바 SE 플랫폼 개괄 :: Java SE Platform at a Glance
  • 2009/03/27 21:11 2009/03/27 21:11
    Trackback Address:http://www.yunsobi.com/blog/trackback/480
    1. Blog Icon
      비밀방문자

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

    [로그인][오픈아이디란?]