Java는 값에 의한 전달이지 참조에 의한 전달이 아닙니다.
소개
많은 Java 프로그래머는 Java가 값에 의한 전달인지 참조에 의한 전달인지 질문합니다. 이 기사에서는 Java가 항상 가치에 의해 전달되는 이유를 요약합니다.
첫째, 값에 의한 전달과 참조에 의한 전달은 무엇을 의미합니까?
- 값으로 전달: 메서드 매개 변수 값이 다른 변수에 복사된 다음 복사된 개체가 메서드로 전달됩니다. 메서드는 복사본을 사용합니다.
- 참조에 의한 전달: 실제 매개변수에 대한 별칭 또는 참조가 메소드에 전달됩니다. 메서드는 실제 매개변수에 액세스합니다.
종종 이러한 용어에 대한 혼동은 Java의 개체 참조 개념의 결과입니다. 기술적으로 Java는 항상 값으로 전달됩니다. 변수가 개체에 대한 참조를 보유할 수 있지만 해당 개체 참조는 메모리에서 개체의 위치를 나타내는 값이기 때문입니다. 따라서 개체 참조는 값으로 전달됩니다.
참조 데이터 유형과 기본 데이터 유형은 모두 값으로 전달됩니다. Java의 데이터 유형에 대해 자세히 알아보세요.
데이터 유형을 이해하는 것 외에도 Java에서 메모리 할당을 이해하는 것도 중요합니다. 참조 데이터 유형과 기본 데이터 유형은 다르게 저장되기 때문입니다.
가치 전달 시연
다음 예제는 Java에서 값이 전달되는 방법을 보여줍니다.
예제 프로그램은 다음 클래스를 사용합니다.
public class Balloon {
private String color;
public Balloon() {}
public Balloon(String c) {
this.color = c;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
다음 예제 프로그램은 두 변수를 교환하는 일반 메서드인 swap()
을 사용합니다. 다른 메서드인 changeValue()
는 변수 값을 변경하려고 시도합니다.
public class Test {
public static void main(String[] args) {
Balloon red = new Balloon("Red"); // memory reference = 50
Balloon blue = new Balloon("Blue"); // memory reference = 100
swap(red, blue);
System.out.println("After the swap method executes:");
System.out.println("`red` color value = " + red.getColor());
System.out.println("`blue` color value = " + blue.getColor());
changeValue(blue);
System.out.println("After the changeValue method executes:");
System.out.println("`blue` color value = " + blue.getColor());
}
// Generic swap method
public static void swap(Object o1, Object o2){
Object temp = o1;
o1 = o2;
o2 = temp;
}
private static void changeValue(Balloon balloon) { // balloon = 100
balloon.setColor("Red"); // balloon = 100
balloon = new Balloon("Green"); // balloon = 200
balloon.setColor("Blue"); // balloon = 200
}
}
예제 프로그램을 실행하면 다음과 같은 결과가 나타납니다.
OutputAfter the swap method executes:
'red' color value = Red
'blue' color value = Blue
After the changeValue method executes:
'blue' color value = Red
출력은 swap()
메서드가 원래 개체의 색상 값을 바꾸지 않았음을 보여줍니다. 이는 swap()
메서드가 원래 개체 참조 값의 복사본에서만 작동하기 때문에 Java가 값으로 전달됨을 표시하는 데 도움이 됩니다.
이 swap()
메서드 테스트는 값에 의한 전달인지 참조에 의한 전달인지 확인하기 위해 모든 프로그래밍 언어와 함께 사용할 수 있습니다.
예제 swap() 메서드 설명
new
연산자를 사용하여 클래스의 인스턴스를 생성하면 객체가 생성되고 변수에는 객체가 저장된 메모리 위치가 포함됩니다.
Balloon red = new Balloon("Red");
Balloon blue = new Balloon("Blue");
다음은 swap()
메서드가 실행될 때 발생하는 상황에 대한 단계별 분석입니다.
-
Assume that
red
is pointing to memory location 50 andblue
is pointing to memory location 100, and that these are the memory locations of bothBalloon
objects. -
When the class calls the
swap()
method with thered
andblue
variables as arguments, two new object variables,o1
ando2
, are created.o1
ando2
also point to memory locations 50 and 100 respectively. -
The following code snippet explains what happens within the
swap()
method:public static void swap(Object o1, Object o2) { // o1 = 50, o2 = 100 Object temp = o1; // assign the object reference value of o1 to temp: temp = 50, o1 = 50, o2 = 100 o1 = o2; // assign the object reference value of o2 to o1: temp = 50, o1 = 100, o2 = 100 o2 = temp; // assign the object reference value of temp to o2: temp = 50, o1 = 100, o2 = 50 } // method terminated
-
The values of
o1
ando2
are swapped, but because the values are copies of thered
andblue
memory locations, there is no change to the values of thered
andblue
color values.
변수에는 개체에 대한 참조가 포함되어 있으므로 참조를 전달하고 Java는 참조에 의해 전달된다고 가정하는 것은 일반적인 실수입니다. 그러나 참조의 복사본인 값을 전달하고 있으므로 값에 의한 전달입니다.
예제 changeValue() 메서드 설명
예제 프로그램의 다음 메서드는 blue
변수가 참조하는 개체의 색상 값을 변경합니다.
private static void changeValue(Balloon balloon) { // balloon = 100
balloon.setColor("Red"); // balloon = 100
balloon = new Balloon("Green"); // balloon = 200
balloon.setColor("Blue"); // balloon = 200
}
다음은 changeValue()
메서드 내에서 일어나는 일에 대한 단계별 분석입니다.
- 이 클래스는 메모리 위치 100을 참조하는
blue
변수에서changeValue()
메서드를 호출합니다. 첫 번째 라인은 역시 메모리 위치 100을 가리키는 참조를 생성합니다. 메모리 위치 100에 있는 개체는빨간색
으로 변경됩니다. - 두 번째 줄은 새 개체(색상 값
Green
)를 만듭니다. 새 개체는 메모리 위치 200에 있습니다.balloon
변수에서 실행되는 추가 메서드는 메모리 위치 200에 있는 개체에 작용하며 메모리 위치 100에 있는 개체에는 영향을 주지 않습니다. balloon 변수는 라인 1에서 생성된 참조를 덮어쓰고 라인 1의balloon
참조는 이 메서드 내에서 더 이상 액세스할 수 없습니다.\n - 세 번째 줄은 메모리 위치 200에 있는 새
풍선
개체의 색상 값을\파란색\
으로 변경하지만파란색
이 참조하는 원래 개체에는 영향을 미치지 않습니다. 메모리 위치 100에 있습니다. 이는 예제 프로그램 출력의 마지막 줄에blue color value = Red
가 인쇄되는 이유를 설명합니다. 이는 1줄의 변경 사항을 반영합니다.\n
결론
이 기사에서는 Java가 가치에 의해 전달되는 이유에 대해 배웠습니다. 더 많은 Java 자습서로 학습을 계속하십시오.