앞서 다룬 상속의 경우, 하나의 클래스가 다른 하나의 클래스하고만 상속관계를 가지지는 않는다. 예를 들어, 동물 클래스는 아주 많은 자식 클래스를 가질 것이다.
이런 경우, 부모 클래스를 아주 상세하게 작성하기는 힘들다. 보통 더 넓은 범주일수록 여러 기준이 모호할 수 밖에 없기 때문이다. 동물 클래스의 예시를 계속 든다면, 먹이를 섭취하는 하나의 행동이라 할 지라도, 무엇을 먹는지, 한번에 삼키는지, 씹어 삼키는지 등 제각각의 방법이 있을 것이다. 그렇기 때문에, 더 상위의 위계에 있는 클래스 일수록 그 내용은 빈약하거나, 아예 정의하지 않고 선언만 해둘 필요가 있다.
한편으로는, 상속 위계에 포함되지는 않지만, 여러 클래스에 적용될 필요가 있는 클래스와 메서드가 있을 수 있다. 예를 들어, 동물원의 동물들에게 백신을 접종하는 클래스 혹은 메서드가 필요하다고 할 때, 백신은 동물원의 동물들 뿐 아니라 (존재한다면) 사람 클래스나 그 외에도 필요할 것이다. 이런 경우라면, 백신 클래스는 동물원 클래스의 상속 위계에만 넣을 수는 없다.
첫번째의 경우, abstract modifier를 통해 문제를 해결할 수 있다. 이를 이용한 클래스는 추상클래스가 된다.
추상 클래스는 인스턴스 변수를 가질 수 있다. 또한, 이를 이용한 생성자도 가질 수 있다.
일단 추상 클래스를 선언하면, 내부에는 반드시 하나 이상의 추상 메서드가 존재해야 한다. 추상 메서드란, 선언은 하였으나 정의는 하지 않은 메서드를 의미한다. 즉, 내용이 없는 메서드이다.
또한, 추상 클래스를 상속하는 자식 클래스는 부모 클래스에 선언된 추상 메서드를 전부 override해야한다.
두번째의 경우 필요한 것이 인터페이스이다. 부모 자식 간의 상속관계가 아니더라도, 일반적인 클래스(concrete)와 추상 클래스는 선언한 인터페이스를 사용할 수 있다.
단, 추상 클래스가 아니라면, 인터페이스를 사용하는 클래스는 인터페이스의 모든 메서드를 정의해주어야한다.
가끔 인터페이스를 이용하는 모든 클래스들에 동일한 메서드가 존재할 수 있다. 예를 들어, 동물원의 동물에게 백신을 놓던, 사람이 백신을 맞던, 백신 접종에 대한 금액을 지불해야 하는 것은 똑같다. 이런 경우, 인터페이스에 메서드를 선언하고, 그 내용을 각각 다른 클래스들 모두가 override 할 수도 있지만, 이 경우 같은 내용을 계속 중복해서 작성하게 된다. 이러한 경우 default 메서드를 인터페이스에 한번에 작성하면, 모든 클래스의 객체들이 사용할 수 있다. 만약, 대부분의 클래스들이 default 메서드를 공유하지만, 공유하지 못하는 클래스가 있는 경우, default 메서드를 override 하는 것을 통해 해결 할 수 있다.
static 메서드를 인터페이스에 사용하는 경우, 일반 클래스에 사용하는 것과 비슷하다. 인터페이스를 사용하는 클래스를 통해 객체 없이 인터페이스의 메서드를 사용할 수 있다. 또한, 인터페이스에 상수를 선언 할 수 있는데, 이 경우 기본적으로 public, static, final modifier를 붙인 것과 같다.
이상의 내용은 edx 플랫폼을 통해 GTx에서 제공하는 Introduction to Object-Oriented Programming with Java 강의의 내용을 개인적으로 정리한 것입니다. 그렇기 때문에, 부정확한 내용 혹은 잘못 이해하고 있는 내용이 있을 수 있으니 양해 부탁드립니다.