[Java] Call by Value, Call by Reference

dustle·2022년 11월 27일
2

메소드에 파라미터를 전달하는 방법에는 Call by Value, Call by Reference 두가지의 방법이 있습니다.

Call by Value


자바에서 값을 넘겨줄 때 사용하는 방식입니다.
Call by Value는 Pass by Value와 동일합니다.
메소드에 넘겨줄 때 값을 넘겨주게 됩니다.
그래서 다른 메소드에 넘겨진 파라미터는 기존 객체와 다른 객체가 됩니다.

public void hongsi() {
	int age = 3;
    
    hongsiAge(age);
}

public void hongsiAge(int age) {
	age = 40; // hongsi()에 있는 age 와 다른 객체
}

호출자의 변수에는 값을 변경해도 영향이 없습니다.

Call by Reference


Call by Reference 는 Pass by Reference와 동일합니다.
메소드에 넘겨줄 때 주소값을 넘겨주게 됩니다.
그래서 다른 메소드에 넘겨진 파라미터를 변경하면 원본 변수에도 영향이 갑니다.

자바에서 메소드에 파라미터를 넘겨줄 때 동작 과정


원시 변수를 선언하여 메소드로 넘겨줄 때와
참조 변수를 선언하여 메소드로 넘겨줄 때의 차이를 알아보겠습니다.
(원시 타입과 참조 타입: https://velog.io/@dustle/Java-Primitive-type-Reference-type)

원시 변수는 Stack에 값과 함께 저장됩니다.

public void hongsi() {
	int age = 3;
    
    hongsiAge(age);
}

public void hongsiAge(int age) {
	age = 40; // hongsi()에 있는 age 와 다른 객체
}

원시 변수로 저장된 age 는 Stack에 쌓이게 되고,
파라미터로 넘겨진 age 는 40으로 Stack에 새로 넣어지게 됩니다.

값만 전달하게 되므로 hongsi()의 age와 hongsiAge()의 age는 완전히 다른 객체가 됩니다.

public void hongsi() {
	Age age = new Age(3);
    
    hongsiAge(age);
}

public void hongsiAge(Age age) {
	age = new Age(40); 
}

참조 변수로 저장된 Age는 Stack에 객체의 주소값과 쌓이게 되고 Heap에 실제객체를 저장합니다.

hongsiAge()에서 new Age로 새로 선언된 age는 stack과 Heap에 새로 선언되게 되고, 가리키는 객체가 달라져 원본에는 영향이 없습니다.

결론

값을 새로 할당해도 원본 변수에 영향이 없기 때문에 Java 는 Call By Value로 작동한다.

4개의 댓글

comment-user-thumbnail
2022년 11월 27일

우와 자바는 다 콜 바이 레퍼런스인줄 알았는데, 저렇게 보니까 콜 바이 밸류가 맞군요! 너무 좋은 정보 감사합니다! 지식이 넓어졌어요! ^^*

1개의 답글
comment-user-thumbnail
2022년 11월 30일

와우!

1개의 답글