인터페이스
: 일종의 추상클래스
인터페이스는 추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없음
오직 추상메서드
와 상수
만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용하지 않음
추상클래스를 부분적으로 완성된 '미완성 설계도'라고 한다면, 인터페이스는 구현된 것은 아무 것도 없고 밑그림만 그려져 있는 '기본 설계도' 라고 할 수 있음
▶ 인터페이스도 추상클래스처럼 불완전한 것이기 때문에 그 자체만으로 사용되기 보다는 다른 클래스를 작성하는데 도움 줄 목적으로 작성
- 인터페이스를 작성하는 것을 클래스를 작성하는 것과 같지만, 키워드로 class 대신
interface
를 사용함- interface에도 클래스처럼 접근제어자로 public 또는 default만 사용 가능
interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
▶인터페이스 멤버들의 제약사항
→ 인터페이스에 정의된 모든 멤버에 예외없이 적용되는 사항이기 때문에 제어자를 생략할 수 있는 것이며, 편의상 생략하는 경우가 많음
→ 생략된 제어자는 컴파일 시에 컴파일러가 자동적으로 추가 해줌
interface PlayingCard {
public static final int SPADE = 4;
final int DIAMOND = 3; //public static final int DIAMOND = 3;
static int HEART = 2; //public static final int HEART = 2;
int CLOVER = 1; //public static final int CLOVER = 1;
public abstract String getCardNumber();
String getCardKind(); //public abstract String getCardKind();
}
인터페이스
는 인터페이스로만 상속받을 수 있으며, 클래스와 달리 다중상속, 즉 여러개의 인터페이스로부터 상속을 받는 것이 가능interface Movable {
/*지정된 위치(x,y)로 이동하는 기능의 메서드*/
void move(int x, int y)
}
interface Attackable {
/*지정된 대상(u)을 공격하는 기능의 메서드*/
void attack(Unit u);
}
interface Fightable extends Movable, Attackable{}
클래스의 상속과 마찬가지로 자손 인터페이스(Fightable)는 조상 인터페이스(Movable, Attackable)에 정의된 멤버를 모두 상속 받음
그래서 Fightable자체에는 정의된 멤버가 하나도 없지만, 조상 인터페이스로부터 상속받은 두 개의 추상메서드, move(int x, int y)와 attack(Unit u)을 멤버로 갖게 됨
인터페이스도 추상클래스처럼 그 자체로는 인스턴스를 생성할 수 없음
추상클래스가 상속을 통해 추상메서드를 완성하는 것처럼, 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야하는데, 그 방법은 추상클래스가 자신을 상속받는 클래스를 정의하는 것과 같음
클래스는 확장한다는 의미의 키워드 extends
를 사용하지만 인터페이스는 구현한다는 의미의 키워드 implements
를 사용할 뿐
class 클래스이름 implements 인터페이스이름 {
//인터페이스에 정의된 추상메서드를 모두 구현해야함
}
class