Java는 기본적으로 Call By Value(값에 의한 호출)입니다.
즉, 메서드에 인자로 전달되는 값은 값 자체가 복사되어 전달되며,
메서드에서 전달된 값이 변경되어도 호출한 측에서 전달한 값에는 영향을 주지 않습니다.
그러나 객체(Object)를 인자로 전달하는 경우에는 Call By Reference(참조에 의한 호출)와 유사한 결과가 나타납니다.
객체를 전달하는 경우, 객체의 참조값(reference)이 인자로 전달되어 메서드에서 객체의 상태를 변경하면
호출한 측에서도 변경된 상태를 확인할 수 있습니다.
이러한 경우에는 객체 자체가 아닌 참조값이 복사되어 전달되는 것이므로,
객체를 복사해서 전달하는 Call By Reference와는 구분됩니다.
예를 들어, 아래와 같이 Person 객체를 인자로 전달하는 경우를 생각해보겠습니다.
public class Main {
public static void main(String[] args) {
Person person = new Person("John", 20);
System.out.println("Before : " + person);
changePerson(person);
System.out.println("After : " + person);
}
public static void changePerson(Person person) {
person.setName("Mike");
person.setAge(30);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
위 코드에서는 Person 객체를 생성하고, changePerson() 메서드를 호출하여 객체의 상태를 변경합니다.
이후, 변경된 객체의 상태를 출력해보면 호출한 측에서도 변경된 상태를 확인할 수 있습니다.
그러나 이러한 경우에도 객체 자체가 복사되어 전달되는 것이 아니라,참조값이 복사되어 전달되는 것입니다.
따라서, changePerson() 메서드에서 새로운 객체를 생성하거나 참조값을 변경하는 경우에는
호출한 측에서 변경된 상태를 확인할 수 없습니다.
Call By Reference를 사용하는 언어와 예제 코드
Call By Reference를 사용하는 언어
C++, C# 등의 언어에서는 Call By Reference를 사용할 수 있습니다.
이러한 언어에서는 메서드 호출 시 인자로 전달된 변수의 주소값을 전달하여,
호출된 메서드에서 인자로 전달된 변수의 값에 직접적인 영향을 줄 수 있습니다.
이는 객체를 전달하는 경우와 유사한 결과를 가져옵니다.
하지만 Call By Reference를 사용하면서 발생할 수 있는 문제점으로는,
메서드에서 전달된 변수의 값을 변경하는 경우 예상치 못한 결과를 가져올 수 있다는 것입니다.
예를 들어, 아래의 C++ 코드에서는 swap() 메서드를 호출하여 변수 a, b의 값을 교환하고자 합니다.
예제 코드
void swap(int& x, int& y) {
int temp = x;
x = y;
y = temp;
}
int main() {
int a = 1, b = 2;
swap(a, b);
cout << a << ", " << b << endl; // 2, 1
return 0;
}
주소값을 전달하였기에 swap(a,b)를 통과한 a, b는 값이 바뀌어 2, 1로 출력됩니다.
만약 swap() 메서드에서 인자로 전달된 변수의 주소값이 아닌 값 자체를 전달하는 상황은 다음과 같습니다.
void swap(int x, int y) {
int temp = x;
x = y;
y = temp;
}
int main() {
int a = 1, b = 2;
swap(a, b);
cout << a << ", " << b << endl; // 1, 2
return 0;
}
위 코드에서는 swap() 메서드에서 인자로 전달된 변수의 값을 복사하여 처리하였습니다.
따라서 swap() 메서드에서 변수 x와 y의 값을 변경해도, 호출한 측에서는 영향을 받지 않습니다.
따라서 main() 함수에서 출력한 결과는 1, 2가 출력됩니다.
'Language > JAVA' 카테고리의 다른 글
Call by Value & Call by Reference (0) | 2023.04.07 |
---|---|
[JAVA] 애너테이션(annotation) (0) | 2022.12.05 |
[JAVA]열거형 (enums) (0) | 2022.12.01 |
[JAVA] 지네릭스(Generics) (0) | 2022.11.28 |
클래스와 객체지향프로그래밍 임시 저장 (0) | 2022.11.22 |