call by value
: 값에 의한 호출
: 메소드로 인자 값을 넘길 때 그 값을 복사해 넘기는 형태
: 메소드 호출 시 메소드 내에서는 복사 된 값으로 작업을 하기 때문에 원래의 값을 변경시키지 않는다.
call by reference
: 참조에 의한 호출
: 메소드로 인자 값을 넘길 때 그 객체를 참조하는 주소를 넘겨주는 형태
: 메소드 내에서도 원래의 값에 접근해 변경 가능하다.
Call by value 인자 값으로 기본 형 사용
before
num1 = 10
num2 = 20
after
num1 = 10
num2 = 20
static void swap(int num1, int num2)
{
int temp;
// 자리 바꾸기
temp = num1;
num1 = num2;
num2 = temp;
}
public static void main(String[] args) {
int num1 = 10, num2 = 20;
System.out.println("before");
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
swap(num1, num2);
System.out.println("after");
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
swap 메소드를 호출한 후에도 그대로 값이 유지된다.
메소드 안에서 값 변경 시 원본 데이터가 바뀌지 않는 것을 알 수 있다.
메소드 내에서 두 수를 바꾸는 건 단지 복사된 값을 바꾸는 것에 불과하다.
call by reference 인자 값으로 객체 사용 (커스텀 클래스 사용)
before
num1 = 10
num2 = 20
after
num1 = 20
num2 = 10
class Number
{
int num;
}
public class reference {
static void swap(Number n1, Number n2)
{
int temp;
temp = n1.num;
n1.num = n2.num;
n2.num = temp;
}
public static void main(String[] args) {
Number n1 = new Number();
Number n2 = new Number();
n1.num = 10;
n2.num = 20;
System.out.println("before");
System.out.println("num1 = " + n1.num);
System.out.println("num2 = " + n2.num);
swap(n1, n2);
System.out.println("after");
System.out.println("num1 = " + n1.num);
System.out.println("num2 = " + n2.num);
}
}
객체의 참조 값을 직접 바꾼 것이 아니라 객체의 참조 값을 통해서 그 객체의 멤버 변수에 접근해 값이 변경되었다.
참고
'Java' 카테고리의 다른 글
멤버 변수 (0) | 2022.05.24 |
---|---|
자바 은닉화: 캡슐화 encapsulation (0) | 2022.05.24 |
boolean형에 while문 (0) | 2022.05.14 |
toString()과 String.valueOf() (0) | 2022.05.13 |
Arrays.toString() 배열 출력하기 (0) | 2022.05.13 |