Java & Kotlin

[Java] Pass By Value 실행 결과 예측해보기 (1/3)

망나니개발자 2021. 1. 18. 10:34
반응형

개발을 하다 보면 함수의 파라미터로 변수를 넘겨주어야 한다. 각 언어마다 변수를 넘겨주는 방법(Pass By Value, Pass By Reference)이 다른데, 이를 정확히 인지하지 못하면 예상치 못한 버그를 발생시킬 수 있다. 이번에는 Java가 어떠한 방식으로 파라미터를 전달하는지 살펴보도록 하자.

 

 

1. 문제 풀어보기


Pass By Value와 Pass By Reference에 대해 이야기하기 전에, 우리는 이들에 대해 얼마나 이해하고 있는지 확인하기 위해 아래의 간단한 시스템의 출력 결과를 예상해보도록 하자. 해당 유형의 문제는 실제 유명한 기업들에서 자주 출제되는 문제이기도 하다.

 

[ 실행할 프로그램 ]

class Dog {

    private String name;

    public Dog (String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

public class Test {

    public static void main(String[] args) {
        int x = 10;
        int[] y = {2, 3, 4};
        Dog dog1 = new Dog("강아지1");
        Dog dog2 = new Dog("강아지2");
        
        // 함수 실행
        foo(x, y, dog1, dog2);
        
        // 어떤 결과가 출력될 것 같은지 혹은 값이 어떻게 변할지 예상해보세요!
        System.out.println("x = " + x);
        System.out.println("y = " + y[0]);
        System.out.println("dog1.name = " + dog1.getName());
        System.out.println("dog2.name = " + dog2.getName());
    }

    public static void foo(int x, int[] y, Dog dog1, Dog dog2) {
        x++;
        y[0]++;
        dog1 = new Dog("이름 바뀐 강아지1");
        dog2.setName("이름 바뀐 강아지2");
    }

}

 

위와 같은 프로그램을 실행하게 되면 각각의 값들은 어떻게 변하겠는가? 충분히 고민한 후에 답을 확인해보도록 하자. 

 

 

[ 실행 결과 ]

위를 실행하면 아래와 같은 결과가 나온다.

x = 10
y = 3
dog1.name = 강아지1
dog2.name = 이름 바뀐 강아지2

 

본인이 예상했던 결과와는 다른 결과가 나왔을 수 있다.

그러한 근본적인 이유는 Java가 Pass By Value로 변수를 전달하기 때문이다. 왜 이러한 결과가 나왔는지 이해하기 위해 Java의 작동 방식을 자세히 알아보도록 하자.

 

 

 

 

 

관련 포스팅

  1. Pass By Value 실행 결과 예측해보기 (1/3)
  2. 메모리 관리 및 Pass By Value의 동작 방식 (2/3)
  3. Pass By Value와 Pass By Reference의 차이 및 이해 (3/3)
반응형