자바에서 메소드 호출할때 매개변수가 call by reference인가요 아니면 call by value 인가요?


저는 콜바이레퍼런스라고 생각했는데 인터넷 보니까 콜바이 벨류라네요. 왜죠?

  • 2016년 01월 05일에 작성됨

조회수 361


1 답변


좋아요
0
싫어요
채택취소하기

자바에서는 콜바이레퍼런스라는 말을 안씁니다. 다 콜바이 벨류에요.

    Dog myDog;

에서 myDog는 사실 Dog가 아니라 Dog의 포인터입니다. 무슨 말이냐면

    public void foo(Dog someDog) {
        someDog.setName("Max");     // AAA
        someDog = new Dog("Fifi");  // BBB
        someDog.setName("Rowlf");   // CCC
    }

라는 메소드가 있고 public static void main(String[] args){ Dog myDog = new Dog("Rover"); foo(myDog);

            if (aDog.getName().equals("Max")) { //true
    System.out.println( "Java passes by value." );

        }else if (aDog.getName().equals("Fifi")) {
    System.out.println( "Java passes by reference." );
               }
    }

라고 했을때

someDog 포인터가 가리키고 있는 주소는 42입니다. 주석 AAA를 보면 주소42에 들어있는 내용중, 이름을 Max로 바꿔줍니다. 이때 main에서 myDog의 이름도 Max로 바뀝니다.

BBB라인을 보면 someDog에 70이라는 주소의 새로운 Dog를 만들어줍니다. 이 Dog의 이름은 Fifi이고 CCC라인에서 70이라는 주소의 Dog의 이름을 Rowlf로 바꿔줍니다.

이때 main의 myDog의 이름도 바뀌었나요? 아닙니다. myDog의 이름은 AAA라인에서 Max로 더이상 바뀌지 않았습니다.

자바는 C에서처럼 메소드에 포인터를 전달하고 포인터가 가리키는 객체의 값을 바꿀수는 있지만 포인터가 가리키는 대상은 바꿀수 없습니다. 그래서 자바는 콜바이벨류입니다.

  • 2016년 01월 05일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close