https://kizoo.gitlab.io/docs/archive/java/001/
1. 자바의 경우
함수에 전달되는(매개변수로) 인자의 데이터 타입에 따라서 함수 호출 방식이 달라진다.
- 기본 자료형의 경우
- call - by - value로 int, short, long, float, double, char, boolean 등 원시타입이 이에 해당한다.
- 참조 자료형의 경우
- call - by - reference로 Array와 Class Instance가 이에 해당한다.
2. call by value (값에 의한 호출)
- 함수 호출 시 메모리 공간에 임시 공간이 생성된다. 이 임시 공간은 함수가 종료되면 사라진다.
- 함수 호출 시 전달되는 변수의 값은 복사되어 함수의 인자로 전달한다.(원본 자체가 넘어가는 것이 아닌 복사된 값이 넘어가는 개념 즉, 결과적으로 어떤 짓을 해도 원본 값은 변화하지 않는다.)
- 이때 복사된 인자의 경우 매개변수로 넘어가면 함수 안에서 지역변수로 사용된다.
3. call by reference (참조에 의한 호출)
- 함수 호출 시 메모리 공간에 함수를 위한 별도 임시 공간이 생성되고 이 공간 역시 함수 종료시에 사라진다.
- call by reference는 참조에 의한 호출 방식으로 함수 호출 시 변수의 주소값(레퍼런스)를 매개변수로 넘겨준다. (원본 자체가 넘어가는 것은 아니지만 주소값이 넘어가기 때문에 해당 값을 변경하려면 변경할 수 있게 된다.)
- 이때 함수의 매개변수로 넘겨준 인자는 주소값을 주며 그 객체를 변경할 수 있게 된다.(변수들의 값이 변경)
4. Wrapper Class (래퍼 클래스)
- 래퍼 클래스 자체는 call by reference 이지만 이는 매개변수로 넘길 때는 새로운 레퍼런스를 만들어 호출하게 만든다.
- 이는 래퍼 클래스 자체의 값 변경이 불가하게 하는 방식 때문인데 이런 이유로 래퍼 클래스 자체는 참조형이지만 함수의 매개변수로 넘길 땐 call by value와 비슷한 방식으로 데이터가 넘어가게 된다.
5. 간단한 예시
public class Swap {
int value;
public Swap(int value) {
this.value = value;
}
private static void swap(Swap a, Swap b) {
int temp = a.value;
a.value = b.value;
b.value = temp;
}
public static void main(String[] args) {
Swap a = new Swap(1);
Swap b = new Swap(2);
System.out.println(a.value + " " +b.value);
swap(a,b);
System.out.println(a.value + " " +b.value);
}
}
출력
1 2
2 1
- 해당 swap 함수에 매개변수로 넘겨줄 때 기본 자료형이 아닌 참조형으로 넘겨주어야 제대로 값이 변하는 것을 알 수 있다.
'Back-End > 백엔드 관련 정리' 카테고리의 다른 글
[백엔드 과정][자바 기초] - 큐 구현하기 (1. ArrayList를 이용한 구현) (0) | 2022.09.06 |
---|---|
[백엔드 과정][자바 기초] - 스택 구현하기 (2.LinkedList를 이용한 구현) (0) | 2022.09.06 |
[백엔드 과정][자바 기초] - 스택 구현하기 (1. ArrayList를 이용한 구현) (0) | 2022.09.06 |
[백엔드 과정][자바 기초] - hashCode와 equals 그리고 TreeSet과 HashSet (0) | 2022.08.31 |
[백엔드 과정][자바 기초] - 1. 추상클래스와 인터페이스(1) (0) | 2022.08.29 |