프로그래밍이야기/기타 등등

Call by Value & Call by Reference[콜바이벨류 & 콜바이레퍼런스]

해피맛집 2024. 1. 18. 08:27
반응형

 

 

일단 프리미티브 타입과 레퍼런스 타입에 대해서 이해해야 한다.

 

두 타입은 먼저 저장되는 영역이 다르다. 

 

프리미티브 타입은 스택영역에 저장이 되고

 

레퍼런스 타입은 힙영역에 저장이 된다.

 

이 내용을 정확하게 기억해야 잊어먹지 않는다.

 

프리미티브 타입은 참조해서 사용된 값이 변경이 되지 않는다.

 

하지만 레퍼런스 타입은 참조해서 사용하면 값이 변경된다.

 

아래의 예제를 보자.

 

-----------------

 

/Call By Value

public class SwapTest1 {

public static void main(String[] args) {

// TODO Auto-generated method stub

int a=100;

System.out.println("초기 a의 값 :  " +a);

 f(a);

System.out.println("함수사용후 a의 값 :  " + a );

 

}

 

public static void f(int a){

a = a +100;

System.out.println("함수 속 a의 값 " + a);

}

}

 
 
초기 a의 값 :  100
함수 속 a의 값 200
함수사용후 a의 값 :  100
 
 
//Call By Reference
 
class OBJ{
int value=100;
}
public class SwapTest2 {
 
public static void main(String[] args) {
// TODO Auto-generated method stub
OBJ obj = new OBJ();
System.out.println("초기 obj.value : " + obj.value);
f(obj);
System.out.println("함수 사용후 obj.value : " + obj.value);
}
 
public static void f(OBJ obj){
obj.value = 200;
System.out.println("메소드 속 obj.value :" + obj.value);
}
}
 
초기 obj.value : 100
메소드 속 obj.value :200
함수 사용후 obj.value : 200
 

-----------------

 

먼저 프리미티브 타입으로 보면 메소드가 실행되면

 

값이 그대로 복사가 된다. 이 부분을 콜바이 밸류라고 할수 있다.

 

그래서 나중에 본래의 값에는 영향을 주지 않는다.

 

하지만 레퍼런스 타입은 메소드를 실행해보면

 

값이 복사가 되는 것이 아니라 주소값이 복사가 된다. 이 부분을 콜바이 레퍼런스라고 할수 있다.

 

여기에서 실행된 값은... 오브젝트 객체에 저장이 된다.

 

ㅍ.ㅍ 이 부분을 잘 이해해야 한다...

 

사실 결론적인 값들은 모두 콜바이 밸류로 처리가 되지만

 

객체의 값에 저장되는 방식은 레퍼런스 타입의 주소값으로 값이 저장되기에

 

이후의 객체에도 값이 저장이 된다...

 

어렵지만... 이해해야 해요~

 

아 그리고 참고로... 스트링은... 스트링영역에 저장이 된다고 보면된다...

 

한마디로... 특별대우?!

반응형