Call by Value & Call by Reference[콜바이벨류 & 콜바이레퍼런스]
일단 프리미티브 타입과 레퍼런스 타입에 대해서 이해해야 한다.
두 타입은 먼저 저장되는 영역이 다르다.
프리미티브 타입은 스택영역에 저장이 되고
레퍼런스 타입은 힙영역에 저장이 된다.
이 내용을 정확하게 기억해야 잊어먹지 않는다.
프리미티브 타입은 참조해서 사용된 값이 변경이 되지 않는다.
하지만 레퍼런스 타입은 참조해서 사용하면 값이 변경된다.
아래의 예제를 보자.
-----------------
/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);
}
}
-----------------
먼저 프리미티브 타입으로 보면 메소드가 실행되면
값이 그대로 복사가 된다. 이 부분을 콜바이 밸류라고 할수 있다.
그래서 나중에 본래의 값에는 영향을 주지 않는다.
하지만 레퍼런스 타입은 메소드를 실행해보면
값이 복사가 되는 것이 아니라 주소값이 복사가 된다. 이 부분을 콜바이 레퍼런스라고 할수 있다.
여기에서 실행된 값은... 오브젝트 객체에 저장이 된다.
ㅍ.ㅍ 이 부분을 잘 이해해야 한다...
사실 결론적인 값들은 모두 콜바이 밸류로 처리가 되지만
객체의 값에 저장되는 방식은 레퍼런스 타입의 주소값으로 값이 저장되기에
이후의 객체에도 값이 저장이 된다...
어렵지만... 이해해야 해요~
아 그리고 참고로... 스트링은... 스트링영역에 저장이 된다고 보면된다...
한마디로... 특별대우?!