전에 봤던 면접에서 나온 질문중에 대답하지못했던 부분을 포스팅하려고한다.
Call by Value 와 Call by Reference 가 어떤것인가?
프로그래밍에서 함수 호출 방식을 지칭하는 용어로써, 두 방식의 차이는 함수로 전달되는 변수가 원래 데이터의 복사본인지, 아니면 원래 데이터에 대한 참조(reference) 인지에 달려있다.
Call by Value
- Call by Value 에서는 메서드로 값이 복사되어 전달된다. 이 경우, 복사된 값이 메서드 내에서 변경되더라도 원래 변수값은 변경되지 않는다.
- Java 에서는 기본타입이라고 하는 원시 데이터 유형 (int, float, boolean 등) 이 Call by Value 로 전달이된다.
https://yoon-developer.tistory.com/108
간단하게 예제를 보자면, Java에서 기본(원시) 타입을 사용하는 Call by Value 와 객체 참조를 사용하는 Call by Value의 차이점을 설명하기위한 코드이다.
public class Main {
public static void main(String[] args) {
int num = 10;
System.out.println("원래의 num 값 : " + num);
changeNum(num);
System.out.println("메서드 호출 후의 num 값 : " + num);
Dog myDog = new Dog("Rover");
System.out.println("원래의 dog 이름 : " + myDog.name);
changeName(myDog);
System.out.println("메서드 호출 후의 dog 이름 : " + myDog.name);
}
static void changeNum(int num) {
num = 20;
}
static void changeName(Dog dog) {
dog.name = "Tommy";
}
}
class Dog {
String name;
Dog(String name) {
this.name = name;
}
}
이 코드를 실행하면, 기본(원시) 타입의 변수 num 은 Call by Value 때문에 changeNum() 메서드 내에서 변경되지않는다. 따라서 메서드 호출후의 num값은 여전히 10 이다.
그러나 myDog 객체는 참조 값이 메서드로 전달되므로, 메서드 내에서 해당 객체의 상태 이름을 변경할수 있다. 그래서 changeName() 메서드 호출 후의 이름은 Tommy 로 변경되었다.
하지만 이 경우에도 참조 값 자체가 변경되는것은아니다. 즉, myDog 변수가 참조하는 객체를 다른 객체로 변경하는것은 불가능하다.
이게 Java에서의 Call by Value 의 동작방식이다.
Call by Reference
- Call by Reference 에서는 참조, 즉 주소가 메서드로 전달된다. 이 경우에는 메서드 내에서 참조된 객체의 상태가 변경되면, 원래 객체도 해당 변경을 반영한다.
그러나 Call by Value 는 있지만, Call by Reference 는 없다.
정확하게는 Java에서 Call by Reference 가 없다는 것이다. Java 에서는 모든 것이 Call by Value 방식으로 작동한다.
기본 타입의 경우에는 값 자체가 전달되고, 객체의 경우 참조 값이 전달된다. 따라서 전달된 참조값으로 객체의 상태를 변경할수있지만, 참조 값 자체를 변경할수는 없다.
결론
말이 조금 헷갈리긴 하는것같다.
Call by Value 와 Call by Reference 에 대한 부분에 깊이있게 이해를 하는것이 앞으로의 개발방향에 도움이 많이될것같다고 생각된다.
💡C언어에서는 Call by Reference 에 대한 개념이 있으므로, 좀더 공부가 필요한사람들은 다른분들의 정리잘된 게시물을 보면좋겠다.
'Java > Java😊' 카테고리의 다른 글
[Java] 스택(Stack) 과 큐(Queue) 개념 + 자료구조 (0) | 2023.06.13 |
---|---|
[Java] 리스트(List)와 배열(Array) 개념과 사용법 + 자료구조 (0) | 2023.06.13 |
[Java] 기본타입과 참조타입에 대한 이해 (데이터타입) (0) | 2023.05.23 |
[Java] TCP 통신에서 클라이언트의 국가를 확인하는 방법 (0) | 2023.05.10 |
[Java] enum 개념과 예시 (0) | 2023.05.10 |