*본 게시물은 마이자몽님의 블로그를 참고하여 작성하였으며, 글 하단에 출처를 기록해 두었음을 밝힙니다.
*본 게시물은 개인 공부를 기록하기 위해 작성하였으며, 내용에 오류가 있을 수 있음을 밝힙니다.
본인은 지금까지 추상 클래스와 인터페이스에 대해 대충은 알고있었지만 정확히 언제, 왜 사용하는지를 알지 못했었다. 오늘 공부를 하다가 관련 내용이 나왔는데, 이제라도 정확히 공부해 두자라는 생각으로 GPT와 구글 검색을 통해 공부를 한 후 이 글을 작성하였다.
추상 클래스란?
추상 클래스는 클래스 선언 시 앞에 예약어 'abstract'를 붙여 선언한다. 또한, 클래스 내에 추상 메서드를 선언하여 상속을 통해 자손 클래스에서 완성하도록 유도하는 클래스이다. 추상 클래스 내의 일반 메서드는 그대로 상속받아서 사용해도 되지만, 내용이 없는 추상 메서드는 자식 클래스에서 반드시 구현을 직접 해줘야 한다. 클래스 내에 추상 메서드가 하나라도 있으면 추상 클래스이다.
인터페이스란?
인터페이스도 추상 클래스와 유사하게 일반 클래스를 작성하는데 도움을 주는 목적으로 작성한다. 다만, 추상 클래스와 달리 다중상속이 가능하다.
추상 클래스와 인터페이스의 차이
1. 추상 클래스는 단일 상속만 가능하지만, 인터페이스는 다중 구현이 가능하다.
2. 추상 클래스는 생성자가 있지만 인터페이스는 생성자가 없다. (객체는 추상 클래스와 인터페이스 모두 생성할 수 없다.)
3. 추상 클래스에서는 private, protected 등의 접근 제어자를 자유롭게 사용 가능하지만 인터페이스에서는 모든 메서드는 기본적으로 public을 사용한다.
추상 클래스를 사용하는 이유
추상 클래스는 공통 기능을 구현해놓고 하위 클래스에서 재사용하고 싶을 때 사용하여 중복 코드를 줄일 수 있다. 예를 들어 Vehicle이라는 추상 클래스에서 가속 기능과 감속 기능을 구현해 놓고 하위 클래스인 Car 클래스, Ship 클래스에서 Vehicle 클래스를 상속받아 재사용하면 Car 클래스, Ship 클래스 각각에서 가속 기능, 감속 기능을 구현하지 않아도 되므로 중복 코드를 줄일 수 있다. 또한, 상위 클래스에서는 어떻게 동작할지 알 수 없는 부분을 추상 메서드로 남겨두고, 자식 클래스가 구체적으로 구현하게 할 때 사용한다. 즉, 상위 클래스는 공통된 전체 로직의 틀만 제공하고 구체적인 동작은 하위 클래스에게 맡기는 것이다.
인터페이스를 사용하는 이유
인터페이스는 추상 클래스와 달리 다중상속이 가능하다. 따라서 다중 기능을 조합하고 싶을 때는 추상 클래스가 아니라 인터페이스를 사용한다. 예를 들어 Bmw라는 클래스는 SportMode라는 기능과 Movable이라는 기능을 모두 필요하므로 public class Bmw extends Car implements SportMode, Movable { ... }에서 처럼 Car라는 추상 클래스를 상속받고, SportMode, Movable라는 2개의 인터페이스를 콤마(,)로 연결하여 다중 상속한 것을 볼 수 있다.
또한, 서로 다른 클래스에 공통 기능을 강제하고 싶을 때에도 인터페이스를 사용한다.
**참고한 블로그**
마이자몽, 2020년 2월 8일, https://myjamong.tistory.com/150