정적 메서드는 자바 8부터 인터페이스에서 사용할 수 있게 되었습니다. 이들은 static 키워드로 선언되며 인터페이스 내에서 직접 구현됩니다. 정적 메서드는 구현하는 클래스에서 상속받지 않으며 인터페이스 이름을 통해 호출됩니다.
interface MathUtils { static int sum(int a, int b) { return a + b; } }
MathUtils.sum(1, 2);질문: 인터페이스의 정적 메서드는 구현 클래스의 객체를 통해 호출할 수 있나요?
답변: 아니요, 인터페이스의 정적 메서드는 항상 인터페이스 이름을 통해 호출되며 인스턴스나 구현 클래스의 이름을 통해 호출할 수 없습니다. 다음 예제는 컴파일 오류를 발생시킵니다:
MathUtils utils = new SomeMathUtilsImpl(); utils.sum(1, 2); // 오류! MathUtils.sum(1, 2)로 호출해야 합니다.
이야기
개발자들은 구현 클래스에서 인터페이스의 정적 메서드를 "재정의"하려고 시도했고 이 메서드를 인스턴스를 통해 호출할 것이라고 기대했습니다. 결과적으로 항상 인터페이스의 버전이 호출되어 사용 중 잘못된 비즈니스 로직으로 이어졌습니다.
이야기
유틸리티 메서드를 클래스에서 인터페이스로 마이그레이션하는 과정에서 일부 코드는 객체를 통해 호출하는 방식
obj.method()를 사용했습니다. 이는 불가능해졌고 프로젝트 전체에서InterfaceName.method()로 호출을 리팩토링해야 했습니다.
이야기
구버전 Java를 지원하다 보니 인터페이스에 정적 메서드를 추가한 후 컴파일 오류가 발생했습니다. 개발자들이 CI에서 사용되는 컴파일러 버전을 확인하지 않아 빌드가 정기적으로 실패하기 시작했습니다.