카테고리 없음

Call by Value, Reference

공부곤 2025. 6. 2. 16:33

Call by Value

Call by Value는 함수를 호출할 때 인수로 전달받은 값을 복사하여 함수 내에서 사용하는 방식이다.

 

이 방식에서는 함수 내에서 전달받은 값을 변경해도 원본 값에는 영향을 미치지 않는다.

 

예를 들어, 자바에서 기본 타입(int, float 등)을 함수에 전달할 때 Call by Value 방식이 적용된다. 이 경우, 함수 내에서 변수의 값을 변경하더라도 원본 변수의 값은 변하지 않는다.

class Operation {
  int data = 50;

  void change(int data) {
    data = data + 100; // 이 변경은 로컬 변수에만 영향을 미친다.
  }

  public static void main(String args[]) {
    Operation op = new Operation();
    System.out.println("변경 전: " + op.data);
    op.change(500);
    System.out.println("변경 후: " + op.data);
  }
}

위 코드에서 change 메서드가 호출될 때, 인수로 전달된 data 변수는 새로운 로컬 변수로 복사된다.

 

따라서 메서드 내에서 data 값을 변경해도, 원본 객체 opdata 값에는 영향을 주지 않는다.

 

실행 결과는 다음과 같다.

결과:  변경 전: 50
       변경 후: 50

Call by Reference

Call by Reference는 함수 호출 시 인수로 전달되는 변수의 참조값을 함수 내부로 전달하는 방식이다.

 

이 방식에서는 전달된 변수의 참조값을 통해 실제 메모리 주소를 참조하므로, 함수 내에서 변수의 값을 변경하면 원본 값에도 영향을 미친다.

 

자바는 모든 객체 타입(클래스 인스턴스 등)에 대해 Call by Reference와 유사한 방식을 사용한다.

 

이는 객체의 참조값이 전달되기 때문이다.

class Operation {
  Person person;

  void change(Person person) {
    person.name = "Doe"; // 참조된 객체의 필드를 변경한다.
  }

  public static void main(String args[]) {
    Operation op = new Operation();
    Person p = new Person("John");
    op.person = p;

    System.out.println("변경 전: " + op.person.name);
    op.change(op.person);
    System.out.println("변경 후: " + op.person.name);
  }
}

class Person {
  String name;
  Person(String name) {
    this.name = name;
  }
}

위 코드에서 change 메서드는 Person 객체의 참조값을 전달받아, 객체의 name 필드를 변경한다.

따라서 메서드 호출 후 op.personname 값도 변경된다.

 

실행 결과는 다음과 같다.

결과:  변경 전: John
       변경 후: Doe

Value와 Reference 비교

자바는 기본 타입에 대해서는 Call by Value 방식을 사용하고,
객체 타입에 대해서는 객체의 참조값을 전달하여 마치 Call by Reference처럼 동작한다.

 

기본 타입의 경우 함수 내에서 값의 변경이 원본 변수에 영향을 미치지 않지만,
객체 타입의 경우 참조된 객체의 필드 변경이 원본 객체에 영향을 미친다.

 

이러한 동작 방식은 자바의 메모리 관리와 객체 지향 프로그래밍 특성을 반영한 것이다.

구분 Call by Value Call by Reference
적용 대상 기본 타입 (int, float 등) 객체 타입 (클래스 인스턴스)
전달 방식 값의 복사본을 전달 객체의 참조값을 전달
변경 여부 함수 내에서 값 변경 시, 원본 변수에 영향 없음 함수 내에서 객체의 필드 변경 시, 원본 객체에 영향 있음
결과 변경 전: 50
변경 후: 50
변경 전: John
변경 후: Doe