기본 자료형은 무조건 "Pass by Value"로 값을 전달한다. 그리고, 참조 자료형은 "Pass by Reference"로 데이터를 전달한다.
프로그래밍 언어에서 "Pass by Value"
는 메소드의 매개 변수로 넘길 때는 원래 값은 놔두고, 전달되는 값이 진짜인 것처럼 보이게 한다. 그래서, 매개 변수를 받은 메소드에서 그 값을 어떻게 하던간에 원래의 값은 변하지 않는다.
예시 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package Pass; public class ReferencePass { public static void main(String[] args){ ReferencePass reference = new ReferencePass(); reference.callPassByvalue(); } public void callPassByvalue(){ int a = 10; String b = "b"; System.out.println("before passByvalue"); System.out.println("a = " + a); System.out.println("b = " + b); PassByValue(a, b); } public void PassByValue(int a, String b){ a = 20; b = "z"; System.out.println("in passByValue"); System.out.println("a = " + a); System.out.println("b = " + b); } } | cs |
실행 결과
그런데 a는 기본 자료형이라서 값이 변경되지 않았는데, b는 기본 자료형이 아닌 String인데 어떻게 값이 변하지 않았을까?
b = "z";
String은 이렇게 따옴표로 값을 할당하면 new를 사용하여 객체를 생성한 것과 같다.
즉, 다음과 동일하다.
b = new String("z");
String이 아닌 다른 참조형들도 이렇게 호출된 메소드에서 다른 객체로 대체하여 처리하면 기존 값은 바뀌지 않는다.
Pass by Value는 값을 전달하는 작업이고, 호출되기 전과 후에 데이터가 변경되지 않는다.
Pass by Reference
로 값이 전달되면, 호출한 메소드의 데이터에도 영향이 있다.
만약 매개 변수로 받은 참조 자료형 안에 있는 객체를 변경하면, 호출한 참조 자료형 안에 있는 객체는 호출된 메소드에서 변경한 대로 데이터가 바뀐다. 이처럼 값(Value)가 아니라 객체에 대한 참조(Reference)가 넘어가는 것을 "Pass by Reference"라고 한다.
예시 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package Pass; public class ReferencePass { public static void main(String[] args){ ReferencePass reference = new ReferencePass(); //reference.callPassByvalue(); reference.callPassByReference(); } public void callPassByReference(){ MemberDTO member = new MemberDTO("Sangmin"); System.out.println("before passByReference"); System.out.println("member.name = " + member.name); passByReference(member); System.out.println("after passByReference"); System.out.println("member.name = " + member.name); } public void passByReference(MemberDTO member){ member.name = "Sungchoon"; System.out.println("in passByValue"); System.out.println("member.name = " + member.name); } | cs |
실행 결과
passByReference를 호출하기 전에는 member.name 값이 "Sangmin"이었지만, passByReference() 메소드 안에서, passByReference() 메소드가 호출된 이후의 결과를 보면 member.name이 "SungChoon"으로 바뀐 것을 볼 수 있다. 이처럼 메소드의 매개 변수로 참조 자료형을 넘길 경우에는 메소드 안에서 객체의 상태를 변경한 결과에 영향을 받게 된다.
다시 한번 정리하면 다음과 같다.
- 모든 기본 자료형은 Pass by Value이다.
- 참조 자료형은 값이 아닌 참조가 전달되는 Pass by Reference이다.
참조