짧은 대답 : 일관성
그러나 귀하의 질문에 올바르게 대답하기 위해 한 걸음 물러서서 프로그래밍 언어에서 평등의 의미 에 대한 문제를 살펴 보는 것이 좋습니다 . 다양한 언어로 사용되는 적어도 세 가지 다른 가능성이 있습니다.
- 참조 평등 : a와 b가 같은 객체를 참조하면 a = b가 참임을 의미합니다. a와 b의 모든 속성이 동일하더라도 a와 b가 다른 객체를 참조하면 사실이 아닙니다.
- 얕은 동등성 : a와 b가 참조하는 객체의 모든 속성이 동일한 경우 a = b가 참임을 의미합니다. 두 객체를 나타내는 메모리 공간을 비트 단위로 비교하면 얕은 동등성을 쉽게 구현할 수 있습니다. 참조 평등은 얕은 평등을 의미합니다.
- 깊은 평등 : a와 b의 각 속성이 동일하거나 매우 같으면 a = b가 참임을 의미합니다. 깊은 평등은 참조 평등과 얕은 평등에 의해 암시됩니다. 이런 의미에서 깊은 평등은 가장 약한 형태의 평등이며 기준 평등은 가장 강합니다.
이 세 가지 유형의 평등은 구현하기 편리하기 때문에 자주 사용됩니다. 세 개의 평등 검사는 모두 컴파일러에 의해 쉽게 생성 될 수 있습니다 (심도 평등의 경우 컴파일러는 태그 비트를 사용하여 무한 루프를 방지해야합니다. 순환 참조가 있습니다). 그러나 또 다른 문제가 있습니다.이 중 어느 것도 적절하지 않을 수 있습니다.
사소한 시스템에서 객체의 평등은 종종 깊은 평등과 참조 평등 사이의 무언가로 정의됩니다. 특정 상황에서 두 객체를 동일한 것으로 간주할지 여부를 확인하기 위해 일부 속성은 메모리의 위치에 따라 다른 속성과 깊은 평등으로 비교해야하지만 일부 속성은 완전히 다른 것으로 허용 될 수 있습니다. 우리가 정말로 좋아하는 것은 종종 문학 의미 론적 평등 에서 불리는“제 4의 평등” 입니다. 우리의 영역에서 상황이 동일하면 동일합니다. =)
그래서 우리는 당신의 질문으로 돌아갈 수 있습니다 :
내가 이것을 놓친 것에 대한 기본 설정의 주요 이점이 있습니까? 아니면 기본 동작이 논리적 평등이어야한다는 것이 합리적입니까?
어떤 언어로든 'a == b'를 쓸 때 무엇을 의미합니까? 이상적으로는 항상 동일해야합니다. 의미 적 평등. 그러나 그것은 불가능합니다.
주요 고려 사항 중 하나는 적어도 숫자와 같은 간단한 유형의 경우 동일한 값을 지정한 후에 두 변수가 동일 할 것으로 예상합니다. 아래를보십시오 :
var a = 1;
var b = a;
if (a == b){
...
}
a = 3;
b = 3;
if (a == b) {
...
}
이 경우 두 진술에서 모두 'a는 b'입니다. 다른 것은 미쳤을 것입니다. 대부분의 언어는이 규칙을 따릅니다. 따라서 단순한 유형 (일명 값)을 사용하여 의미 적 평등을 달성하는 방법을 알고 있습니다. 객체를 사용하면 완전히 다를 수 있습니다. 아래를보십시오 :
var a = new Something(1);
var b = a;
if (a == b){
...
}
b = new Something(1);
a.DoSomething();
b.DoSomething();
if (a == b) {
...
}
우리는 첫 번째 'if'가 항상 사실이라고 기대합니다. 그러나 두 번째 'if'에서 무엇을 기대하십니까? 정말 달려 있습니다. 'DoSomething'이 a와 b의 (의미 적) 평등을 바꿀 수 있습니까?
시맨틱 평등의 문제점은 컴파일러가 객체에 대해 자동으로 생성 할 수 없으며 할당에서 분명하지 않다는 것 입니다. 사용자가 의미 적 동등성을 정의 할 수있는 메커니즘이 제공되어야합니다. 객체 지향 언어에서이 메커니즘은 상속 된 메소드입니다 : equals . OO 코드를 읽으면 모든 클래스에서 메소드가 정확히 동일한 구현을 기대하지는 않습니다. 우리는 상속과 오버로드에 익숙합니다.
그러나 연산자도 동일한 동작을 기대합니다. 'a == b'가 표시되면 모든 상황에서 동일한 유형의 동등 함 (위의 4부터)을 예상해야합니다. 따라서 일관성 을 유지하기 위해 언어 설계자는 모든 유형에 대해 참조 평등을 사용했습니다. 프로그래머가 메소드를 대체했는지 여부에 의존해서는 안됩니다.
추신 : 언어 Dee는 Java 및 C #과 약간 다릅니다. equals 연산자는 간단한 유형의 경우 얕은 평등을 의미하고 사용자 정의 클래스의 의미 적 평등을 의미합니다 (= 사용자와 거짓말하는 = 연산을 구현해야 함-기본값은 제공되지 않음). 단순 유형의 경우 얕은 평등은 항상 시맨틱 평등이므로 언어는 일관성이 있습니다. 그러나 지불하는 가격은 equals 연산자가 기본적으로 사용자 정의 유형에 대해 정의되어 있지 않다는 것입니다. 당신은 그것을 구현해야합니다. 때로는 지루합니다.