
1. Interface의 기능
1. 구현을 강제하는 기능
구현하는 클래스에서 interface의 abstract 메소드를 강제로 구현하도록 한다
2. 호출할 수 있는 메소드를 제한하는 기능 (다형성을 제공한다)
interface1, interface2와 interface1,2를 구현한 class1이 있을 때,
interface1 객체명 = new class1();
으로 객체를 생성하는 경우, 객체명을 통해 interface1의 메소드만 호출할 수 있고,
class1 객체명 = new class1();
으로 객체를 생성하는 경우, 객체명을 통해 interface1,2의 메소드를 모두 호출할 수 있다
3. 의존성을 역전하여 결합도를 낮춘다
구상체가 아닌 추상체(interface)와 결합을 하는 경우, 의존도를 낮추는 것이라고 생각할 수 있음
2. default method
interface를 implement 하는 class는 반드시 모든 abstract 메소드를 오버라이드 해야 한다.
불필요한 메소드를 강제로 오버라이드해야 하는 경우의 불편함이 존재
이 경우, 어댑터 디자인 패턴을 사용할 수 있다
어댑터 디자인 패턴이란?
interface를 implement하여 모든 abstract를 오버라이드한 (다만 구현부가 비어있도록) adapter class를 하나 생성한다
이후 실제 구현 class에서는 interface를 implement하는 것이 아니라 adapter class를 extends하도록 하는 것
⇒ 단점은 자바는 다중 상속이 불가능 하므로, 구현 class에서 이미 extends하고 있는 다른 class가 있는 경우에는 사용할 수 없음
어댑터 디자인 패턴의 이러한 단점을 개선하기 위해 java8 이후부터 default 메소드가 도입되었다
다만 interface 내의 default 메소드는 일반 클래스와 다르게 default 접근 제한자를 반드시 명시해야 한다
3. functional interface
abstract 메소드가 하나밖에 없는 interface를 의미함
4. 익명 클래스
interface의 객체는 생성할 수 없으므로 interface의 메소드를 사용하기 위해서는 interface를 implements한 클래스의 객체를 생성해야하는데, 이렇게 하다보면 불필요한 중간 클래스들이 많이 생성하게 됨
⇒ 클래스 이름이 필요 없는 일회용 클래스가 있으면 좋겠다! 해서 만들어진게 익명 클래스
new interface이름 () {
@Override
}.메소드 이름();
위와 같은 형태의 익명 클래스의 객체를 만들어 메소드를 호출할 수 있다

1. Interface의 기능
1. 구현을 강제하는 기능
구현하는 클래스에서 interface의 abstract 메소드를 강제로 구현하도록 한다
2. 호출할 수 있는 메소드를 제한하는 기능 (다형성을 제공한다)
interface1, interface2와 interface1,2를 구현한 class1이 있을 때,
interface1 객체명 = new class1();
으로 객체를 생성하는 경우, 객체명을 통해 interface1의 메소드만 호출할 수 있고,
class1 객체명 = new class1();
으로 객체를 생성하는 경우, 객체명을 통해 interface1,2의 메소드를 모두 호출할 수 있다
3. 의존성을 역전하여 결합도를 낮춘다
구상체가 아닌 추상체(interface)와 결합을 하는 경우, 의존도를 낮추는 것이라고 생각할 수 있음
2. default method
interface를 implement 하는 class는 반드시 모든 abstract 메소드를 오버라이드 해야 한다.
불필요한 메소드를 강제로 오버라이드해야 하는 경우의 불편함이 존재
이 경우, 어댑터 디자인 패턴을 사용할 수 있다
어댑터 디자인 패턴이란?
interface를 implement하여 모든 abstract를 오버라이드한 (다만 구현부가 비어있도록) adapter class를 하나 생성한다
이후 실제 구현 class에서는 interface를 implement하는 것이 아니라 adapter class를 extends하도록 하는 것
⇒ 단점은 자바는 다중 상속이 불가능 하므로, 구현 class에서 이미 extends하고 있는 다른 class가 있는 경우에는 사용할 수 없음
어댑터 디자인 패턴의 이러한 단점을 개선하기 위해 java8 이후부터 default 메소드가 도입되었다
다만 interface 내의 default 메소드는 일반 클래스와 다르게 default 접근 제한자를 반드시 명시해야 한다
3. functional interface
abstract 메소드가 하나밖에 없는 interface를 의미함
4. 익명 클래스
interface의 객체는 생성할 수 없으므로 interface의 메소드를 사용하기 위해서는 interface를 implements한 클래스의 객체를 생성해야하는데, 이렇게 하다보면 불필요한 중간 클래스들이 많이 생성하게 됨
⇒ 클래스 이름이 필요 없는 일회용 클래스가 있으면 좋겠다! 해서 만들어진게 익명 클래스
new interface이름 () {
@Override
}.메소드 이름();
위와 같은 형태의 익명 클래스의 객체를 만들어 메소드를 호출할 수 있다