interface란?
구체화하는 클래스가 반드시 제공해야하는 메소드의 목록을 말함(계약 기반 프로그래밍)
서로 논리적으로 관계가 없지만 같은 이름의 메소드를 제공하는 클래스를 하나로 그룹핑하여 주는 역할을 함
=> 코드 공유가 목적이 아님(subtyping)
interface와 클래스 정의 비교
- interface는 멤버 변수를 가질 수 없다.
- 원래는 추상 메소드만 정의할 수 있었음(선언만 가능)
- 추상이지만 abstract 수식어를 사용하지 않아도 되고 public 수식어를 사용하지 않아도 기본적으로 public 접근 권한을 가짐
- 자바 8부터는 기본 메소드(default 키워드로 수식)를 정의 할 수 있으며, static 메소드도 정의할 수 있음 + 자바 9부터는 private 메소드를 정의할 수 있음
- 하지만 여전히 인스턴스를 생성할 수 없음
- interface를 구현하면 그 interface에 정의되어 있는 모든 메소드를 무조건 구현해야 함
interface와 상속
A 클래스가 F interface를 구현하고 있을 때 B가 A의 자식 클래스이면 별도 표기 없이 B도 자동으로 F를 구현하고 있는 클래스임
interface간 상속
- 한 interface를 다른 interface가 상속받을 수 있음
- 한 interface는 여러 개의 interface를 상속 받을 수도 있음
전략 패턴
원래 bird의 fly() 부분에 새가 날라다니는 부분을 코드 구현해야되는데 그렇지않았다.=> 다른 클래스를 통해 구현하고 있다.(has-a로 모델링 됨)
날라다니는 클래스들을 구현.
관계가 고정되어 있지 않기때문에 관계를 바꿈(소유함)으로써 기능을 바꾼다.(이렇기 때문에 실행시간에도 바꿀 수 있다. (OCP)
이때 모두 doFly()를 가져야 하기 때문에 interface가 중요!