본문 바로가기

Java

자바의 call by value.


예전에 같은 회사에 근무하시는 김풍주대리님께서 알려주셨던

자바의 call by value에 대해서.. 갑자기 생각이 안나는 바람에 다시 정리를 해본다 -_-ㅋ

import java.util.ArrayList;
public class CallbyValue {	
 public static void main(String[] args) {		
  ArrayList a = new ArrayList();		
  String aStr = new String("first");				
  set(a);		
  set(aStr);				
  System.out.println(a);		
  System.out.println(aStr);				
  a.remove(1);				
  System.out.println(a);			}		
 public static void set(ArrayList b) {		
  b.add("jang");		
  b.add("kim");	}		
 public static void set(String c) {		
  c="jjnang";	
 }
}
String 과 ArrayList를 가지고 테스트를 해보았다.
결과가 어떻게 나올까?
한번 생각을 해봅시다.
답은...
[jang, kim]
first
[jang]
입니다.
일단 String 을 생각해 보면 new String("first")에 의해 String Type의 value인 "first"가 들어갈 공간이
메모리에 생성되고 (0000 ~ 0010 이라고 가정) String aStr에서 aStr을 의미하는 메모리 (2000 이라 가정)에
위 first가 들어가 있는 메모리의 시작점을 기록하게 된다.
그리고 set(aStr)을 하면 set(String c)로 받게 되는데 c를 의미하는 메모리 (3000이라 가정)에 0000을 받게 되는데
c = "jjnang"; 이 실행되면서 새로운 메모리를 할당받아 jjnang의 시작 메모리를 기록하게 되므로 0000 ~ 0010에 기록되어 있는
first는 아무런 영향을 받지 못 한다.
 
ArrayList의 경우에는 마찬가지로
new ArrayList()에 의해 디폴트 크기로 메모리에 기록되고 (0010 ~ 0020 이라 가정)
ArrayList a 에서는 a를 의미하는 메모리 (AAAA라 가정)에 0010 (위 에서의 시작 메모리)을 기록하게 된다.
이상태에서 set(a); 를 하면 set(ArrayList b)가 받게 되는데
ArrayList b에서는 b를 의미하는 메모리 (BBBB라 가정)에 0010을 받아서 넣게 되고 (call by value니까)
b.add("jang");
b.add("kim");에 의해서 0010에 데이터를 추가하게 된다.
그래서 a를 찍으면 [jang, kim] 을 찍게 된다. 메모리의 주소를 값으로 가지고 있기 때문에
ArrayList a와 ArrayList b는 같은 곳을 바라보게 되고 때문에 a.add와 b.add는 같은 객체를 핸들링
하게 되는 것.
 
내부적으로는 죄다 포인터인가....--ㅋ
StringBuffer c = new StringBuffer("1111");
set(c);
private static void set(StringBuffer c1) {
  c1.append("3456");
}
같은 경우도 마찬가지로 c와 c1은 결국 같은 메모리를 참조하고 있기 때문에
c는 결국 11113456이 된다.
물론 set 메서드에서 c1 = new StringBuffer(); 이래버리면
다른 얘기가 되겠지만....