중요한 점이지만 IMHO는 이해할 가치가 있습니다.
모든 OO 언어는 항상 참조의 사본을 만들고 절대 '비가 시적'으로 객체를 복사하지 않습니다. OO 언어가 다른 방식으로 작동하면 프로그램을 작성하는 것이 훨씬 어려울 것입니다. 예를 들어 함수와 메서드는 절대 개체를 업데이트 할 수 없습니다. Java 및 대부분의 OO 언어는 상당한 추가 복잡성 없이는 사용하기가 거의 불가능합니다.
프로그램의 객체는 어떤 의미가 있어야합니다. 예를 들어 실제 실제 세계에서 특정한 것을 나타냅니다. 일반적으로 같은 것에 대한 많은 참조를 갖는 것이 합리적입니다. 예를 들어, 집 주소는 많은 사람과 조직에 제공 될 수 있으며 해당 주소는 항상 동일한 물리적 위치를 나타냅니다. 첫 번째 요점은, 대상은 종종 구체적이거나 실제적이거나 구체적인 것을 나타냅니다. 따라서 같은 것에 대한 많은 참조를 가질 수 있다는 것은 매우 유용합니다. 그렇지 않으면 프로그램을 작성하기가 더 어려워집니다.
를 a
호출
foo(Dog aDoggy);
하거나 메소드를 적용하는 다른 함수에 인수 / 매개 변수로 전달할 때마다 a
기본 프로그램 코드는 참조의 사본을 만들어 동일한 객체에 대한 두 번째 참조를 생성합니다.
또한, 복사 된 참조가있는 코드가 다른 스레드에있는 경우, 둘 다 동시에 사용하여 동일한 오브젝트에 액세스 할 수 있습니다.
따라서 가장 유용한 프로그램에는 동일한 객체에 대한 여러 참조가 있습니다. 왜냐하면 대부분의 OO 프로그래밍 언어의 의미이기 때문입니다.
이제 우리가 그것에 대해 생각한다면, 참조로 전달하는 것이 많은 OO 언어에서 사용할 수 있는 유일한 메커니즘 이기 때문에 (C ++는 둘 다 지원), 이것이 '올바른' 기본 행동 일 것으로 기대할 수 있습니다.
IMHO는 참조를 사용 하는 것이 몇 가지 이유로 올바른 기본값 입니다.
- 서로 다른 두 곳에서 사용되는 객체의 가치가 동일하다는 것을 보장합니다. 객체를 두 개의 서로 다른 데이터 구조 (배열, 목록 등)에 넣고 객체를 변경하는 객체에 대해 일부 작업을 수행한다고 상상해보십시오. 디버깅하기에는 악몽이 될 수 있습니다. 더욱 중요한 것은 인 양 데이터 구조에서 동일한 객체, 또는 프로그램의 버그를 갖는다.
- 행복하게 코드를 여러 함수로 리팩토링하거나 여러 함수의 코드를 하나로 병합 할 수 있으며 시맨틱은 변경되지 않습니다. 언어가 참조 의미를 제공하지 않으면 코드를 수정하는 것이 훨씬 더 복잡합니다.
효율성 주장도 있습니다. 전체 객체를 복사하는 것은 참조를 복사하는 것보다 덜 효율적입니다. 그러나 나는 그것이 요점을 그리워한다고 생각합니다. 동일한 객체에 대한 여러 참조는 실제 물리적 세계의 의미와 일치하기 때문에 더 이해하기 쉽고 사용하기 쉽습니다.
따라서 IMHO, 일반적으로 동일한 객체에 대한 여러 참조를 갖는 것이 좋습니다. 알고리즘과 관련하여 의미가없는 비정상적인 경우 대부분의 언어는 '복제'또는 딥 카피를 만들 수있는 기능을 제공합니다. 그러나 이것이 기본값이 아닙니다.
이것이 기본값이 아니 어야한다고 주장하는 사람들 은 자동 가비지 수집을 제공하지 않는 언어를 사용하고 있다고 생각합니다 . 예를 들어 구식 C ++입니다. 문제는 '죽은'객체를 수집하고 여전히 필요할 수있는 객체를 회수하지 않는 방법을 찾아야한다는 것입니다. 동일한 객체에 대한 여러 참조가 있으면 어렵습니다.
C ++에 충분히 저렴한 가비지 수집이있어 모든 참조 된 객체가 가비지 수집되면 많은 반대 의견이 사라집니다. 참조 시맨틱 이 필요 하지 않은 경우가 여전히 있습니다 . 그러나 내 경험상 이러한 상황을 식별 할 수있는 사람들은 일반적으로 적절한 의미를 선택할 수 있습니다.
가비지 수집을 처리하거나 완화하기 위해 C ++ 프로그램에 많은 양의 코드가 있다는 증거가 있다고 생각합니다. 그러나 이러한 종류의 '인프라'코드를 작성하고 유지 관리하면 비용이 추가됩니다. 언어를보다 쉽게 사용하거나 더 강력하게 만들 수 있습니다. 예를 들어, Go 언어는 C ++의 약점을 개선하는 데 중점을두고 설계되었으며 가비지 수집 이외의 선택은 없습니다.
물론 이것은 Java와 관련이 없습니다. 또한 사용하기 쉽게 설계되었으며 가비지 수집 기능도 있습니다. 따라서 여러 참조를 갖는 것이 기본 시맨틱이며, 참조가있는 동안 오브젝트가 회수되지 않는다는 점에서 비교적 안전합니다. 물론 프로그램이 실제로 객체로 끝났을 때 제대로 정리되지 않기 때문에 데이터 구조에 의해 유지 될 수 있습니다.
그래서, 당신은 당신의 질문으로 돌아갑니다 (약간 일반화), 당신은 언제 같은 객체에 대한 하나 이상의 참조를 원합니까? 내가 생각할 수있는 모든 상황에서 거의. 그것들은 대부분의 언어 매개 변수 전달 메커니즘의 기본 의미입니다. 현실 세계에 존재하는 객체를 다루는 기본 의미론은 거의 참조를 통해 이루어져야하기 때문입니다 ( '실제 객체가 존재하기 때문에).
다른 의미 체계는 다루기가 더 어려울 것입니다.
Dog a = new Dog("rover"); // initialise with name
DogList dl = new DogList()
dl.add(a)
...
a.setOwner("Mr Been")
"로버"는 dl
영향을 setOwner
받거나 프로그램을 작성, 이해, 디버그 또는 수정하기가 어려워 야합니다. 나는 대부분의 프로그래머가 당황하거나 당황 할 것이라고 생각한다.
나중에 개가 판매됩니다.
soldDog = dl.lookupOwner("rover", "Mr Been")
soldDog.setOwner("Mr Mcgoo")
이러한 종류의 처리는 일반적이며 일반적입니다. 따라서 참조 의미론은 일반적으로 가장 의미가 있기 때문에 기본값입니다.
요약 : 항상 동일한 객체에 대한 여러 참조를 갖는 것이 좋습니다.