본문 바로가기
프로그래밍/Java

[Java] Java가 Call by Value인 이유

by 시간많은백수 2023. 10. 12.
반응형
 

[Java] Call by Reference와 Call by Value의 차이

Call by Reference와 Call by Value는 프로그래밍 언어에서 함수나 메소드로 값을 전달하는 방식에 관한 중요한 개념입니다. 두 방식의 주요 차이점은 값을 어떻게 전달하고 메모리에 어떻게 저장하는가

richwish.tistory.com

 

자바는 Call by Value 방식을 사용합니다. 자바에서 메소드에 인자를 전달할 때 변수의 값을 복사하여 전달하므로, 함수 내에서 변수 값을 변경해도 호출자에게 영향을 미치지 않습니다. 이것은 기본 데이터 타입(정수, 실수, 불린, char 등)을 다룰 때 해당됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class CallByValueExample {
    public static void main(String[] args) {
        int x = 10;
        System.out.println("Before calling modifyValue, x is: " + x);//10
        modifyValue(x);
        System.out.println("After calling modifyValue, x is: " + x);//10
    }
 
    public static void modifyValue(int value) {
        System.out.println("Inside modifyValue, value is: " + value);//10
        value = 20// 메소드 내에서 value 값을 변경
        System.out.println("Inside modifyValue, after changing value, value is: " + value);//20
    }
}
 
 
cs

 

이 예제에서 modifyValue 메소드는 value라는 매개변수를 받아 값을 변경하려 시도합니다. 그러나 호출자인 main 메소드에서 x 변수의 값은 메소드 호출 전후에 변함이 없습니다. 이것은 Java가 메소드로 값을 복사하여 전달하고, 메소드 내에서 이 복사본을 변경해도 호출자의 변수에 영향을 미치지 않음을 보여줍니다.

 

그러나 배열과 객체 같은 참조 타입(Reference Types)은 조금 다른 방식으로 동작합니다. 변수는 해당 객체 또는 배열을 가리키는 참조(Reference)를 저장하고, 이 참조가 함수로 복사됩니다. 따라서 함수 내에서 참조된 객체 또는 배열의 내용을 변경하면 호출자에게도 영향을 미칩니다. 이것을 Call by Reference라고 부르는 것이 일반적이지만, 정확하게 말하면 참조 값(Reference)를 복사하므로 Call by Value와 Call by Reference의 중간적인 방식입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Person {
    String name;
 
    Person(String name) {
        this.name = name;
    }
}
 
public class CallByValueReferenceExample {
    public static void main(String[] args) {
        Person person = new Person("Alice");
        System.out.println("modifyPerson 메소드 호출 전, person의 이름은: " + person.name);//Alice
        modifyPerson(person);
        System.out.println("modifyPerson 메소드 호출 후, person의 이름은: " + person.name);//Bob
    }
 
    public static void modifyPerson(Person p) {
        System.out.println("modifyPerson 메소드 내에서, person의 이름은: " + p.name);//Alice
        p.name = "Bob"// 객체의 속성을 변경
        System.out.println("modifyPerson 메소드 내에서, 이름을 변경한 후, person의 이름은: " + p.name);//Bob
    }
}
 
 
cs

 

이 예제에서 Person 클래스에 name 속성을 가지고 있는 객체를 만들고, 이 객체를 modifyPerson 메소드에 전달합니다. 메소드 내에서 객체의 name 속성을 변경합니다. 그러나 메소드 호출 이후에도 객체의 이름이 변경되어 있는 것을 볼 수 있습니다. 이것은 자바가 여전히 call by value 방식을 사용한다는 것을 보여줍니다. 자바는 객체에 대한 참조를 복사하여 메소드에 전달하며, 메소드 내에서 객체 자체를 변경하는 경우에도 메소드 외부에서 변경 사항이 반영됩니다.

반응형