인터페이스
일종의 추상클래스
- 추상클래스보다 추상화 정도가 높아 일반 메서드나 멤버변수를 구성원으로 가질 수 없다.
- 실제 구현된 것이 전혀 없는 기본 설계도
- 오직 추상메서드와 상수만을 멤버로 가질 수 있다.
- 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.
- 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다.
인터페이스의 작성
class 대신 interface를 사용한다는 것 외에 클래스 작성과 동일하다.
interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
제약사항
모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
JDK1.8부터 인터페이스에 static메서드와 디폴트 메서드의 추가를 허용한다.
인터페이스의 상속
클래스와 달리 다중상속이 허용된다.
인터페이스는 Object클래스와 같은 최고 조상이 없다.
인터페이스의 구현
클래스를 상속받는 것과 같으며 extends 대신 implements를 사용한다.
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서드를 구현해야 한다.
}
- 인터페이스의 메서드 중 일부만 구현한다면, 추상클래스로 선언해야 한다.
- 상속과 구현을 동시에 할 수도 있다.
인터페이스를 이용한 다형성
인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있으며 인터페이스 타입으로의 형변환도 가능하다.
Fightable f = (Fightable)new Fighter();
또는
Fightable f = new Fighter();
인터페이스를 메서드의 매개변수 타입으로 지정할 수 있다.
void attack(Fightable f) {
...
}
인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
Fightable method() {
...
Fighter f = new Fighter();
return f;
}
리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.
인터페이스의 장점
1. 개발시간을 단축시킬 수 있다.
2. 표준화가 가능하다.
3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
4. 독립적인 프로그래밍이 가능하다.
인터페이스의 이해
인터페이스를 이해하기 위해 염두에 두고 있어야 할 두 가지 사항
- 클래스를 사용하는 쪽(User)과 클래스를 제공하는 쪽(Provider)이 있다.
- 메서드를 사용(호출)하는 쪽(User)에서는 사용하려는 메서드(Provider)의 선언부만 알면 된다.
인터페이스는
두 대상(객체) 간의 연결, 대화, 소통을 돕는 '중간 역할'을 한다.
선언과 구현을 분리시키는 것을 가능하게 한다.
디폴트 메서드
인터페이스에 새로운 메서드를 추가할 경우 문제가 발생한다. 새로운 메서드를 추가한다는 것은 새로운 추상 메서드를 추가한다는 것인데, 이 경우 해당 인터페이스를 구현한 기존의 모든 클래스들이 새로 추가된 메서드를 구현해야 한다.
이를 해결하기 위해 디폴트 메서드를 사용한다.
디폴트 메서드는 추상 메서드가 아니기 때문에 디폴트 메서드가 새로 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 된다.
interface MyInterface {
void method();
default void newMethod() {}
}
새로 추가된 디폴트 메스다가 기존의 메서드와 이름이 중복되어 충돌하는 경우 해결 규칙
1. 여러 인터페이스의 디폴트 메서드 간의 충돌
- 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야 한다.
2. 대폴트 메서드와 조상 클래스의 메서드 간의 충돌
- 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
'JAVA' 카테고리의 다른 글
예외처리 (0) | 2023.03.08 |
---|---|
[OOP] 내부 클래스(inner class) (0) | 2023.03.08 |
[OOP] 추상클래스 (0) | 2023.03.08 |
[OOP] 다형성(polymorphism) (0) | 2023.03.08 |
[OOP] 제어자(modifier) (0) | 2023.03.07 |