자바는 C++와 같이 직접적인 연산자 오버로딩을 지원하지 않습니다. 역사적으로 이 제한은 코드 읽기를 간소화하고 모호성을 줄이기 위해 도입되었습니다: C++의 창시자인 비욘 스트라우스트룹과 자바의 창시자인 제임스 고슬링이 이 문제에 대해 논의하였고, 자바에서는 개발자가 자신의 클래스에 대한 연산자의 동작을 정의하지 못하도록 결정되었습니다.
문제는 연산자 오버로딩이 사용자 정의 클래스에 대한 산술 및 논리 정의에 과도한 자유를 부여하여 추적하기 어려운 버그와 코드 가독성 저하를 초래할 수 있다는 것입니다. 특히 대규모 팀에서 그러하죠.
해결책은 사용자 정의 연산자 오버로딩을 금지하는 것입니다. 그렇지만 자바는 자체 클래스 내에서 메서드 오버로딩을 지원하며, 연산자의 동작은 명시적으로 정의된 메서드(예: .add(), .equals(), .compareTo() 등)를 통해 모방할 수 있습니다.
코드 예시:
public class Vector2D { private final int x, y; public Vector2D(int x, int y) { this.x = x; this.y = y; } public Vector2D add(Vector2D other) { return new Vector2D(this.x + other.x, this.y + other.y); } } Vector2D v1 = new Vector2D(2, 3); Vector2D v2 = new Vector2D(1, 4); Vector2D sum = v1.add(v2); // v1 + v2 대신
주요 특징:
자바에서 자신의 클래스에 대해 " + " 연산자를 오버로딩하여 객체를 더할 수 있습니까?
답변: 아니요, 자바는 생성된 클래스에 대한 사용자 정의 산술 연산자 오버로딩을 지원하지 않습니다. 문자열에 대해서만 예외가 있으며, " + " 연산자는 StringBuilder를 통해 연결을 호출합니다.
equals() 메서드를 정의하면 "==" 연산자가 값 비교로 작동합니까?
답변: 아니요, "==" 연산자는 객체의 참조를 비교하며, 내용을 비교하지 않습니다. 정확한 값 비교를 위해서는 재정의된 equals()를 사용해야 합니다.
String a = new String("hello"); String b = new String("hello"); System.out.println(a == b); // false System.out.println(a.equals(b)); // true
표준 연산자가 비표준 클래스에 대해 특별하게 작동하는 예외가 있습니까?
답변: 자바에서는 문자열에 대한 " + " 연산자와 원시 타입(자동 승격 및 언박싱)에 대해서만 "특별한" 동작이 구현되어 있습니다. 나머지 클래스의 경우 연산자는 표준적으로 작동합니다(즉, 오버로딩되지 않음).
젊은 개발자가 Money 클래스를 작성하고 두 객체를 "=="를 통해 비교하여 값으로 비교될 것이라고 생각했습니다. 이로 인해 프로덕션에서만 나타난 동등성 검사 시 오류가 발생하였습니다.
장점:
단점:
프로젝트에서 자신의 Vector 클래스를 작성하고, 모든 산술 연산이 명시적으로 구현되고, 객체에 대해 "=="를 사용하지 않으며, 문서에서 메서드의 작업 의미를 설명하였습니다.
장점:
단점: