본문 바로가기

복습용

15-2.인터페이스 활용

한 클래스가 여러 인터페이스를 구현하는 경우

한 클래스가 여러 클래스를 상속받으면 메소드의 호출이 모호해지는 문제가 발생할 수 있습니다.

하지만 인터페이스는 한 클래스가 여러 인터페이스를 구현할 수 있습니다.

 

Buy, Sell 의 두 인터페이스를 생성

 

Buy 인터페이스에 추상 메소드 buy()가 선언되어 있고, Sell 인터페이스에 추상 메소드 Sell()이 선언되어 있습니다.

 

 

 

인터페이스 2개를 구현시킨 Customer

인터페이스는 구현 코드나 멤버 변수를 가지지 않기 때문에 여러 개를 동시에 구현할 수 있습니다. 두 인터페이스에 이름이 같은 메소드가 선언되었다고 해도 구현은 클래스에서 이루어지므로, 어떤 메소드를 호출해야 하는지 모호하지 않은 것입니다.

 

 

 

 

 

두 인터페이스의 디폴트 메소드가 중복되는 경우

디폴트 메소드는 인스턴스를 생성해야 호출할 수 있는 메소드이기 때문에, 다음처럼 이름이 같은 디폴트 메소드가 두 인터페이스에 있으면 문제가 됩니다.

 

 

Buy, Sell 에 각각 존재하는 default order 메소드

Buy와 Sell 인터페이스 모두 order() 디폴트 메소드를 가지고 있습니다. 이상태에서 두 인터페이스를 모두 구현하면 Customer 클래스에서는 디폴트 메소드가 중복되었으니 재정의하라는 오류 메세지가 뜹니다.

 

 

 

Customer 클래스에서 재정의된 order 메소드

Customer 클래스에서 디폴트 메소드를 재정의하면, Customer 클래스를 생성하여 사용할 때 재정의된 메소드가 호출됩니다. 즉 다음처럼 호출하면 Customer에서 재정의된 order()메소드가 호출됩니다.

 

 

 

구현된 Customer의 클래스를 실행하는 프로그램

여기에서 주의할 점은 customer가 Buy형으로 변환되고 buyer.order()를 호출하면 Buy에 구현한 디폴트 메소드가 아닌 Customer 클래스에 재정의한 메소드가 호출된다는 사실입니다. 이는 자바 가상 메소드 원리와 동일합니다.

 

 

 

 

 

인터페이스의 상속

인터페이스 간에도 상속이 가능합니다.인터페이스 간 상속은 구현 코드를 통해 기능을 상속 하는것이 아니므로 형 상속(type inheritance)이라고 부릅니다. 클래스의 경우에는 하나의 클래스만 상속받을 수 있지만, 인터페이스는 여러 개를 동시에 상속받을 수 있습니다. 한 인터페이스가 여러 인터페이스를 상속받으면, 상속받은 인터페이스는 상위 인터페이스에 선언한 추상 메소드를 모두 가지게 됩니다.

 

 

 

X, Y 두개의 인터페이스

인터페이스의 상속방법은 클래스를 상속할 때와 같은 extends 예약어를 사용합니다.

 

 

 

 

X, Y 를 상속받은 MyInterface 인터페이스

 

 

MyInterface를 구현하는 MyClass 클래스

MyInterface 인터페이스를 구현하는 MyClass 클래스 코드는 다음과 같습니다. MyInterface 인터페이스에는 myMethod()메소드만 선언되어 있지만, X 인터페이스와 Y 인터페이스를 상속받았으므로 MyClass 클래스에서는 x(), y()메소드까지 구현해야 합니다.

 

 

MyClass 클래스를 실행하는 테스트 프로그램

생성한 클래스는 상위 인터페이스형으로 변환할 수 있습니다. 다만 상위 인터페이스로 형 변환을 하면 상위 인터페이스에 선언한 메소드만 호출할 수 있습니다. 

 

 

 

 

 

인터페이스 구현과 클래스 상속 함께 쓰기

한 클래스에서 클래스 상속과 인터페이스 구현을 모두 할 수도 있습니다. 다음은 Queue 인터페이스를 구현하고 shelf 클래스를 상속받는 BookShelf 클래스를 나타낸 그림입니다.

 

 

 

그림1

 

 

 

BookShelf(책장) 클래스는 책을 넣은 순서대로 꺼내어 볼수 있도록 만들려고 합니다. BookShelf 클래스를 구현하기전에 더 큰 개념인 Shelf(선반) 클래스를 먼저 만들어 보겠습니다.

 

 

Shelf 클래스의 생성

Shelf 클래스에는 자료를 순서대로 저장할 배열 객체를 선언했습니다. 이름을 저장할 수 있도록 자료형은 String을 사용합니다. 11행의 getShelf() 메소드는 저장되어 있는 배열 shelf를 반환하고, 15행의  getCount() 메소드는 배열 shelf에 저장된 요소 개수를 반환합니다. BookShelf클래스는 Shelf클래스를 상속받아 사용하는 하위 클래스입니다.

 

 

 

Queue 인터페이스의 정의

4행의 enQueue() 메서드는 입력되는 요소 값을 배열의 맨 뒤에 추가합니다. 5행의 deQueue()는 배열에서 맨 앞에 있는 요소를 제거하고 그 값을 반환합니다.

 

 

 

BookShelf 클래스의 구현

3행을 보면 BookShelf 클래스는 Shelf 클래스를 상속받고 Queue 인터페이스를 구현합니다. Shelf클래스가 가지고 있는 ArrayList배열을 사용하여 Queue 인터페이스에서 선언한 메소드를 모두 구현합니다.

 

 

 

BookShelf 테스트하기

11~13행과 같이 deQueue() 메소드를 사용하면 입력 순서대로 값이 출력되는 것을 확인할 수 있습니다.

'복습용' 카테고리의 다른 글

17.String 클래스  (0) 2020.04.02
16.Object 클래스 (equals, hash)  (0) 2020.04.01
15-1.인터페이스 요소  (0) 2020.04.01
15.인터페이스  (0) 2020.04.01
2. eclipse를 활용하여 소스코드 작성  (0) 2020.03.19