[Java/Kotlin] call-by-value & call-by-reference

Jay·2021년 3월 12일
2

Java&Kotlin

목록 보기
19/30
post-thumbnail

call-by-value (값에 의한 호출)

  • 함수가 호출 될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다.
  • Stack Frame : 함수 호출 시 할당되는 메모리 블록 (지역 변수의 선언으로 인해 할당되는 메모리 블록)
  • call-by-value : 값에 의한 호출방식은 함수 호출 시 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다.
  • 복사된 인자는 함수 안에서 지역적으로 사용되는 local value 특성을 갖는다.
  • 그래서 함수 안에서 인자의 값이 변해도, 외부의 변수 값은 변경되지 않는다.
  • Java의 경우, 함수에 전달되는 인자의 데이터 타입에 따라 (원시자료형/참조자료형) 함수 호출 방식이 달라진다.
    • 원시 자료형(Primitive Type) : call-by-value로 동작
    • 참조 자료형(reference type) : call-by-reference로 동작 (Array, Class Instance)

call-by-reference (참조에 의한 호출)

  • 함수가 호출 될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다.
  • call-by-reference 참조에 의한 호출방식은 함수 호출 시 인자로 전달되는 변수의 레퍼런스를 전달한다. (해당 변수를 가르킨다)
  • 그래서 함수 안에서 인자의 값이 변경되도 Argument로 전달된 객체의 값도 함께 변경 된다.

java는 call-by-reference가 아니다 ?

java는 call-by-value이다!
자바에서는 객체의 주소를 가져오는 방법이 없다.

흔한 오해는, 아래의 코드와 같은 부분에서 생긴다.

public class CallByValue {

  public static void main(String[] args) {
    Person p = new Person("jake");
    System.out.println("p.name: " + p.name);
    callByValue(p);
    System.out.println("p.name: " + p.name);
  }

  public static void callByValue(Person p) {
    p.name = "jay";
  }
}

class Person  {
  String name;

  public Person(String name) {
    this.name = name;
  }
}
결과: 
p.name: jake
p.name: jay

값이 변경되었다. 음? call-by-reference인걸?
아니다!! 실제 상태 값을 바꾸는 것에서 오해가 생긴다.
call-by-reference라면 상태를 변경하는게 아니라 실제 call-by-value함수의 p에 다른 Person 객체를 넣어 바뀐다면 그게 call-by-reference이다.

public class CallByValue {

  public static void main(String[] args) {
    Person p = new Person("jake");
    System.out.println("p.name: " + p.name);
    callByValue(p);
    System.out.println("p.name: " + p.name);
  }

  public static void callByValue(Person p) {
    p = new Person("jay");
  }
}

class Person  {
  String name;

  public Person(String name) {
    this.name = name;
  }
}
결과: 
p.name: jake
p.name: jake

이렇게 하면 값이 바뀌지 않는다.
즉, call-by-reference라면 값이 변경되어야 하는데 동일하다!

profile
developer

0개의 댓글