7.2.3 메서드 호출하기 - 2

jh·2022년 1월 29일
0

Do it! 자바 완전 정복

목록 보기
61/70

기본 자료형 입력매개변수와 참조 자료형 입력매개변수의 차이
두 번째로 기억할 것은 배열과 같은 참조 자료형이 입력매개변수로 넘겨질 때 실제 객체가 전달되는 것이 아니라 객체의 위칫값이 전달된다는 것이다. 그 결과, 기본 자료형이 입력매개변수로 넘겨질 때와 다른 동작을 수행한다. 먼저 기본 자료형이 입력매개변수로 전달될 대를 살펴보자.

🦌기본 자료형 입력매개변수의 전달


기본 자료형일 때는 실제 값이 전달된다. 좀 더 정확하게 말하면, 기본 자료형의 값이 메서드의 지역 변수에 복사되는 것이다. 그럼 메모리상에서의 동작을 살펴보자.

위의 예에서 twice(3)의 호출로 넘겨진 값 3은 twice() 메서드의 지역 변수 a에 복사되고, a값을 두 배로 곱한 값을 a 값으로 저장한 후에 리턴한다. 즉, k1이 값은 6이다. 두 번째를 주의해서 봐야 하는데, main() 함수 안의 a 값을 twice() 메서드의 입력으로 넘겨줬다. 그러면 twice()메서드에서는 int a(twice()메서드의 지역 변수) =a(main() 메서드의 지역 변수)를 가장 먼저 실행할 것이다. 등호(=)는 스택 메모리를 복사하라는 말이므로 main() 메서드의 지역 변수 a의 스택 메모리값이 지역 변수 a로 복사되는 것이다. 이후 twice()메서드는 자신의 a 값을 2배로 곱한 후 변수 a값에 넣었으므로 twice() 메서드의 a 값에는 6이 저장된다.

이때 twice() 메서드의 호출이 끝나고 다시 main() 메서드로 돌아오면 main() 메서드의 a 값은 얼마일까? 여전히 3일 것이다. twice() 메서드는 단 한 번도 main() 함수의 a 값을 건드린 적이 없기 때문이다. 심지어 twice() 메서드의 실행을 완료하고 main()함수로 돌아온 시점에는 메모리에서 twice() 프레임 자체가 날아간 이후이므로 twice() 메서드의 지역 변수 a는 메모리상에 존재하지도 않는다. 이렇게 기본 자료형을 입력매개변수로 전달하면 전달받은 메서드는 값을 복사해 사용한다.

실습

public class jh {
    public static void main(String[] args) {
        int a = 3;
        int result1 = twice(3);
        System.out.println(result1);
        int result2 = twice(a);
        System.out.println(result2);
        System.out.println(a);

    }
    public static int twice(int a) {
        a = a * 2;
        return a;
    }
}

결과

반면 참조 자료형을 입력매개변수로 넘겼을 때를 살펴보자. 이때도 입력매개변수로 넘겨진 변수의 스택 메모리값이 복사돼 사용되는 것은 동일하지만 참조 자료형은 스택 메모리에 객체의 참좃값(위칫값)을 저장하고 있으므로 실제 객체가 아닌 객체의 참좃값이 전달돼 복사된다. 그러다보니 호출한 메서드와 호출된 메서드에서 모두 동일한 객체를 쳐다보고 있는 상황이 연출된다. 그래서 호출된 메서드에서 객체의 값을 변경한 후 호출한 메서드로 돌아오면 값이 바뀌게 된다.

🦌참조 자료형 입력매개변수의 전달

위 예제를 실행하는 과정에서 메모리에 생성되는 데이터의 모양은 다음과 같다.

위 두 예제의 메모리를 쳐다보고 있으면 이 둘 사이의 차이점을 자연스럽게 이해할 수 있을 것이다.

실습

public class jh {
    public static void main(String[] args) {
        int[] array = new int[] {1, 2, 3};
        modifyData(array);
        printArray(array);
    }
    public static void modifyData(int[] a){
        a[0] = 4;
        a[1] = 5;
        a[2] = 6;
    }
    public static void printArray(int[] a){
        System.out.println(Arrays.toString(a));
    }
}

결과

profile
코딩 공부 중...

0개의 댓글