1) Call by value

메소드에 값을 전달하는 것과 객체를 전달하는 것에는 큰 차이가 있다. 이것은 매우 중요하기 때문에 이전에 잠깐 언급했지만 다시한번 자세히 알아보도록 하자.

 

결론부터 얘기한다면 메소드로 객체를 전달할 경우 객체의 속성 값을 변경할 수 있게 된다.

 

다음의 예제를 보자.

 

Counter.java


class Updator {
    public void update(int count) {
        count++;
    }
}



 


public class Counter {
    int count = 0;
    public static void main(String[] args) {        
        Counter myCounter = new Counter();        
        System.out.println("before update:"+myCounter.count);
        Updator myUpdator = new Updator();
        myUpdator.update(myCounter.count);
        System.out.println("after update:"+myCounter.count);
    }
}

 

Counter 객체 myCounter의 count값을 Updator 객체 myUpdator의 update 함수에 전달하여 count 값을 증가시키려고 시도하는 예제이다.

 

실행 해 보면 다음과 같은 결과 값이 나온다.

 


before update:0
after update:0

 

인스턴스 변수 count의 값을 update메소드에 넘겨서 변경시키더라도 값에 변화가 없다. 그 이유는 이전 챕터에서 알아본 것과 같이 update 메소드는 값을 전달받았기 때문이다.

 

이제 예제를 다음과 같이 변경 해 보자.

 


class Updator {
    public void update(Counter counter) {
        counter.count++;
    }
}






public class Counter {
    int count = 0;
    public static void main(String[] args) {
        Counter myCounter = new Counter();
        System.out.println("before update:"+myCounter.count);
        Updator myUpdator = new Updator();
        myUpdator.update(myCounter);
        System.out.println("after update:"+myCounter.count);
    }
}

 

이전 예제와의 차이점은 update 메소드의 입력항목이다. 전에는 int count와 같이 값을 전달받았다면 지금은 Counter counter와 같이 객체를 전달받도록 변경한 것이다.

 

update 메소드를 호출하는 부분도 다음처럼 바뀌었다.

 


myUpdator.update(myCounter);

 

이제 변경된 클래스를 실행 해 보면 다음과 같은 결과가 출력된다.

 


before update:0
after update:1

 

myCounter 객체의 count 값이 1만큼 증가되었다.

※ 객체를 전달하는 것을 call by reference 라고도 하는데 사실 객체를 전달하더라도 동일한 객체를 가리키는 또다른 레퍼런스가 넘어가기 때문에 엄밀한 의미에서는 call by reference가 아닌 call by value가 맞다. 하지만 여러분은 그러한 논쟁에 휘말릴 필요없이 메소드에 객체가 넘어오면 객체의 속성 값을 변경할 수 있게 된다는 사실만 기억하도록 하자.