Call by Reference (CBR)
함수가 인수를 전달할 때 사용되는 방식에는 Call By Value(CBV), Call By Reference(CBR)가 있다.
CBV는 함수가 인수로 전달받은 값을 복사하여 처리 하기 때문에 원본 값은 변경되지 않는 특징이 있다.
CBR는 인수로 전달되는 변수의 참조 값을 함수 내부로 전달하는 방식이기 때문에 전달된 변수의 값을 변경하면 호출한 쪽의 변수의 값도 변경되는 특징이 있다.
CBR의 장점으로는 : 복사하지 않고 직접 참조를 하기 때문에 상당히 빠르다.
반대로 단점은 : 직접 참조를 하기에 원래의 값이 영향을 받는다.(리스크가 존재)
하지만 Java는 객체지향 프로그래밍이기 때문에 Call By Value를 지향하고 있으며 그러한 방식으로 동작한다.
그렇지만 우리가 CBR인 것처럼 생각이 드는 이유는 Java에서는 변수의 주소값을 참조하는 경우가 있기 때문에 원본을 참조한다고 생각하는 것이다.
Java는 원시타입(Primitive Type)과 참조타입(Reference Type)이 있는데 원시타입은 Stack 영역에 변수와 함께 저장되고, 참조타입은 객체는 Heap영역에, Stack영역에 있는 변수가 객체의 주소값을 갖고 있다.
원시타입(Primitive Type)
void test() {
int a = 1;
int b = 2;
println(a) // 1
println(b) // 2
modify(a, b);
// modify(a, b) 호출 후에도 값이 변하지 않음
println(a) // 1
println(b) // 2
}
private void modify(int a, int b) {
a = 5;
b = 10;
}
원시 타입은 Stack영역에 원본값과 같이 저장되어 있기 때문에 modify() 메서드로 값을 바꿔도 test()영역의 변수는 변하지가 않는다.
참조타입(Reference Type)
class User {
public int age;
public User(int age) {
this.age = age;
}
}
void test() {
User a = new User(10);
User b = new User(20);
println(a.age); // 10
println(b.age); // 20
modify(a, b)
println(a.age); // 11
println(b.age); // 20
}
void modify(User a, User b) {
a.age++;
b = new User(30);
b.age++;
}
참조 타입은 Heap영역에 생긴 변수를 modify()에서도 같이 바라보기 때문에 값의 변화가 생긴다. 하지만 modify()에서 age = 30인 새로운 User를 생성하고 해당 객체를 참조하기 때문에 test()의 b는 age=20인 User를 참조한다.
어떤 타입인지를 보고나서 바라보고 있는 것을 생각해야 한다.
Stack의 영역에서 참조를 하는지, Heap 영역 값을 참조하는지
참고
https://bcp0109.tistory.com/360
항해 개발자 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.
IT 커리어 성장 코스 항해99, 첫 취업부터 현직자 코스까지
항해99는 실무에 집중합니다. 최단기간에 개발자/PM으로 취업하고, 현직자 코스로 폭발 성장을 이어가세요. 실전 프로젝트, 포트폴리오 멘토링, 모의 면접까지.
hanghae99.spartacodingclub.kr
'멋진 개발자 > Java & Spring' 카테고리의 다른 글
[항해 취업코스] 개발자 취준 기록 6 - Java의 컴파일 과정(JVM) (0) | 2024.03.05 |
---|---|
[항해 취업코스] 개발자 취준 기록 5 - JVM의 구성과 특징 (0) | 2024.03.05 |
[항해 취업코스] 개발자 취준 기록 4 - JPA 더티체킹 (0) | 2024.03.05 |
[항해 취업코스] 개발자 취준 기록 3 - JPA는 무조건 좋은가 (0) | 2024.03.04 |
[항해 취업코스] 개발자 취준 기록 2 - 오버로딩, 오버라이딩 (0) | 2024.03.04 |