과부하 문제: CollectionClassifier 프로그램의 예에서와 같이 메소드 오버로딩은 런타임이 아닌 매개변수 유형을 기준으로 컴파일 타임에 호출할 메소드를 선택하므로 예상치 못한 동작이 발생할 수 있습니다. 오버로드와 덮어쓰기: 오버로딩은 컴파일 시 메서드를 선택하는 반면, 재정의는 런타임 시 유형을 기반으로 올바른 메서드를 선택하므로 동작을 더 예측하기 쉽습니다. 혼란스러운 오버헤드 방지: 오버로딩은 매개변수 집합에 대해 어떤 메서드가 호출될지 명확하지 않을 때 프로그래머를 혼란스럽게 할 수 있습니다. 이는 공개 API에서 특히 문제가 됩니다. 권장사항: 매개변수 수가 동일한 두 개의 오버로드를 내보내지 마세요. 오버로드하는 대신 메소드 이름을 다르게 지정하세요(예: writeInt 및 writeBoolean). varargs를 사용할 때 오버로드를 피하세요. 제네릭 및 오토박싱의 경우: Java에 제네릭과 오토박싱을 도입하면 List.remove의 예에서 볼 수 있듯이 여러 오버로드로 인해 혼란스럽게 동작할 수 있는 오버로드 문제가 발생했습니다. 기능적 인터페이스 및 람다: Java 8에 람다를 추가하면 기능적 인터페이스를 사용하는 메소드를 오버로드하여 혼란의 위험이 높아졌습니다. 특히 해당 인터페이스가 "완전히 다르지" 않은 경우 더욱 그렇습니다. 실용적인 솔루션: instanceof를 사용한 명시적 테스트는 오버로드와 관련된 문제를 피할 수 있습니다. 획기적으로 다른 매개변수(서로 변환할 수 없는 유형)를 사용한 오버로드는 혼란을 방지합니다. 생성자 및 오버로드: 생성자는 항상 오버로드되지만 정적 팩토리를 사용하면 이러한 복잡성을 일부 피할 수 있습니다. 정당한 예외: 이전 클래스를 조정하는 등 일부 경우에는 오버로드가 필요할 수 있지만 오버로드된 메소드가 동일한 매개변수로 호출될 때 동일하게 작동하도록 주의해서 사용해야 합니다. 결론: 오버로드는 자제해서 사용해야 합니다. 기술적으로는 가능하지만 더 명확하고 예측 가능한 코드를 보장하기 위해 메소드 이름을 다르게 지정하거나 혼동되는 오버로드를 피하는 것이 더 나은 경우가 많습니다. 책의 예: