본문 바로가기

Java

인터페이스 5

인터페이스 상속

인터페이스 끼리 상속도 가능하다. 다중상속이 불가능한 클래스와는 달리 인터페이스는 다중상속이 가능하다. 

하능 방법은 일반적인 상속과 같다.

ex)

public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2{....}

하위인터페이스를 구현하는 구현클래스는 하위인터페이스가 상속받는 모든 상위인터페이스의 추상메소드도 전부 구현해야한다. 

구현클래스는 하위인터페이스, 상위인터페이스 모두 구현하기 때문에 하위, 상위 모든 타입의 객체로 변환이 가능하다. 

예)

하위인터페이스 변수명 = new 구현클래스();

상위인터페이스1 변수명 = new 구현클래스();

상위인터페이스2 변수명 = new 구현클래스();


상위인터페이스를 상속받은 하위 인터페이스타입으로 변환하면 모든 상위인터페이스의 메소드를 사용할 수있지만

상위인터페이스 타입으로 변환하면 해당 상위인터페이스내부의 메소드만 사용이가능하다.

 당연한 말이 지만 하위인터페이스 C는 ,A와 B를 상속 받아 그 내부에 있는 메소드 A,B를 전부 접근이 가능하지만

상위 인터페이스 A,B 안에는 각각의 메소드 밖에 없기 때문이다. 


디폴트 메소드와 인터페이스 확장

인터페이스의 개념에 맞지않는 디폴트 메소드

일반적인 인터페이스는 일단 인터페이스에서 추상메소드를 선언 >> 구현클래스에서 implements로 인터페이스를 상속받고 

추상메소드전체를 구현 >> 메인클래스에서 인터페이스타입 변수를 만들고 구현클래스를 대입

이런 방식으로 사용한다.  구현클래스에서는 인터페이스의 모든 추상메소드를 구현화 하지않으면 에러가 난다.

하지만 자바 8부터나온 디폴트 메소드는??

인터페이스에서 구현을 끝내기 때문에 바로 메인클래스에서 인터페이스.디폴트메소드(); 로 사용가능할듯 하지만 

구현클래스 없이는 사용이 불가능하다. 처음 이걸 봤을때 대체 이걸 왜 만들었지?? 라는 생각을 했다.

바로 인터페이스의 확장 때문이다. 일단 그림으로 예를 들어보자

보통의 인터페이스를 사용하고 있다. 인터페이스 하나를 많은 구현객체가 구현 중이다 

이때 필요에 의해 인터페이스A에 새로운 추상메소드A2를 선언한다면???

당연히 오류가 난다. 구현클래스는 인터페이스의 모든 추상메소드를 구현하고 있어야하는대 

추상메소드A2는 새롭게 선언되었기 때문에 구현클래스에는 구현되어있지 않다.

구현 클래스가 1개 뿐이라면 그냥 구현해버리면된다. 하지만 그림과 같이 구현 클래스가 많다면???

 모든 구현 클래스에 메소드A2를 구현해야만 한다..

하지만 메소드A2가 디폴트 메소드라면 어떨까?? 디폴트메소드로 메소드A2를 선언하고 구현까지하면 

이전에 있던 구현클래스들은 아무상관없이 잘 사용할수 있다. 디폴드 메소드A2 도 호출해서 사용이 가능해진다.

중요한것은 디폴트 메소드를 선언한 다음부터 만드는 구현클래스들이다. 

디폴트메소드를 선언한뒤 만들어지는 구현클래스에서 메소드A2에 원래 구현된것과는 다른 내용을 구현하고 싶다면

간단하게 재정의(Override)로 얼마든지 사용이 가능해진다. 

이전에 있던 구현클래스들을 수정하지 않고도 새롭게 메소드를 선언, 재정의가 가능해지는것

이것이 인터페이스의 확장이다.



'Java' 카테고리의 다른 글

인터페이스4  (0) 2019.01.19
인터페이스3  (0) 2019.01.18
인터페이스(Interface)2  (1) 2018.12.31
인터페이스 (Interface)  (0) 2018.12.29
추상클래스(abstract)  (0) 2018.12.23