종식당
Call By Value & Call By Reference 본문
특정 메서드를 호출하는 경우 인자로 전달하는 방법은 크게 2가지가 존재한다. 값에 의한 호출 (Call By Value), 참조에 의한 호출(Call By Reference)이 이에 해당된다.
🎋 Call By Value
값에 의한 호출은 메서드를 호출할 때, 값 자체를 넘겨주는 방식이다. 메서드를 호출하는 함수의 변수와 호출된 함수의 파라미터는 서로 다른 변수이다.
🎍 Call By Reference
참조에 의한 호출은 메서드를 호출할 때, 참조를 직접 전달하는 방식이다. 참조를 직접 전달하기 때문에 호출하는 함수의 변수와 호출된 함수의 파라미터는 동일한 변수이다. 따라서, 파라미터를 수정하는 경우 그대로 원본에도 영향을 미친다.
자바는 어떤 방식을 채택하나요? 🤓
자바는 Call By Value만 존재한다.
자바의 변수는 스택 영역에 할당된다. 이때, 변수의 타입이 원시 타입인 경우에는 값 또한 스택 영역에 저장된다. 그리고, 참조 타입인 경우 객체 자체는 힙 영역에 저장되고 스택 영역에 존재하는 변수가 객체의 주소를 가지고 있다.
만약, 특정 메서드에 원시 타입의 변수를 인자로 전달하여 호출하면, 호출된 메서드의 해당 파라미터가 변경되어도 원본은 수정되지 않는다. 왜냐하면, 호출된 메서드의 스택 프레임에 인자로 주어진 변수의 값이 복사되어 사용되기 때문이다.
반면, 참조 타입의 변수를 인자로 전달하여 호출하는 경우에는 호출된 메서드 내부에서 원본이 수정될 수 있다. 하지만, 이러한 방식은 호출된 메서드의 스택 프레임에 참조 타입 변수를 중복하여 생성하기 때문에 값에 의한 호출로 판단된다. 가령, 다음과 같은 코드가 존재할 때, foo메서드의 스택 프레임과 var메서드의 스택 프레임에 각각 같은 student객체의 주소를 가지고 있는 참조 타입 변수인 student가 존재한다.
public void foo() {
Student student = new Student();
var(student);
}
public void var(Student student) {
student.study();
}
'매일메일' 카테고리의 다른 글
캐시 스탬피드 현상 (1) | 2025.04.22 |
---|---|
관계형 데이터베이스와 비 관계형 데이터베이스의 차이점 (0) | 2025.04.17 |
HTTP/1.1과 HTTP/2.0 (0) | 2025.04.15 |
프로세스보다 스레드의 컨텍스트 스위칭이 더 빠른 이유 (0) | 2025.04.11 |
스케일 아웃과 스케일 업의 차이점 (0) | 2025.04.10 |