Pass by Value : 원본은 나두고 복제한 값을 넘기는 것입니다.
Pass by Reference : 원본의 메모리 주소를 넘기는 것입니다.
원시타입은 무조건 Pass by Value로 데이터를 전달하고
참조 자료형은 무조건 Pass by Reference로 데이터를 전달합니다.
Pass By Value
긴말하지 않고 바로 코드로 알아보겠습니다.
public class ReferencePass {
public static void main(String[] args) {
ReferencePass reference = new ReferencePass();
reference.callPassByValue();
}
private 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);
System.out.println("after passByValue");
System.out.println("a="+a);
System.out.println("b="+b);
}
private 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);
}
}
결과
before passByValue
a=10
b=b
in passByValue
a=20
b=z
after passByValue
a=10
b=b
a와 b 모두 기존의 값이 변경되지 않았습니다.
복사된 값을 보냈기 때문입니다.
String은 기본자료형이 아닌데 값이 변경되지 않았을까요??
String은 따옴표로 값을 할당하면 아래와 같은 코드와 동일합니다.
즉 new를사용하여 객체를생성한 것과 같아 항상 새로 값을 만들어 냅니다.
b = new String("z");
Pass By Reference
public static void main(String[] args) {
ReferencePass reference = new ReferencePass();
// reference.callPassByValue();
reference.callPassByReference();
}
private void callPassByReference() {
MemberDTO member = new MemberDTO("Sangmin");
System.out.println("before passByReference");
System.out.println("member.name="+member.name);
System.out.println();
passByReference(member);
System.out.println();
System.out.println("after passByReference");
System.out.println("member.name="+member.name);
}
private void passByReference(final MemberDTO member) {
member.name = "Change name!";
System.out.println("in passByReference");
System.out.println("member.name="+member.name);
}
}
결과
before passByReference
member.name=Sangmin
in passByReference
member.name=Change name!
after passByReference
member.name=Change name!
참조 자료형인 Member의 이름이 바뀐것을 확인할 수 있습니다.
이처럼 메소드의 매개변수로참조 자료형을넘길 경우 메소드 안에서 객체의 상태를 변경한 결과에 영향을 받게 됩니다.
👉전체 코드
더보기
public class ReferencePass {
public class MemberDTO {
public String name;
public String phone;
public String email;
public MemberDTO() {
}
public MemberDTO(String name) {
this.name = name;
}
public MemberDTO(String name, String phone) {
this.name = name;
this.phone = phone;
}
public MemberDTO(String name, String phone, String email) {
this.name = name;
this.phone = phone;
this.email = email;
}
}
public static void main(String[] args) {
ReferencePass reference = new ReferencePass();
// reference.callPassByValue();
reference.callPassByReference();
}
private void callPassByReference() {
MemberDTO member = new MemberDTO("Sangmin");
System.out.println("before passByReference");
System.out.println("member.name="+member.name);
System.out.println();
passByReference(member);
System.out.println();
System.out.println("after passByReference");
System.out.println("member.name="+member.name);
}
private void passByReference(final MemberDTO member) {
member.name = "Change name!";
System.out.println("in passByReference");
System.out.println("member.name="+member.name);
}
private 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);
System.out.println("after passByValue");
System.out.println("a="+a);
System.out.println("b="+b);
}
private 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);
}
}
정리
- 모든 기본 자료형은 Pass by Value이다
- 참조 자료형은 값이 아닌 참조가 전달되는Pass by Reference이다.
'Java' 카테고리의 다른 글
HashMap, HashTable, ConcurrentHashMap (0) | 2023.08.22 |
---|---|
Java - 타입추론 Var (0) | 2023.08.17 |
Optional 클래스 (0) | 2023.08.17 |
StringBuffer, StringBuilder (0) | 2023.08.03 |
인터페이스와 추상클래스, Enum (0) | 2023.07.31 |