인터페이스와 추상 클래스는 비슷하면서도 구현 방식과 목적이 다르기 때문에 각각의 특징이 있다.
🫡유사점으로 둘다 직접 객체화를 할 수 없다.(new생성불가). 또, 추상 메서드를 통해 하위클래스에게 구현을 강제한다. 계층 구조 형성을 통한 다형성을 지원한다. (여기서 계층 구조란 하위 클래스들이 상위 클래스의 속성과 메서드를 물려받아 구현하는 것을 말한다.)
🍄차이점은 인터페이스는 메서드의 "껍데기"만을 제시해준다. 여기서 껍데기는 메서드의 이름, 매개변수, 반환값의 타입, 예외처리 등만을 선언한 상태를 말한다. 그리고 나머지 책임은 해당 인터페이스를 구현하는 클래스에게 있다.
저번에 말한 거와 같이 인터페이스는 클래스와의 상호작용을 정의하기 위한 일종의 계약서의 역할을 하면서, 상속과는 달리 다중 구현이 가능하다.
반면에, 추상 클래스는 인스턴스 변수나 일반 메서드를 포함하고 있는 경우가 있다. 하지만 반드시 메서드 중에서 추상 메서드(abstract method)가 하나 이상 있어야 한다. 추상 클래스다 보니 추상 메서드를 포함 하고 있기 때문에 자식 클래스는 반드시 이 추상 메서드는 구현해야 한다. 결국 추상클래스의 공통적인 특성을 구현하고, 구체적인 특성은 하위 클래스에서 따로 구현해야 한다. 추상클래스는 단일 상속만 가능하다. 따라서 추상 클래스는 자식 클래스들에게 공통된 구현 로직을 상속하기 위한 용도로 사용된다.
🎯간단하게 인터페이스는 클래스들과의 상호작용을 위해 일종의 규칙(정의한 메서드들)을 제공하는 역할을 하고, 추상 클래스는 공통된 구현 로직을 상속하기 위한 용도라고 보면 된다.