티스토리 뷰

Pass By Value

Pass By Value 는 매개 변수를 통해 값을 전달할 때 원래 값을 복사해서 전달하는 방식을 얘기한다.

결국 매개 변수를 통해 값을 전달하고 나면, 전달된 값에 무슨 짓을 하던 원래 값의 영향을 주지 않는다는 의미이다.

아래 예제코드를 통해 좀더 자세히 알아보자.

예제 코드

결과

메모리 변화

예제 코드에서 확인해보면 passByValue(int a, int b) 내부에서 매개 변수로 전달된 a, b 를 변경했음 에도 main() 로 돌아온 이후 a, b 의 값에는 변화가 없었다. 이와 같이 매개 변수로 전달할 때 값을 복사해서 전달하여 서로 영향을 미치지 않도록 하는 것을 ‘Pass By Value’ 라고 한다.

자바에서는 기본형(Primitive Type)의 경우 오직 ‘Pass By Value’로만 데이터를 전달한다.

 

Pass By Reference

Pass By Reference 는 매개 변수를 통해 데이터를 전달할 때 값이 아닌 참조(메모리 주소)를 전달하는 것을 의미한다. 이렇게 참조 값을 전달하면 함수 내부에서 값을 변경해, 함수 밖에도 영향을 줄 수 있다.

예제코드를 통해 좀더 자세히 알아보자.

예제 코드

결과

메모리 변화

처음 main() 에서 User 를 만든 이후 그 주소 값을 매개 변수로 전달하여 passByReference() 내부에서 변경된 User 의 변화가 main() 에도 영향을 미친다. 이와 같이 변수의 주소 값으로 전달하는 것을 ‘Pass By Reference’ 라고 한다

자바에서는 참조형(Reference Type)은 ‘Pass By Reference’로 데이터를 전달한다.

 

String 의 데이터 전달 방법

분명히 기본형은 Pass By Value 참조형은 Pass By Reference 라고 했다. 하지만 String 은 참조형 임에도 불구하고 Pass By Value 처럼 작동할 때가 있다. ‘String’의 경우 어떻게 작동 하는지 아래 예제를 통해 확인해보자.

예제 코드

결과 값

메모리 변화

예제와 결과 값을 확인해 보니, ‘before pass By Value (String)’에 str 의 주소 값과 ‘in pass By Value (String)’의 str의 주소 값은 같다. 다만, str = "C_H_A_D" 이후 서로 주소 값이 달라졌다.

그 이유는 String이 불변한(immutable) 값 객체(Value Object) 이기 때문이다. String을 변경하기 위해서는, 새로 객체를 생성하고 현재 변수의 참조를 바꿔야 한다. 이 때문에, String은 분명 참조형이기 때문에 ‘Pass By Reference’로 작동하지만, ‘Pass By Value’처럼 보인다.

 

 

자바는 Pass By Value 만?

위에서 자바는 기본형은 ‘Pass By Value’ 를 참조형은 ‘Pass By Reference’ 를 통해 데이터를 전달한다고 얘기했다. 하지만, 많은 자료나 글에서 자바는 ‘Pass By Value’ 만 제공한다고 설명한다. 해당 내용의 의미를 어떻게 해석하면 좋을지 지금부터 알아보자.

자바는 사실 매개 변수를 통해 참조형을 전달할 때, 전달한 스택 프레임에 영역에서 유효한 새로운 변수를 생성하고, 참조하고 있는 주소의 ‘값’을 복사한다. 이 때문에 자바는 Pass By Value 만 존재한다고 하는 것이다.

글 만으로는 이해하기 힘들 것이다. 아래 예제 코드를 통해서 확인해보도록 하자.

예제 코드

결과

메모리 변화

예제 코드를 살펴보고 가장 의문인 지점은 user = null 일 것이다. 분명 참조로 전달했을 때는 카피본의 변경이 원본에 영향을 미친다고 했음에도 불구하고 결과 값은 userName : Tony 로 NullPointException 이 발생하지 않았다. 이를 통해 자바에서 ‘Pass By Reference’는 주소의 위치 값을 새로운 변수에 복사한다는 사실을 알 수 있다. 위 내용이 자바에서 Pass By Value 만을 제공한다고 얘기하는 이유이다.

댓글