Call by value

윤재열·2022년 1월 15일
0

Java

목록 보기
32/71

메서드 값( primitive type)을 전달하는 것과 객체(reference type)를 전달하는 것에는 큰 차이가 있다. 이것은 매우 중요하기 때문에 이전에 잠깐 언급했지만 다시한번 자세히 알아보자.

결론부터 얘끼한다면 메서드로 객체를 전달할 경우 메서드에서 객체의 객체변수(속성)값을 변경할 수 있다.

Call by value

Call by Value는 '값을 전달하는 방식'이며 다르게 말하면 '값만 전달하는 방식'입니다.
만약 함수 A에서 B로 int 변수를 전달한다고 했을 때, 넘겨받은 B에서 어떤 행동을 하던지 변수에는 변함이 없습니다.

public class Sampled1234 {

    public void method_1(){
        int a = 10;
        int b= 5;
        System.out.println("Before Call Method2 : (a = " + a + ", b = " + b + ")");
        method_2(a,b);
        System.out.println("After Call Method2 : (a = " + a + ", b = " + b + ")");
    }
    public void method_2(int a, int b){
         a= 20;
         b=10;
        System.out.println("Inside Method2 : (a = " + a + ", b = " + b + ")");
    }
}
  • 이렇게 method_1 과 method_2의 두 함수가 존재할 때, method1은 a=10,b =5;의 값을 넘겨주고 method는 이 값을 다른 값으로 교체합니다.
    그 이후 다시 mothod1에서 이 변수를 출력했을 때 어떤 변화가 생길까?..

method1에서는 a=10,b=5의 값을 전달했고 method2에서는 이 값을 a=20,b=10으로 바꿔서 사용했습니다. 하지만 method2를 마치고 돌아왔을 때 method1 에서는 여전히 a=10,b =5입니다.]이게 바로 자바가 Call by Value 방식을 사용하기 떄문에 나오는 결과입니다.

그렇다면 자바의 기본 타입을 제외한 참조타입에서는 어떠한 결과가 나올까?

public class CallbyValue {

    public void method_1(){
        String a = "Ahn";
        String b = "Nick";
        System.out.println("Before Call Method2 : (a = " + a + ", b = " + b + ")");
        method_2(a,b);
        System.out.println("After Call Method2 : (a = " + a + ", b = " + b + ")");
    }

    public void method_2(String a, String b){
        a = "Nick";
        b = "Ahn";
        System.out.println("Inside Method2 : (a = " + a + ", b = " + b + ")");
    }

    public static void main(String[] args) {
        CallbyValue value = new CallbyValue();
        value.method_1();
    }
}

  • 자바의 대표적인 참조 타입인 String을 사용했을 떄 int로 테스트한 것과 동일한 겨로가가 나왔습니다.
    하지만 나는 왜 자바의 Call방식을 헷갈려 하는걸까..??
public class Sample555 {
    class Person{
        int age;
        String name;
        public Person(int age, String name) {
            this.age = age;
            this.name = name;
        }
    }
    public void method_1(){
        Person person = new Person(25,"Nick");
        System.out.println("Before Call Method2 : " + person.age +", name = " +person.name + ")");
        method_2(person);
        System.out.println("After Call Method2 : " + person.age +", name = " +person.name + ")");
    }

    public void method_2(Person person) {
        person.age =22;
        person.name = "Ahn";
        System.out.println("Inside Call Method2 : " + person.age +", name = " +person.name + ")");
    }

    public static void main(String[] args) {
        Sample555 sample = new Sample555();
        sample.method_1();
    }
}

아까와 바꿔서, 이번에는 새롭게 선언한 클래스를 가지고 테스트를 해보겠습니다.

profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글