추상클래스와 인터페이스

ditt·2020년 10월 13일
0

선언만 있고 구현내용이 없는 클래스이다.

공통점

  • 추상클래스와 인터페이스는 선언만 있고 구현 내용이 없는 클래스다. (자바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부터 인터페이스 역할이 확대되면서 조금 변경되었다.

인터페이스에서 기본적인 구현이 가능해졌다.

  1. Default Method
  • 기본 구현을 갖는 메소드
    (기존에는, 추상메소드를 정의하고 인터페이스를 구현하는 클래스에서 그 추상메소드를 구현하였었는데, 이제는 그 구현을 인터페이스에서 해줄 수 있게 되었다.)
  1. Static Method
  • 클래스의 정적 메소드와 동일
    (유틸성)

코틀린의 인터페이스는?

interface Car {
  //abstract method
  fun oil() 

  //default method
  fun drive(){
    println("Let's go")
  }
}

왜 변경되었을까? (의견)

  • Default Method : 하위호환성을 지켜주면서 인터페이스 변경에 유연하게 대처하기 위함이지 않을까
  • Static Method : 직관성을 위해 인터페이스도 유틸메소드를 가질 수 있게 만듦이지 않을까

참고

profile
Hello, Android

0개의 댓글