20-2. (인터페이스 내) static 메서드와 default 메서드
(인터페이스 내) static 메서드와 default 메서드
인터페이스는 상수와 추상 메서드들의 집합이라고 하였습니다. 그런데 예외 사항으로 jdk 1.8 버전부터 static 메서드와 default 메서드를
포함할 수 있게 되었습니다. 그렇다면 왜 이런 예외 사항을 허용했을까요?
예를 들어 인터페이스 I라는 것을 상당히 많은 클래스들이 구현해서 사용하고 있다고 해보겠습니다. 그런데 이 인터페이스 I에 새로운
추상 메서드를 추가했습니다. 그러면 구현하고 있는 모든 클래스들 마다 해당 인터페이스의 새롭게 추가 된 추상 메서드를 모두
구현해야 하는 엄청난 번거로움을 맞이하게 됩니다. 따라서 이러한 상황을 위해 default 메서드 선언을 허용하게 된 것입니다!
static 메서드의 경우 이전 글에서 다루었던 static 메서드가 JVM 메모리 구조에서 어떻게 동작하는지를 이해하고 계신다면 왜
예외를 허용했는지 쉽게 아실 것이라 생각하여 생략하도록 하겠습니다.
(이전에 다루었던 글들인 JVM 메모리 구조 이해와 static 메서드에 대한 글을 참고!)
그런데 default 메서드를 허용하면서 문제가 생기게 됩니다. 다중 상속을 허용하는 인터페이스의 특성상 구현부가 있는 메서드가
존재한다면 충돌의 문제를 피해갈 수 없다는 것입니다. 그렇다면 이러한 충돌에 대한 문제는 어떻게 해결할 수 있을까요?
바로 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 하여 사용하는 것으로 해결하는 것입니다.
또한 구현과 동시에 상속도 받을 수 있다고 하였는데, 부모 클래스와 이 디폴트 메서드 간의 충돌이 생긴다면 어떻게 해결할까요?
이때는 자동적으로 상속을 해 준 부모 클래스의 메서드가 우선적으로 상속되기 때문에 문제없이 사용할 수 있습니다!