함수를 호출 방법은 Call by value(값에 의한 호출), Call by reference(참조에 의한 호출)이 있다.
Call by value
함수 호출시 넘기는 인자값이 매개변수에 복사돼서 함수 내에서 매개변수의 값을 변경해도 복사된 값이 변경되는것이다.
즉, 함수 내에서 값을 변경해도 원본값은 변경되지 않는다.
Call by reference
엄밀히 말하면 call by reference도 인자의 값이 매개변수에 복사가 되지만, 복사되는 값이 데이터의 주소값이라는 차이점이 존재한다.
c에서 call by value를 사용하고 원본값의 변경을 위해 call by reference를 사용할떄는 포인터를 이용해서 사용했었다.
Java
Java에서는 객체를 전달 받고 해당 객체를 수정하면 원본도 같이 수정되니깐 call by reference인가?
아니다 Java에는 call by value 밖에 없다. (엥?)
이는 Java의 메모리 구조와 관련이 있다.
public class Example{
public static void main(String[] args) {
Test test = new Test();
int num=1;
test.add1(num);
Map<String, Object> model = new HashMap<>();
test.add2(model);
System.out.println("num = " + num);
System.out.println("model = " + model);
}
}
class Test{
public void add1(int num){
num = 10;
}
public void add2(Map<String, Object> model) {
model.put("key1", "value1");
model.put("key2", "value2");
}
}
// 출력 결과
num = 1
model = {key1=value1, key2=value2}
Java에서 원시타입은 stack에 전부 저장되기 때문에 c의 call by value와 마찬가지로 원본 값에 변화가 없다.
하지만 Java의 참조타입은 stack에 객체의 주소를 저장하고 heap 영역에 해당 객체의 값을 저장한다.
따라서 객체에 대해 call by value로 전달이 되면 stack에 있는 주소값이 복사가 되고,
해당 주소가 가리키는 heap 영역의 실제 데이터에 접근이 가능하기 때문에 원본값을 변경할 수 있다.
결론
Java는 call by value 방식으로 함수에 인자를 전달한다.
Java가 참조타입의 경우 stack에 해당 객체의 주소값을 저장하기 때문에 call by value 방식이지만 원본값을 변경할 수 있다.
'Java , Spring > Java' 카테고리의 다른 글
[Java] 커넥션풀과 데이터소스(DataSource) (0) | 2024.01.19 |
---|---|
[Java] 서블릿과 스프링에서의 MVC (0) | 2024.01.18 |
[Java] String.valueOf() 와 toString() (0) | 2024.01.17 |
[Java] Garbage Collection (1) | 2024.01.15 |
[Java] JIT 컴파일러 (인터프리터와 컴파일) (0) | 2024.01.12 |
댓글