구조의 틀을 잡아주는 느낌, 클래스가 반드시 해당 메서드를 구현하도록 강제하는 기능
→ 다형성과 코드 일관성 확보
java 8부터 default 메서드와 static 메서드가 추가됨
메서드의 기본 구현을 제공하기 위해 도입
이걸 만든 이유는 java8부터 람다, stream이 생겼는데, List와 같은 컬렉션에서 사용하려고 하니까 하위 클래스들의 메서드도 다 수정해야 하는게 불편했음 → 그래서 default 메서드로 만들고 수정 안해도 되고 해도 되게 만들었음 ⇒ 근데 이로 인해 추상클래스와 모호하게 되긴 함
즉, 기존 코드와의 호환성 유지를 위해 도입했다는 것!
다른 일반적인 static 메서드와 같은 의미를 가짐
java 9부터 private 메서드와 private static 메서드가 추가됨
static, default 메서드 둘다 호출 가능
근데 default 메서드에서 호출할 때는 static 메서드에서 호출하는 방식이랑 같다고 함
공통적으로 사용하는 기능을 제공 (일반 메서드), 일부 메서드는 반드시 자식 클래스에서 구현하도록 강제하는 클래스 (추상 메서드)
클래스는 메서드가 구현돼 있기 때문에, 여러 클래스를 상속받으면, 같은 이름의 메서드가 서로 다르게 구현돼 있을 경우가 있다. 이럴 경우 어떤 메서드를 호출해야 할지 모호해지는 다이아몬드 상속 문제가 발생할 수 있기 때문에 단일 상속만 가능함. 하지만 java 8 이후부터 인터페이스도 메서드에 구현 기능을 사용할 수 있어 이 문제가 발생할 수 있게 됐음. 이 문제는 반드시 오버라이딩 하는 걸로 문제를 해결함.
전체적인 비교

참고자료