웹사이트 검색

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
	}

}

예제 프로그램을 실행하면 다음과 같은 결과가 나타납니다.

Output
After 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 and blue is pointing to memory location 100, and that these are the memory locations of both Balloon objects.

  • When the class calls the swap() method with the red and blue variables as arguments, two new object variables, o1 and o2, are created. o1 and o2 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 and o2 are swapped, but because the values are copies of the red and blue memory locations, there is no change to the values of the red and blue 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 자습서로 학습을 계속하십시오.