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

조회수 3610회

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

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)