SNS에서 지나가다 본 피드였는데, 면접 때 Java 에서 Call By Reference를 설명해보라고해서 JAVA 에서는 Call by value만 있다고 했다가 면접을 떨어졌다든 출처불명의 이야기를 들을 수 있었다.
옆사람에게 Java 에서는 Call By Value만 있는지 Java Code로 설명해보려다 Object 참조와 헷갈려서 제대로 설명을 못했다. 그러다 주말에 언뜻 생각나서 정리해보려고 메모리 구조를 그려보며 C언어 방식과 비교하니 다시 이해가 되었다.
Call By Refercne란 함수 호출 시, 매개변수에는 '메모리 주소'가 복사되어 할당된다. 이렇게 하면, 메모리 주소를 통해 메모리 저장소에 접근하여 값을 변경할 수 있다.
Call By Value란 함수 호출 시, 매개변수에는 '메모리에 저장된 값'이 복사되어 값이 할당된다. 이렇게 되면, 함수 내부에서 매개변수에 있는 값을 아무값으로 할당해도 함수 밖에 영향을 미칠 수 없다.
여기서 오해가 있는 것이, Java를 사용할 때 함수 매개변수로 Object를 전달하면 함수 안에서 Object내에 있는 값을 변경할 수 있다. 이것이 Call By Reference 라는 오해가 있다. 이것은 Java에서 있는 Object 에서 제공하는 Object 참조이지 Memory 참조가 아니다. Memory 참조를 할 수 있는 것이 Call By Reference이다.
다음은 메모리 상태를 그려보며 이해 해본 것이다. 메모리를 그리면서 처음에 이해한 것이라, 코드는 정확하지 않을 수 있다.
아래는 Call By Referenc를 예시이다. 0x001 에 처음에는 OBJ_01 이라는 값이 저장되어 있다가, 0x001 메모리 주소를 참조하여 OBJ_02 라는 값으로 변경하였다.
// C
struct Dog{
char name[20];
}
void main(){
struct Dog dog1;
strcpy(dog1.name, "happy");
callByValue(dog1);
callByReference(dog1);
}
void callByReference(Dog* dog){
struct Dog dog2;
strcpy(dog1.name, "john");
*dog = *dog1;
}
void callByValue(Dog dog){
struct Dog dog2;
strcpy(dog1.name, "john");
dog = dog1;
}
아래는 Call By Value 예시이다. 0x001 에 처음에 OBJ_01 하고, 추후에도 변함이 없다. 다만 change 함수 내에 0x020 메모리가 저장한 값이 OBJ_01 에서 OBJ_02로 변경된 것을 볼 수 있다.
// java
public class Dog{
private String name;
public setName(String name){
this.name = name;
}
}
public class App{
public static void main(String[] args){
Dog dog1 = new Dog("happy");
changeDog(dog1);
changeDogName(dog1);
}
public static changeDog(Dog dog){
dog = new Dog("john");
}
public static changeDogName(Dog dog){
dog.setName("jane");
}
}
참고한 블로그들 중에는 이 블로그가 가장 이해가 정확했고 쉬웠다. 제 글이 이해가 안된다면 해당 포스팅을 추천드립니다.
'공부노트 > 자바' 카테고리의 다른 글
JVM 구조 및 메모리 구조 (0) | 2023.09.17 |
---|---|
OOP 설계 실습 (0) | 2022.03.26 |
OOP(Object Oriented Programming)와 SOLID 원칙 (0) | 2022.03.19 |