ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Java는 Call By Value !!!!
    Programming/Java 2020. 9. 16. 20:29

    Call by value

    값에의한 호출, 메서드로 인자값을 넘길 때 그 값을 복사하여 넘기는 형태이다.

    따라서 메서드 내에서는 복사된 값으로 작업을 하기 때문에 원본 데이터의 값을 변경하지 않는다.

    Call by reference

    참조에 의한 호출, 메서드로 인자값을 넘길 때 그 값을 참조하는 주소를 넘겨주는 형태이다.

    따라서, 메서드 내에서도 원본 데이터의 값에 접근이 가능하다.

     

    기본 자료형 Call by value 예제

    소스코드

     

    실행 결과

     

    실행 과정

    swap 메서드에 넘기는 것은 reference가 아닌 value이기 때문에 원본 데이터의 값은 변하지 않는다.

     

     

    Wrapper class Call by value 예제

    소스코드

     

    실행 결과

     

    실행 과정

    Integer a = 10; 이라는 코드는 자바 내부적으로 new를 호출하여 힙 영역에 객체를 생성하고 스택 영역의 지역 변수로 그것을 참조한다.

     

    swap 메서드에서 기본 자료형이 아닌 객체를 전달했고 swap 메서드 내부에서는 a는 b 객체, b는 a 객체를 가지고 있었지만 메서드가 종료되면서 swap 메서드 내 지역 변수 a와 b는 stack에서 사라지고 참조도 해제되어 원본 데이터의 값은 변하지 않는다.

     

    참조 자료형 Call by value 예제 1 

    소스코드

    실행 결과

     

    실행 과정

    1. 변수 p에는 name = "s" 속성을 가진 Person을 가리키는 주소가 저장되어있다.

     

    2. callByValue(p)가 호출되고 callByValue 함수의 지역 변수인 person은 p가 가리키고 있던 Person의 참조를 그대로 받으면서 같은 객체 Person을 가리키게된다.

     

     

    3. 그리고 person에 새 name = "new"인 새 Person 객체가 할당되고 원래 가리키고 있던 Person 대신 새 Person에 대한 참조를 갖게 된다.

    4. callByValue() 함수가 종료되면서 stack에 존재하던 지역변수는 사라지고 변수 p는 원래 가리키고 있던 name = "s"인 Person 객체를 그대로 참조한다. 따라서 원본 데이터의 값은 변하지 않는다.

     

    참조 자료형 Call by value 예제 2

    소스코드

     

     

    실행결과

     

    실행 과정

    1번 예제와 달리 callByValue()에 의해 person 객체의 name 변수가 변경되었다.

    1번 예제와 다른점은 객체의 참조값(참조 객체)를 바꾼 것이 아니라 p가 가리키던 객체의 참조값을 이용해서 멤버변수에 접근하여 그 값을 바꿨다는 것이다.

     

    결론

    기본 자료형, wrapper 클래스, 참조 자료형 예제를 통해 알 수 있는 중요한 자바의 특성은 객체를 메서드로 넘길 때 넘겨 받은 함수의 매개변수(person)와 호출시에 보낸 객체(p)가 같은 스택 상의 같은 변수가 아니라 보낸 객체(p)가 가리키고 있는 힙 영역의 객체를 가리키는 새로운 지역변수(person)를 생성하여 같은 객체를 가리키도록 하는 방식이라는 것이다.

     

     

     

    참고 자료

    hyoje420.tistory.com/6?category=292579

    yaboong.github.io/java/2018/05/26/java-memory-management/

    'Programming > Java' 카테고리의 다른 글

    직렬화  (0) 2020.11.04
    [Java] enum 사용법  (0) 2020.11.04
    [Java] Java 환경변수(JAVA_HOME &CLASSPATH)  (0) 2020.09.16
    [Java] JDK & JRE & JVM  (0) 2020.09.16
    [Java] JVM  (0) 2020.09.16

    댓글

Designed by Tistory.