여러 인터페이스 구현하기, 인터페이스의 상속
1. 여러 인터페이스 구현
- 자바의 인터페이스는 구현 코드가 없으므로 하나의 클래스가 여러 인터페이스는 구현 할 수 있음
- 디폴트 메서드가 중복 되는 경우는 구현 하는 클래스에서 재정의 하여야 함 (인스턴스가 있어야 사용 가능해서)
- 여러 인터페이스를 구현한 클래스는 인터페이스 타입으로 형 변환 되는 경우, 해당 인터페이스에 선언된 메서드만 사용 가능 함
* Diamond Problem
자바의 다중 상속이 안되는 이유는 diamond problem이다.
자바는 이러한 모호성을 없애버리고, 단일 상속만 가능하도록 하게 만들었다.
하지만 인터페이스는 구현 코드가 없기 때문에 다중 상속이 가능하다.
Buy.java
package ch15;
public interface Buy {
void buy();
default void order() {
System.out.println("buy order");
}
}
Sell.java
package ch15;
public interface Sell {
void sell();
default void order() {
System.out.println("sell order");
}
}
2. 디폴트 메서드가 중복 되는 경우
구현 코드를 가지고 인스턴스 생성된 경우만 호출되는 디폴트 메서드의 경우 두 개의 인터페이스에서 중복되면 구현하는 클래스에서 반드시 재정의를 해야 함
Customer.java
package ch15;
public class Customer implements Buy,Sell{
@Override
public void sell() {
System.out.println("customer sell");
}
@Override
public void buy() {
System.out.println("customer buy");
}
@Override
public void order() {
System.out.println("customer order");
}
public void hello() {
System.out.println("hello");
}
}
CustomerTest.java
package ch15;
public class CustomerTest {
public void main(String[] args) {
Customer customer = new Customer();
customer .buy();
customer.sell();
customer.order();
customer.hello();
Buy buyer = customer; //업캐스팅->상위 클래스로 묵시적으로 형변환
buyer.buy();
buyer.order();
Sell seller = customer;
seller.sell();
seller.order();
}
}
어떤 클래스가 여러 개의 인터페이스를 구현하더라도,
외부에 모든 인터페이스를 공개하지 않고, 일부의 인터페이스만 공개하면 클라이언트는 그 기능만 사용할 수 있다.
3. 인터페이스의 상속
- 인터페이스 사이에도 상속을 사용할 수 있음
- extends 키워드를 사용
- 인터페이스는 다중 상속이 가능하고 구현 코드의 상속이 아니므로 타입 상속 이라고 함
X.java
public interface X {
void x();
}
Y.java
public interface Y {
void y();
}
MyInterface.java
public interface MyInterface extends X, Y{ //MyInterface 인터페이스가 X,Y 인터페이스를 다중상속 받는다
void myMethod(); // x(),y()를 모두 선언하겠다.
}
MyClass.java
public class MyClass implements MyInterface{ //MyInterface를 구현하는 MyClass가 메소드들을 모두 구현했다.
@Override
public void x() {
System.out.println("x()");
}
@Override
public void y() {
System.out.println("y()");
}
@Override
public void myMethod() {
System.out.println("myMethod()");
}
}
MyClassTest.java
public class MyClassTest {
public static void main(String[] args) {
MyClass mClass = new MyClass();
X xClass = mClass; //타입이 X인터페이스라면,
xClass.x(); //x()만 쓸 수 있고,
Y yClass = mClass; //y로 선언 되면,
yClass.y(); //y()만 쓸 수 있다.
MyClass iClass = mClass; //메소드를 전부 다 쓰고 싶다면 MyClass 타입이어야 한다.
iClass.x();
iClass.y();
iClass.myMethod();
}
}
어떤 인터페이스로 선언되었느냐에 따라 변수가 사용할 수 있는 메서드들은 한정된다.
4. 클래스 상속과 인터페이스 구현 함께 쓰기
실무에서 프레임워크나 오픈소스와 함께 연동되는 구현을 하게 되면 클래스 상속과 인터페이스의 구현을 같이 사용하는 경우가 많음
(앞에 extends부터 쓰고 뒤에 implements를 쓴다)
- 책이 순서대로 대여가 되는 도서관 구현
- 책을 보관하는 자료 구조가 Shelf에 구현됨 (ArrayList)
- Queue 인터페이스를 구현함
- Shelf 클래스를 상속 받고 Queue를 구현한다.
Shelf.java
package ch15_2;
import java.util.ArrayList;
public class Shelf {
protected ArrayList<String> shelf; //하위 클래스가 상속 받아 쓸 수 있도록 protected로 선언
public Shelf() {
shelf = new ArrayList<String>(); //생성자가 호출될 때 멤버 변수를 초기화하는 것이 좋다.
}
public ArrayList<String> getShelf(){
return shelf;
}
public int getCount() {
return shelf.size();
}
}
Queue.java
package ch15_2;
public interface Queue {
void enQueue(String title); //책 넣기
String deQueue(); //책 꺼내서 책 이름 반환
int getSize();
}
BookShelf.java
package ch15_2;
public class BookShelf extends Shelf implements Queue{
@Override
public void enQueue(String title) {
shelf.add(title); //Shelf를 상속받았으니 protected 변수를 쓸 수 있다
}
@Override
public String deQueue() {
return shelf.remove(0);
}
@Override
public int getSize() {
return getCount();
}
}
BookShelfTest.java
package ch15_2;
public class BookShelfTest {
public static void main(String[] args) {
Queue bookQueue = new BookShelf();
bookQueue.enQueue("토지1");
bookQueue.enQueue("토지2");
bookQueue.enQueue("토지3");
bookQueue.enQueue("토지4");
bookQueue.enQueue("토지5");
System.out.println(bookQueue.getSize());
System.out.println(bookQueue.deQueue()); //들어간 순서대로 잘 빠져나옴
System.out.println(bookQueue.deQueue());
System.out.println(bookQueue.deQueue());
System.out.println(bookQueue.deQueue());
System.out.println(bookQueue.deQueue());
}
}
클래스를 만들 때, 자기보다 좀 더 일반적인 클래스에서 상속을 받고,
자기가 구현해야할 기능이 선언되어있는 인터페이스를 구현하는 구조를 많이 사용한다.
'JAVA' 카테고리의 다른 글
4-2.Object 클래스의 다른 메서드들 활용하기 (0) | 2022.01.26 |
---|---|
4-1.Object 클래스 (0) | 2022.01.26 |
3-14.객체 지향 핵심 - 인터페이스의 여러가지 요소 (0) | 2022.01.24 |
3-13.객체 지향 핵심 - 인터페이스를 활용한 다형성 구현 (0) | 2022.01.23 |
3-12.객체 지향 핵심 - 인터페이스는 왜 쓰는가? (0) | 2022.01.23 |