13. 인터페이스
1. 인터페이스(interface)
인터페이스는 추상 클래스보다 추상화 정도가 더 높은 추상 클래스를 말함
추상 클래스는 구현부를 갖춘 일반 메서드나 변수도 가질 수 있지만,
인터페이스는 추상메서드와 상수만을 멤버로 가질 수 있음
인터페이스 역시 다른 클래스로부터 해당 인터페이스(미완성 설계도)구현을 요구하는 목적으로 사용되며, 그 자체만으로는 거의 사용되진 않음
2. 인터페이스 작성 방식
클래스를 작성할 때는 키워드로 class를 사용했음
인터페이스를 작성할 때는 키워드로 class 대신 interface 를 사용
interface 인터페이스명 {
public static final 타입 상수이름 = 값;
public abstract 메서드명(매개변수 목록);
}2-1. 인터페이스의 작성 규칙
- 모든 멤버 상수는
public static final로 지정해야 하며, 생략하면 컴파일러가 자동으로 추가해줌 - 모든 메서드는
public abstract이어야 하며, 이 역시 생략 가능
interface PlayingCard {
public static final int SPADE = 4;
final int DIAMOND = 3;
static int HEART = 2;
int CLOVER = 1;
public abstract String getCardNumber();
String getCardKind();
}3. 인터페이스의 구현, implements interface
→ 해당 인터페이스를 실제로 구현할 구현 클래스를 작성한다는 의미
인터페이스 역시 추상클래스처럼 그 자체로는 인스턴스를 생성할 수 없음
추상 클래스가 자신의 멤버로써 선언부만 정의한 메서드를 상속 받은 클래스에서 완성시키는 것처럼,
인터페이스 역시 자신에게 정의되어 있는 추상 메서드의 구현을 담당할 클래스를 작성함으로써 인터페이스의 기능을 수행할 수 있게 됨
단지, 클래스는 상속받을 때 클래스를 확장한다는 의미의 extends라는 키워드를 사용했지만,
해당 인터페이스를 실제 구현(메서드 완성 등)할 구현 클래스(implementation)는 extends 대신 해당 인터페이스를 구현한다는 의미의 implements 를 사용
class 클래스명 implements 인터페이스명 {
//구현한 인터페이스에 정의되어 있는 추상 메서드를 구현해야함
}
// 예시
abstract class Shark implements Fightable {
public void move(int x, int y){ ... }
public void attack(Unit target) { ... }
}만약 구현하려는 인터페이스의 메서드들(move(), attack() 총 2개) 중 일부만(move()) 구현하려고 할 경우에는 class Shark의 앞에 abstract 키워드를 사용함으로써 추상 클래스로 선언해야 함
→ 클래스에 추상 메서드(인터페이스를 통해 구현해야 하는 메서드)가 하나라도 있으면 그 클래스는 추상 클래스로 선언해야 하기 때문
다음처럼 상속과 구현을 동시에 할 수도 있음
class Shark extends Animal implements Fightable {
public void move(int x, int y){ ... }
public void attack(Unit target) { ... }
}4. 인터페이스 네이밍 컨벤션
인터페이스의 이름은 주로 ~을 할 수 있는을 의미하는 ~able로 끝나는 것이 많은 편
→ 어떠한 기능을 하는데 필요한 메서드를 제공해준다는 의미를 부각시키기 위함
마찬가지로 그 인터페이스를 구현한 클래스 역시 ‘~를 할 수 있는’ 능력을 갖추었다는 의미가 되기도 하기 때문
모든 인터페이스의 이름이 반드시 ~able로 끝나야 하는 것은 아님