인터페이스란?
interface Predator {
void sleep();
String getFood();
}
클래스가 가져야 할 구조를 정의하는 추상 타입
클래스를 생성할 때마다 그 안에 공통적인 특성을 넣어야 할 때 효율적으로 사용할 수 있다.
인터페이스 쓰임새
- 여러 클래스가 같은 방식으로 동작하도록 강제하고 싶을 때
- 클래스를 사용하는 쪽과 구현하는 쪽을 구분하여 독립시키고 싶을 때
- 여러 클래스 사이에서 공통적인 특성을 추출하고 싶을 때
인터페이스 특징
- 인터페이스는 "규칙"이다!
- 메서드와 상수만 정의될 수 있고, 항상 public으로만 선언된다.
- 메서드도 메서드명과 반환타입 정도만 "규정" 할 수 있다.
디폴트 메서드
인터페이스를 구현하는 클래스들이 공통으로 사용할 수 있게 해준다.
인터페이스에 해당 메서드를 만들어두면, 각 클래스에서 구현하지 않아도 사용이 가능한 메서드.
스태틱 메서드
인터페이스 이름으로 직접 호출할 수 있는 메서드이다.
인터페이스명.스태틱메서드명 으로 호출 가능
따라 작성해보기
interface Predator {
String getFood(); // 메서드 추가 (몸통이 없음)
default void printFood() { // 디폴트 메서드
Systehttp://m.out.printf("my food is %s\n", getFood());
}
int LEG_COUNT = 4; // 인터페이스 상수
static int speed() { // 스태틱 메서드
return LEG_COUNT * 30;
}
}
class Animal {
String name;
void setName(String name) {
this.name = name;
}
}
class Tiger extends Animal implements Predator {
public String getFood() {
return "apple";
}
}
class Lion extends Animal implements Predator {
public String getFood() {
return "banana";
}
}
class Zookeeper {
void feed(Predator predator){
System.out.println("feed "+ predator.getFood());
}
}
public class Day16 {
public static void main(String[] args) {
Zookeeper zookeeper = new Zookeeper();
Tiger tiger = new Tiger();
Lion lion = new Lion();
tiger.printFood();
zookeeper.feed(tiger); //feed apple 출력
lion.printFood();
zookeeper.feed(lion); // feed banana 출력
Predator.speed();
System.out.println(Predator.LEG_COUNT);
}
}