14. JAVA의 인터페이스(Interface), Adapter, 마커인터페이스, 모호성
인터페이스(Interface)
인터페이스(interface)는 틀입니다.
인터페이스는 상수와 메소드 선언들의 집합입니다.
인터페이스는 추상클래스를 고도화 시킨 문법입니다.
인터페이스를 사용하는 이유!
※ 다중 상속
여러 부모 클래스를 상속하는 것을 다중 상속이라고 합니다.
JAVA는 모호성 때문에 다중 상속을 지원하지 않습니다.
하지만 JDK8버전 부터는 인터페이스에 default 메소드 선언을 허용하며,
여러 개를 지정할 수 있는 인터페이스 특성 상 다중 상속과 비슷하게 구현할 수 있습니다.
인터페이스 정의
인터페이스는 추상 메소드와 상수만 가집니다.
인터페이스는 존재하는 모든 멤버 변수는 상수로 사용되며, 모든 메소드의 접근제한자는 public이며 추상 메소드입니다.
따라서 모든 변수에 final static을 붙이거나, 선언되는 메소드에 public abstract 키워드를 붙일 필요가 없습니다.
인터페이스 사용
클래스에서 인터페이스를 사용하기 위해서는 implements 키워드를 사용합니다.
implements는 여러 개의 인터페이스를 나열하여 다중 상속을 구현할 수 있습니다.
클래스에 둘 이상의 인터페이스를 구현한다면 인터페이스들은 콤마(,)로 구분됩니다.
인터페이스 사용되었다면 사용된 인터페이스에 정의된 모든 메소드가 클래스 내에 반드시 오버라이딩되어 구현이 되어야 합니다. 그리고 인터페이스의 메소드를 재정의 할 때는 반드시 public 접근 제한자로 지정해 줘야 한다.
Adapter
인터페이스를 클래스에 바로 지정하면 모든 메소드에 강제성이 부여되어서 전부 다 구현해야 합니다.
하지만 일반적인 상황에서는 모든 것이 아닌, 필요한 메소드를 골라서 재정의해야 합니다.
인터페이스를 직접 지정하지 않고 다른 클래스에 지정한 후 바디를 만들어 놓는다면,
강제성이 소멸되고 이 클래스를 상속받아서 필드를 구현한다면, 골라서 재정의할 수 있게 됩니다.
이 때 중간에서 강제성을 없애주는 클래스를 추상클래스로 선언하며, 클래스 이름 뒤에
Adapter를 붙여서 목적을 알려줍니다.
예를 들면 위의 Tiger클래스에서는 Pet의 인터페이스를 implements 할 수가 없습니다.
왜냐하면 호랑이는 일반적으로 손을주거나(getHands), 애교를 부리는(charms) 메소드를 사용할 수 없기 때문에
재정의를 내려서 사용 할 수가 없습니다.
이럴때 강제성을 없애주는 Adapter 클래스를 만들어 상속을 통해 사용한다면 이런 문제를 해결할 수 있습니다.
마커 인터페이스(MarkerInterface)
※ 인터페이스도 타입이다.
클래스들을 그룹화 하기 위한 목적으로 사용합니다.
인터페이스는 지정한 클래스의 부모이며, 모든 자식은 부모의 타입이므로
마커 인터페이스를 지정받은 클래스들이 하나의 타입으로 묶이게 됩니다.
Animal 이란 부모클래스가 있습니다.
이제 하위클래스로 동물들을 만들어주고나서, 그 동물이 육식동물인지, 초식동물인지 구분하려고 합니다.
각자의 클래스가 어떤 타입인지 알 수가 없습니다.
그래서 육식동물, 초식동물 인터페이스를 만들고 각각의 클래스에 구현을 해준다면
타입이 하나로 묶일 수가 있습니다.
구현된 클래스는 해당 인터페이스의 자식이므로 같은 타입으로 묶어서 비교를 할 수가 있습니다.
따라서 이렇게 구현을 할 수가 있습니다.
모호성
하나의 자식이 여러 부모를 상속받을 때 부모 필드에 동일한 이름의 필드가 있다면,
어떤 부모의 필드인지 알 수가 없습니다. 이를 모호성이라고 부릅니다.
모호성 해결 방법
- 상황1 : 두 개의 인터페이스 내에 같은 이름과 매개변수의 메소드가 선언되어 있습니다.
- 해결 : 자식 클래스에서 재정의하여 사용합니다.
- 상황2 : 부모 클래스의 메소드와 인터페이스의 디폴트 메소드의 이름과 매개변수가 같습니다.
- 해결 : 부모 클래스의 메소드가 사용됩니다.
이상으로 인터페이스에 대해서 알아보았습니다.
'KoreaIt Academy > JAVA' 카테고리의 다른 글
16. JAVA의 API, 외부 API를 이용하여 문자보내기 (2) | 2021.07.21 |
---|---|
15. JAVA의 내부클래스, 익명클래스(Anonymous inner class) (0) | 2021.07.20 |
13. JAVA의 추상클래스(abstract class) (0) | 2021.07.19 |
12. JAVA의 UpCasting(업캐스팅), DownCasting(다운캐스팅), instanceof (0) | 2021.07.18 |
11. JAVA의 접근 제한자 (0) | 2021.07.18 |
댓글