Call by Value
값만 복사해 가져오는 것.
C언어에서 포인터가 없는 파라미터를 떠올리면 된다.
예를 들어, 포인터가 없는 함수의 경우, 인자로 받은 변수를 함수 내에서 변경해도, 함수 밖에서 해당 변수는 변경되지 않는다.
Call by Reference
주소값을 가져오는 것.
C언어의 포인터를 떠올리면 된다.
예를 들어, 함수의 인자를 포인터로 받도록 해주면, 함수 내에서 인자로 받은 변수를 변경 시, 함수 종료 후 밖에서도 해당 변수의 값은 변경된다.
자바는 항상 Call by Value
자바는 원본 객체의 프로퍼티에 접근할 수 있어도, 원본 객체를 변경할 수 없기 때문에, 항상 Call by Value 이다.
자바는 할당된 값의 위치를 값으로 가지고 있다.
- C / C++ 처럼 변수의 주소값 자체를 가져올 방법이 없고, 넘기는 방법도 없음
- Reference Type (참조 자료형)을 넘겨도 해당 객체의 주소값을 복사하여 사용
- 자바는 할당된 값의 위치를 값으로 가지고 있다.
자바는 변수에 값을 수정하면, 새로운 메모리 공간에 새로운 값을 저장 후, 그 값의 새로운 주소값을 변수에 저장한다. 반면, C언어는 값이 변경되면, 해당 메모리 위치의 값을 수정한다.
예시
public class 자바연습 {
public static void main(String[] args) {
User a = new User("gyoogle"); // 1
System.out.println("a.name: " + a.name);
System.out.println("a 객체의 주소 : " + System.identityHashCode(a));
System.out.println("a 객체의 name 주소 : " + System.identityHashCode(a.name));
System.out.println("---foo 함수 실행---");
foo(a);
System.out.println("a.name : " + a.name);
System.out.println("a 객체의 주소 : " + System.identityHashCode(a));
System.out.println("a 객체의 name 주소 : " + System.identityHashCode(a.name));
}
public static void foo(User b){ // 2
b.name = "ASD";
b = new User("jongnan"); // 3
}
}
class User{
public String name;
User(String name){
this.name = name;
}
}
// 소스 출처 (약간 수정)
//https://gyoogle.dev/blog/computer-language/Java/Call%20by%20value%20&%20Call%20by%20reference.html
/*
실행 결과
a.name: gyoogle
a 객체의 주소 : 1392838282
a 객체의 name 주소 : 523429237
---foo 함수 실행---
a.name : ASD
a 객체의 주소 : 1392838282
a 객체의 name 주소 : 664740647
*/
정리
foo 실행 전 | foo 실행 후 | |
a.name | gyoogle | ASD |
a 주소 | 1392838282 | 1392838282 |
a.name 주소 | 523429237 | 664740647 |
각 장단점
- Call by Value
- 장 : 원본 데이터의 변경 가능성이 없음
- 단 : 인자를 전달할 때, 메모리 공간을 더 할당
- Call by Reference
- 장 : Call by Value의 메모리 공간 해결
- 단 : 원본 값이 변경될 수 있는 위험
참고 출처
https://gyoogle.dev/blog/computer-language/Java/Call%20by%20value%20&%20Call%20by%20reference.html
'CS' 카테고리의 다른 글
[DB] INNER JOIN 정리 (0) | 2023.03.24 |
---|---|
[JAVA] Primitive(원시형) Type ↔️ Reference(참조형) Type (0) | 2023.03.14 |
[자료구조] 링크드 리스트 Linked List (1) | 2023.03.11 |
[컴퓨터구조] ARM(Advanced RISC Machine) 프로세서 정리 (0) | 2023.03.11 |
[컴퓨터구조] 고정 소수점과 부동 소수점 정리 (0) | 2023.03.09 |