자바는 Call by Value 일까? Call by reference일까?
=> Call by Value
함수의 호출 방식 크게 2가지 (메소드로 인자값을 넘기는 방법)
(1) Call by value (값에 의한 호출) : 인자로 받은 값을 복사하여 처리한다.
장점 : 복사하여 처리하기 때문에 안전. 원래의 값이 보존
단점 : 복사를 하기 때문에 메모리 사용량이 늘어남
(2) Call by reference (참조에 의한 호출) : 인자로 받은 주소를 참조하여 직접 값에 영향을 준다.
장점 : 복사하지 않고 직접 참조 하기에 빠름
단점 : 직접 참조를 하기에 원래의 값이 영향을 받음
1. 인자값으로 기본형을 사용했을 때
package 개념;
public class Callby {
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
System.out.println("기본형-swap(전) num1 = "+num1 +",num2 = "+num2);
swap1(num1, num2);
System.out.println("기본형-swap(후) num1 = "+num1 +",num2 = "+num2);
}
private static void swap1(int num1, int num2) {
int temp;
temp = num1;
num1 = num2;
num2 = temp;
}
}
결과
기본형-swap(전) num1 = 10,num2 = 20
기본형-swap(후) num1 = 10,num2 = 20
자바는 기본형 데이터를 처리할 때 Call by value 형식으로 처리!
2. 인자값으로 객체를 사용했을 때(wrapper 클래스)
package 개념;
public class Callby {
public static void main(String[] args) {
Integer num3 = 30;
Integer num4 = 40;
System.out.println("wrapper클래스-swap(전) num3 = "+num3 +",num4 = "+num4);
swap2(num3, num4);
System.out.println("wrapper클래스-swap(전) num3 = "+num3 +",num4 = "+num4);
}
private static void swap2(Integer num3, Integer num4) {
Integer temp;
temp = num3;
num3 = num4;
num4 = temp;
}
}
결과
wrapper클래스-swap(전) num3 = 30,num4 = 40
wrapper클래스-swap(전) num3 = 30,num4 = 40
객체 또한 메소드로 값이 전달될 때 그 참조 값은 Call by value의 형태로 전달됨!
3. 인자값으로 객체를 사용했을 때(커스텀 클래스)
package 개념;
public class Callby {
static class CustomClass {
int num;
public CustomClass(int num) {
this.num = num;
}
}
public static void main(String[] args) {
CustomClass num5 = new CustomClass(10);
CustomClass num6 = new CustomClass(20);
System.out.println("Custom클래스-swap(전) num5 = "+num5.num +", num6 = "+num6.num);
swap3(num5, num6);
System.out.println("Custom클래스-swap(후) num5 = "+num5.num +", num6 = "+num6.num);
}
private static void swap3(CustomClass num5, CustomClass num6) {
int temp;
temp = num5.num;
num5.num = num6.num;
num6.num = temp;
}
}
결과
Custom클래스-swap(전) num5 = 10, num6 = 20
Custom클래스-swap(후) num5 = 20, num6 = 10
객체의 참조값을 직접 바꾼것이 아니라 객체의 참조값을 통해서 그 객체의 멤버변수에 접근하여 그 값을 바꿈
자바는
객체를 메소드로 넘길 때 객체를 참조하는 지역변수의 실제 주소를 넘기는 것이 아니라
그 지역변수가 가리키고 있는 힙 영역의 객체를 가리키는 새로운 지역변수를 생성하여
그 것을 통하여 같은 객체를 가리키도록 하는 방식
참고
https://codingplus.tistory.com/29
https://hyoje420.tistory.com/6
'기술면접대비' 카테고리의 다른 글
[JAVA] 리터럴(literal)이란? (0) | 2020.09.29 |
---|---|
[WEB] SPA(Single Page Application)란? (0) | 2020.09.25 |
[JAVA] 접근 제어자 (public, private, protected, default) (0) | 2020.09.22 |
[JAVA] 클래스/객체/인스턴스 (0) | 2020.08.25 |
[JAVA]오버로딩(Overloading) / 오버라이딩(Overriding) (0) | 2020.08.24 |