티스토리 뷰


"자바에서 항상 Call By Value 입니다."


결론부터 말하자면 그렇습니다.

자바에서 값을 전달할 때 Call By Value 인지 Call By Reference 인지는 수많은 커뮤니티, 블로그에서 이야기 돼온 해묵은 주제입니다.

이번 포스팅에서는 복잡하고 아리송한 이야기는 빼고 자바는 왜 Call By Value 이고 어떻게 동작하는지에 대해서 이야기해보겠습니다.

그럼 이하 예제 소스로 확인해보겠습니다.


Person.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package info.m2sj.pass;
 
public class Person {
    private String name;
    public Person(String name) {
        this.name = name;
    }
 
    @Override
    public String toString() {
        return "나의 이름은 " + name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}
cs

name 이라는 멤버필드를 가지고 있는 Person 클래스입니다. 간단하죠~ 그럼 이 Person 클래스를 가지고 테스트를 해보겠습니다.


Test1.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package info.m2sj.pass;
 
public class Test1 {
    public static void main(String[] args) {
        Person p1 = new Person("무명");
 
        Person p2 = p1;
 
        p2.setName("소졸");
 
        System.out.println("p1: " + p1.toString());
        System.out.println("p2: " + p2.toString());
    }
}
 
cs

Test1 을 실행하면 예상되는 출력값이 어떻게 될까요? 




OUTPUT:

p1: My name is "소졸"

p2: My name is "소졸"


자바를 조금만 배워 보신 분이라면 결과를 쉽게 맞추셨을 겁니다. 

p1과 p2 는 같은 Person 객체를 참조하고 있으니까요. 결국 참조를 통해서 데이터를 조작하니까 자바는 Call By Reference  가 아닐까요? 계속해서 보시죠~


Test1.java 에 아래와 빨간색 부분을 추가 해보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package info.m2sj.pass;
 
public class Test1 {
    public static void main(String[] args) {
        Person p1 = new Person("무명");
 
        Person p2 = p1;
 
        p2 = new Person("무명");
 
        p2.setName("소졸");
 
        System.out.println("p1: " + p1.toString());
        System.out.println("p2: " + p2.toString());
    }
}
cs

다시 실행 해보면 출력값이 어떻게 될까요?




OUTPUT:

p1: My name is "무명"

p2: My name is "소졸"


맞추셨나요? 맞추셨다면 이미 자바의 값 전달에 대해서 정확하게 인지하고 계시는 겁니다^^

그림으로 보면 이해 하기가 더 편하실 겁니다.



자바에서 값이 전달 될때는 원시타입은 값이 복사돼서 전달되고, 참조(객체의주소정보) 역시 전달될 때는 참조값 자체가 복사돼서 전달됩니다. 참조를 직접 전달하는것이 아닌 참조값(value) 자체를 복사해서 전달하는것이죠.

만약에 자바가 Call By Reference 가 성립할려면 위에 결과가 첫번째 테스트 결과와 같아야 됩니다.

즉  Person p2 = p1; 구문에서 p2 에 p1 자체를 직접 전달하고 p2 에 값을 변경하면 p1 역시 변경하게 되는것이죠.


자바에서는 이러한 참조 자체를 직접 전달하는 방법을 제공하지 않습니다. (이부분이 가능하게 하는 부분이 C에서의 포인터죠)


결국 자바에서는 원시타입이던 참조타입이던  전달할때는 항상 값을 전달하게 되는 입니다.

더 자세한 내용은 인터넷에 많은 자료들이 있으니 참고하시면 됩니다.




공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크