선언만 있고 구현내용이 없는 클래스이다.
공통점
- 추상클래스와 인터페이스는 선언만 있고 구현 내용이 없는 클래스다. (자바8부터 인터페이스에 default method 구현이 가능해졌지만 일반적으로 인터페이스는 구현이 없다.)
- 따라서 인터페이스와 추상클래스를 가지고 새로운 인스턴스(객체)를 생성할 수 없다.
- 추상클래스를 extends로 상속받아 구현한 자식클래스나 인터페이스를 implements 하고 구현한 자식클래스만이 객체를 생성할 수 있다.
- 결국 자식클래스가 무언가 반드시 구현하도록 위임해야할 때 사용해야 한다.
추상클래스
- 비슷한 기능을 수행하는 객체들일때
- 추상클래스의 목적은 말 그대로 공통적인 기능을 하는 객체들의 추상화다.
- 기존의 클래스에서 공통된 부분을 추상화하여 상속하는 클래스에게 구현을 강제화
- 추상 클래스를 상속받은 경우는 일반 메소드가 아닌 추상 메소드만을 구현했다.
- is-a(고정템플릿이 있고, 그 흐름을 사용하며 변화될 가능성이 희박함)
- non-static, non-final, public, private, protected 메소드를 사용할 수 있다.
- 여러개의 가까운 클래스들(is-a관계가 형성될) 사이에 동일한 코드를 공유해서 사용하고 싶을 때
- 추상클래스를 상속한 클래스들이 많은 공통메소드들과 필드의 public보다 다양한 접근제어자에 의해 사용하고 싶을 때
- non-static과 non-final 필드를 선언하고 싶을 때. 결과적으로 객체들의 상태를 메소드에서 접근하고 수정할 수 있게 됨.
인터페이스
- 비슷하지 않은 기능을 수행하는 객체들일때
- 인터페이스는 구현하는 모든 클래스에 대해 특정한 메서드가 반드시 존재하도록 강제하는 역할이다.
- 구현 객체의 같은 동작을 보장하기 위한 목적
- 클래스가 아니기 때문에 인터페이스는 다중 상속이 가능
- 인터페이스를 상속받은 경우는 모든 메소드를 구현(overriding)
- has-a(연결고리만 제공해서 유연성 강화, 고정템플릿 없음)
- public, static, final을 상속할 수 있고 모든 상속가능한 메소드는 public이다.
- 크게 상관없는(has-a)클래스들이 너의 인터페이스를 구현해야 할 필요가 있을때(comparable등)
- 특정 데이터타입의 행위를 특별하게 구현하기 원하지만 누가 그것의 행위를 구현했는지에 대한 관심은 없을때
- 다중 구현상속의 이점을 누려야 할 때
java 8부터 인터페이스 역할이 확대되면서 조금 변경되었다.
인터페이스에서 기본적인 구현이 가능해졌다.
- Default Method
- 기본 구현을 갖는 메소드
(기존에는, 추상메소드를 정의하고 인터페이스를 구현하는 클래스에서 그 추상메소드를 구현하였었는데, 이제는 그 구현을 인터페이스에서 해줄 수 있게 되었다.)
- Static Method
코틀린의 인터페이스는?
interface Car {
fun oil()
fun drive(){
println("Let's go")
}
}
왜 변경되었을까? (의견)
- Default Method : 하위호환성을 지켜주면서 인터페이스 변경에 유연하게 대처하기 위함이지 않을까
- Static Method : 직관성을 위해 인터페이스도 유틸메소드를 가질 수 있게 만듦이지 않을까
참고