추상클래스 / 인터페이스 차이
추상클래스
추상 메서드를 하나 이상 가지고 있는 클래스
인터페이스
추상 메서드의 집합. 하지만 자바 8부터 default 접근 제어자를 허용하면서 인터페이스도 구현이 가능해졌습니다.
왜 인터페이스에서 구현을 가능하게 했을까요?
자동차를 만들기 위해 Car 인터페이스를 다음과 같이 선언했습니다
그 후 이것을 구현한 아반떼 클래스를 만들었습니다
코드는 문제없이 잘 동작했고 시간이 흘러 Car 인터페이스를 상속하여 구현한 자동차 클래스가 100만개 였다고 가정해볼게요
그러다가 Car가 출발할 수 있도록 start() 추상 메서드를 만들어 달라는 요구사항이 들어왔습니다.
바로 만들어 줍시다
그후 인터페이스를 implements 받은 클래스들을 구현하려고 생각해보니..
100만개의 클래스가 컴파일 에러가 나네요.. 출발하는 기능이 동일한데 일일히 중복된 코드 100만개를 클래스마다 넣어야 할까요???
이러한 문제를 해결하기 위해 등장한 것이 default 접근 제어자입니다.
만약 다르게 출발하는 자동차가 있다면 start() 메서드를 재정의 하면 됩니다.
공통점
추상 메서드를 선언하고 구현을 자식클래스에 강제한다.
인스턴스화 불가능
차이점
디폴트 메서드가 생기면서 추상 클래스와의 차이점이 모호하다 라는 궁금증이 생길 수 있는데요.
인터페이스의 변수는 기본적으로 public static final 이며, 메서드는 public abstract 인 반면, 추상클래스는 static이나 final이 아닌 필드를 지정할 수 있고 public, protected, private 메서드를 가질 수 있습니다.
인터페이스는 생성자를 가질 수 없지만 추상클래스는 생성자를 가질 수 있습니다.
또한 인터페이스는 다중 상속을 허용하지만 추상클래스는 다중 상속을 허용하지 않습니다.
언제 추상클래스, 인터페이스를 사용해야 할까
추상 클래스
- 관련성이 높은 클래스 간에 코드를 공유하고 싶은 경우
- 추상클래스를 상속받은 클래스들이 공통적으로 가지는 메소드와 필드가 많거나, pubilc 이외의 접근 제어자 사용이 필요한 경우
- non-static, non-final 필드 선언이 필요한 경우. 즉, 각 인스턴스에서 state 변경을 위한 메서드를 선언할 수 있다
인터페이스
- 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우에 사용. 예를 들어, Comparable 인터페이스는 여러 클래스들에서 구현되는데, 구현 클래스간의 관련성이 없는 경우가 대부분임.
- 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지 신경쓰지 않는 경우
- 다중상속을 허용하고 싶은 경우
참고
https://yaboong.github.io/java/2018/09/25/interface-vs-abstract-in-java8/
댓글