Java는 Call By Value? Call By Reference?

Minjae Lee·2022년 3월 21일
0

자바는 Call By value? Call By Reference?

다음과 같이 name 프로퍼티를 가진 Person 클래스가 정의되어있다.

class Person {
    private String name;
    public Person(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

참조 대상 변경하기

우선 Person형 참조변수가 참조하는 대상을 변경해보자.

public class Main {
    public static void changePerson(Person param) {
        param = new Person("new Person");
    }

    public static void main(String[] args) {
        Person person = new Person("before");
        System.out.println("메서드 호출 전 " + person.getName());
        changePerson(person);
        System.out.println("메서드 호출 후 " + person.getName());
    }
}

예상되는 실행 결과는 다음과 같이 person 변수가 참조하는 대상이 new person으로 변경되어야 한다.

메소드 호출 전 before
메소드 호출 후 new person

하지만 실제 실행 결과는 다음과 같이 person 변수가 참조하는 대상이 변경되지 않는다.

메소드 호출 전 before
메소드 호출 후 before

참조 대상의 속성 바꿔보기

그렇다면 참조하는 대상의 프로퍼티, 즉 name 값을 바꾸는건 어떨까?

public class Main {
    public static void changePerson(Person param) {
//        param = new Person("new Person");
        param.setName("new Person");
    }

    public static void main(String[] args) {
        Person person = new Person("before");
        System.out.println("메서드 호출 전 " + person.getName());
        changePerson(person);
        System.out.println("메서드 호출 후 " + person.getName());
    }
}

class Person {
    private String name;
    public Person(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

실행결과

메서드 호출 전 before
메서드 호출 후 new person

name의 값이 변했음을 확인할 수 있다. changePerson 메소드의 매개변수인 param과 메인 함수에 선언된 person은 같은 인스턴스(Person(before))를 가르키지만, param과 person은 별도의 변수임을 확인할 수 있다.
즉, chagnePerson 메소드가 실행될 때, person의 참조값을 복사하여 param에 전달하는 Call By Value라는것을 알 수 있다.

profile
사소한것 하나하나 꼼꼼하게 신경쓰려 노력하는 개발자입니다.

0개의 댓글

관련 채용 정보