프로그래밍 언어/JAVA

Java가 연산자 오버로딩을 제공하지 않는 이유

Rateye 2021. 11. 11. 10:51
728x90
반응형
질문 : Java가 연산자 오버로딩을 제공하지 않는 이유는 무엇입니까?

C ++에서 Java로 올 때 명백한 대답이없는 질문은 Java에 연산자 오버로딩이 포함되지 않은 이유입니다.

Complex a, b, c; a = b + c; 가 아닙니다. Complex a, b, c; a = b + c; Complex a, b, c; a = b.add(c); 보다 훨씬 간단합니다. Complex a, b, c; a = b.add(c); ?

연산자 오버로딩을 허용 하지 않는 유효한 인수에 대한 알려진 이유가 있습니까? 이유가 임의적입니까, 아니면 시간을 잃었습니까?

답변

당신이 참조하는 개체의 이전 값 덮어 쓰기를 원하는 가정 a 다음 멤버 함수가 호출되어야 할 것이다.

Complex a, b, c;
// ...
a = b.add(c);

C ++에서,이 표현은 세 (3) 스택에 객체, 첨가를 수행하고, 기존 객체에 임시 객체로부터 결과 값을 복사 생성하도록 컴파일러에 지시 . a

그러나 Java에서 operator= 는 참조 유형에 대한 값 복사를 수행하지 않으며 사용자는 값 유형이 아닌 새 참조 유형 만 만들 수 있습니다. Complex 라는 사용자 정의 유형의 경우 할당은 기존 값에 대한 참조를 복사하는 것을 의미합니다.

대신 고려하십시오.

b.set(1, 0); // initialize to real number '1'
a = b; 
b.set(2, 0);
assert( !a.equals(b) ); // this assertion will fail

C ++에서 이것은 값을 복사하므로 비교 결과가 같지 않습니다. Java에서 operator= 참조 복사를 수행하므로 ab 는 이제 동일한 값을 참조합니다. 결과적으로 객체가 자신과 동일하게 비교되므로 비교에서 '동일'이 생성됩니다.

복사본과 참조의 차이는 연산자 오버로딩의 혼란을 더합니다. @Sebastian이 언급했듯이 Java와 C #은 모두 값과 참조 동등성을 별도로 operator+ 는 값과 개체를 처리 할 가능성이 높지만 operator= 는 이미 참조를 처리하기 위해 구현되었습니다.

C ++에서는 한 번에 한 가지 유형의 비교 만 처리해야하므로 혼동을 줄일 수 있습니다. 예를 들어 Complex 에서 operator=operator== 는 둘 다 값에 대해 작업하고 있습니다-각각 값을 복사하고 값을 비교합니다.

출처 : https://stackoverflow.com/questions/77718/why-doesnt-java-offer-operator-overloading
728x90
반응형