인터페이스란 미완성의 클래스, 클래스의 틀만 잡아놓은 것이다. 따라서 추상클래스보다 추상도가 높다고 할 수 있다.
인터페이스의 핵심은 멤버로 추상메서드랑 상수만을 포함할 수 있다는 것이다. JDK1.8부터는 default메서드와
static메서드도 추가가 가능하지만 본질은 추상메서드랑 상수이다.
인터페이스의 선언
interface 인터페이스이름 {}
인터페이스의 멤버
interface 인터페이스이름 {
public static final 타입 상수이름 = 값; // public static은 생략이 가능하다.
public abstract 반환타임 메서드이름(); // public abstract는 생략이 가능하다.
}
인스턴스의 구현
상속은 extends 키워드를 사용했지만 interfece는 implements키워드를 사용한다.
Class a implements b {
// 인터페이스의 추상클래스 오버라이딩
} // 클래스 a가 인터페이스 b를 구현한 것이다.
인터페이스는 멤버로 추상메서드를 가진다. 따라서 인터페이스를 객체화시키지는 못하고 인터페이스를 implements 시켜서 구현한 인스턴스를 인터페이스타입의 변수가 참조하는 것은 가능하다. 또한 인터페이스로 c++의 다중상속을 흉내 낼 수 있다.
다중상속의 문제점은 부모 클래스에 이름이 같은 메서드가 있으면 충돌이 발생하기 때문에 문제가 발생하지만 인터페이스를 이용해 다중상속을 받으면 자식클래스에서 구현(오버라이딩)을 하기 때문에 충돌의 우려가 없다.
※또한 인터페이스는 서로 다른 클래스들을 같은 집합에 포함시키기 위해서 사용하기도 한다.
※메서드의 리턴타입이 인터페이스타입인 경우에는 인터페이스를 구현한 인스턴스를 반환해야 한다는 의미이다.
이 밖에도 인터페이스는 인터페이스를 구현한 인스턴스의 쉘의 역할을 하기 때문에 객체 간의 결합도가 낮아진다는 장점이 있다!
인터페이스의 static메서드와 default메서드
JDK1.8부터 인터페이스에 static메서드와 default메서드의 추가가 가능하게 되었다.
static메서드와 default메서드를 추가하게 된 이유는 인터페이스에 수정해야 할 경우 무조건 abstract메서드를 추가해야 했기 때문에 인터페이스를 구현한 클래스들인 추가된 추상메서드를 무조건 전부 오버라이딩을 해야 한다는 문제점이 발생한다. 그래서 인터페이스에 default메서드를 추가가 가능하게 만들어주었다. static도 비슷하게 인터페이스에 넣지를 못하니 static메서드를 분리시켜주었어야 했는데 이를 보안하고자 추가되었다.
다만, 이렇게 되었을 경우 c++처럼 충돌 문제가 발생하게 된다.
( interface에 static메서드와 default메서드를 추가할 경우 statiuc키워드와 default키워드는 생략이 불가능하다. 하지만 public은 생략이 가능하다. )
충돌 문제의 해결법
1. 인터페이스와 인터페이스간의 default메서드 충돌
- 인터페이스를 구현한 클래스에서 default메서드를 오버라이딩해면 해결
2. 부모클래스의 메서드와 인터페이스의 default메서드 간의 충돌
- 이 경우에는 부모클래스의 default메서드가 상속되고 인터페이스의 default메서드는 무시된다.
'Java' 카테고리의 다른 글
익명 클래스(anonymous class) (0) | 2023.05.18 |
---|---|
초기화 블록 (0) | 2023.05.15 |
추상클래스 (0) | 2023.05.11 |
메모리구조(stack, heap, method area) (0) | 2023.05.04 |
가변배열, 가변인자 (0) | 2023.05.02 |