박종훈 기술블로그

[Java] call by value

개요

자바는 reference가 아닌 value를 복사하여 전달한다.

그럼 object의 경우에는 어떨까? object를 넘길경우 해당 object의 ref 값을 복사하여 전달한다.

다음과 같은 예시를 살펴보자.

void main(String[] args) {
    Person me = new Person();
    me.name = "jonghoonpark";
    System.out.println(STR."my name: \{ me.name }");
    changeName(me, "noname");
    System.out.println(STR."my name: \{ me.name }");
}

class Person {
    String name;

    public Person() {
    }
}

public void changeName(Person person, String newName) {
    person = new Person();
    person.name = newName;
}

이 코드를 수행하면 어떻게 될까?

정답은 다음과 같다.

my name: jonghoonpark
my name: jonghoonpark

me 객체의 값이 바뀌지 않은 이유를 찾기위해 상태별로 구분해보면 다음과 같이 나눌 수 있다.

상태 1

me 변수에 new Person() 으로 생성된 객체를 할당한다. state 1

상태 2

해당 object의 ref 값을 복사하여 메소드에 전달한다. state 2

상태 3

처음의 me 를 수정하는게 아니라 new Person() 로 생성된 객체를 수정하게 된다. state 3

만약 아래와 같이 작성했다면 일반적으로 기대하는대로 데이터가 변경이 될 것이다.

void main(String[] args) {
    Person me = new Person();
    me.name = "jonghoonpark";
    System.out.println(STR."my name: \{ me.name }");
    changeName(me, "noname");
    System.out.println(STR."my name: \{ me.name }");
}

class Person {
    String name;

    public Person() {
    }
}

public void changeName(Person person, String newName) {
    person.name = newName;
}
my name: jonghoonpark
my name: noname

참고

categories: 스터디-자바

tags: 자바 , java , call by value , reference , pointer , java 21