질문 : 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=
참조 복사를 수행하므로 a
와 b
는 이제 동일한 값을 참조합니다. 결과적으로 객체가 자신과 동일하게 비교되므로 비교에서 '동일'이 생성됩니다.
복사본과 참조의 차이는 연산자 오버로딩의 혼란을 더합니다. @Sebastian이 언급했듯이 Java와 C #은 모두 값과 참조 동등성을 별도로 operator+
는 값과 개체를 처리 할 가능성이 높지만 operator=
는 이미 참조를 처리하기 위해 구현되었습니다.
C ++에서는 한 번에 한 가지 유형의 비교 만 처리해야하므로 혼동을 줄일 수 있습니다. 예를 들어 Complex
에서 operator=
와 operator==
는 둘 다 값에 대해 작업하고 있습니다-각각 값을 복사하고 값을 비교합니다.
출처 : https://stackoverflow.com/questions/77718/why-doesnt-java-offer-operator-overloading
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
macOS Mojave (10.14)에서 Lion (10.7)까지 JAVA_HOME 환경변수 설정 (0) | 2021.11.12 |
---|---|
자바에서 일반 텍스트 파일 읽기 (0) | 2021.11.12 |
Java에서 매개 변수 유형 옆에있는 3개의 점(...) 의 의미 (0) | 2021.11.11 |
자바 int []를 List<Integer>로 변환하는 방법 (0) | 2021.11.10 |
Java에서 InputStream을 String으로 변환하는 가장 쉬운 방법 (0) | 2021.11.04 |