Java에서 참조로 전달
포인터는 특정 데이터의 주소를 암시적으로 모니터링하는 프로그래밍 언어 아키텍처의 변수입니다. 다른 변수에 해당하는 것을 참조라고 합니다. 참조 변수에 대한 수정 사항은 원본에 직접적인 영향을 미칩니다.
Java는 값에 의한 전달 언어입니다. 사양에서 그 자체로 참조에 의한 통과 언어가 아니라고 명시하고 있습니다. Java에서는 참조의 모호한 특성으로 인해 두 용어 사이에 많은 혼동이 존재합니다. 우리는이 기사에서 그것을 지우려고 노력할 것입니다.
값별 전달에 대해 논의해 보겠습니다. 여기에서 형식 매개변수의 값은 메서드/함수 실행 중에 저장하는 데 사용되는 위치에 복사됩니다. 이 위치에는 일반적으로 해당 용도로 할당된 메모리 청크가 있습니다.
참조에 의한 전달에서 형식 매개변수의 값은 메서드/함수 실행 중에 저장하는 데 사용되는 위치에 복사됩니다. 이 위치에는 일반적으로 해당 용도로 할당된 메모리 청크가 있습니다.
Java는 강력하고 안전한 언어로 승격되며 Java의 이점 중 하나는 C++와 같은 포인터를 활성화하지 않는다는 것입니다. 그들은 공식적으로 “참조"로 언급하면서 개념에 대해 다른 용어를 선택했습니다.
이것을 파악하는 열쇠는 다음과 같은 것을 고려하는 것입니다.
Object Obj;
그것은 Obj
가 아니라 Object
에 대한 포인터입니다. 참조라는 용어는 Java에서 잘못 이해되고 있으며 대부분의 혼동의 원인입니다. 다른 프로그래밍 언어에서는 포인터로 작동하기 위해 참조라고 부르는 것입니다.
Java에서 객체에 대해 이야기할 때 참조라고 하는 객체 핸들에 대해 이야기하는 것입니다. 이 핸들도 값으로 제공됩니다.
위의 코드에서는 구성된 Object
주소를 메서드에 효과적으로 보내고 있습니다.
Java는 절차적 언어라는 점에서 C와 유사합니다. 메소드에 포인터를 할당하고 포인터를 그곳으로 보내고 메소드 내부에서 추적하고 포인터가 가리키는 데이터를 변경할 수 있습니다. 반면에 포인터 위치에 대한 변경 사항은 호출자가 알아차리지 못합니다. (참조에 의한 전달 언어에서 메서드 함수는 호출자가 깨닫지 않고도 포인터를 변경할 수 있습니다.)
전달된 변수를 대체할 참조 매개변수를 고려하십시오. 우리가 전달한 변수는 해당 별칭이 할당될 때 할당됩니다.
두 가지 상황으로 이것을 더 잘 이해합시다.
객체 자체를 변경하고 다른 장소나 객체를 가리키면 변경 사항이 반영되지 않습니다. 다른 위치에 대한 참조를 제공한 경우 변경 사항은 main()
함수에 반영되지 않습니다.
아래 코드를 참조하십시오.
class Object {
int x;
Object(int z) {
x = z;
}
Object() {
x = 0;
}
}
class Main {
public static void main(String[] args) {
// a reference
Object O = new Object(7);
// Reference passed and copy created in change()
change(O);
// old value
System.out.println(O.x);
}
public static void change(Object O) {
// reference changed to some other location any changes not reflected
O = new Object();
O.x = 8;
}
}
출력:
7
이제 새로운 장소나 대상에 대한 참조를 할당하지 않는다고 가정합니다. 이 경우 결과가 다시 미러링됩니다. 구성원을 수정할 수 있습니다. 다른 객체(또는 메모리 위치)를 참조하도록 참조를 변경하지 않으면 이러한 변경 사항이 반영됩니다.
예를 들어,
class Object {
int x;
Object(int z) {
x = z;
}
Object() {
x = 0;
}
}
class Main {
public static void main(String[] args) {
// a reference
Object O = new Object(7);
// Reference passed and copy created in change()
change(O);
// old value
System.out.println(O.x);
}
public static void change(Object O) {
O.x = 8;
}
}
출력:
8