인터페이스(interface)
일종의 추상클래스로, 추상메서드를 갖지만 추상메서드보다 추상화 정도가 높다.
추상 클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다.
오직 추상메서드 + 상수만 멤버로 가질 수 있음.
interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수s);
}
[인터페이스 멤버 제약사항]
1) 모든 멤버변수는 public static funal이어야 하고, 이를 생략할 수 있다.
2) 모든 메서드는 public abstract이어야 하며, 이를 생략할 수 있다.
(단 static메서드와 default 메서드는 예외임)
생략된 제어자는 컴파일러가 자동으로 추가한다.
interface PlayingCard{
public static final int SPADE =4;
final int DIAMOND = 3; //public static final
static int HEART = 2; //public static final
int CLOVER =v1; //public static final
public abstract String getCardNumber();
String getCardKind(); //public abstact
}
인터페이스 상속(extends)
인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중상속이 가능하다.
(인터페이스를 상속받을 수 있음. 다만 인터페이스가 상속받으려면 인터페이스로부터 상속을 받는다는 소리)
interface Moveable{
/* 지정된 위치(x,y)로 이동하는 기능의 메서드 */
void move(int x, int y);
}
interface Attackable{
/* 지정된 대상을 공격하는 기능의 메서드 */
void attack(Unit u);
}
interface Fightable extends Moveable, Attackable { .. }
인터페이스의 구현
인터페이스도 추상클래스처럼, 그 자체로는 인스턴스를 생성할 수 없다.
추상클래스가 상속을 통해 추상메서드를 완성하듯..
인터페이스도 자신에게 정의된 추상메서드의 몸통을 만들어주는 클래스가 필요함.
다만.. 추상클래스를 상속할 때는 확장의 의미로 extends 키워드를 사용.
인터페이스는 구현한다는 의미의 implements 키워드를 사용한다.
class 클래스이름 implements 인터페이스이름 {
//인터페이스에 정의된 추상메서드 모두 구현
}
interface Moveable{
/* 지정된 위치(x,y)로 이동하는 기능의 메서드 */
void move(int x, int y);
}
interface Attackable{
/* 지정된 대상을 공격하는 기능의 메서드 */
void attack(Unit u);
}
interface Fightable extends Moveable, Attackable { .. }
class Fighter implements Fightable{
public void move(int x,int y) { ... }
public void attack(Unit u) { ... }
}
이 때, "Fighter 클래스는 Fightable 인터페이스를 구현한다." 라는 표현을 사용한다.
인터페이스를 이용한 다형성
인터페이스 역시 구현한 클래스의 조상이라고 할 수 있으므로, 해당 인터페이스 타입의 참조변수로 구현한 클래스의 인스턴스를 참조할 수 있다.
인터페이스 타입으로의 형변환도 가능하다.
// Fightable = 인터페이스 / Fighter = 인터페이스를 구현한 클래스
Fightable f = (Fightable) new Fighter();
또는
Fightable f = new Fighter(); // 조상인 인터페이스로의 형변환이기에 생략 가능
// 메서드의 매개변수 타입으로도 사용 가능한 인터페이스
void attack(Fightable f){
//...
}
인터페이스 타입의 매개변수가 갖는 의미
:: 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 것.
class Fighter extends Unit implements Fightable{
public void move(int x, int y) { ... }
public void attaack(Fightable f) { ... }
}
위와 같이 Fightable 인터페이스를 구현한 Fighter 클래스가 있을 때 attack 메서드의 매개변수로 Fighter 인스턴스를 넘겨줄 수 있다. ▶ attack(new Fighter()) 가능
또한 메서드의 리턴타입으로 인터페이스 지정도 가능하다.
Fightable method() {
...
Fighter f = new Fighter();
return f;
}
※ 리턴타입이 인터페이스
= 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 의미 (인스턴스의 주소 반환)
[인터페이스의 장점]
- 개발시간 단축 가능
- 표준화가 가능 (개발자들에게 인터페이스를 구현하라고 함으로서 정형화되고 일관된 프로그램 개발 가능)
- 서로 관계없는 클래스들에게 관계를 맺어줄 수 있음
- 독립적인 프로그래밍 기능 (선언부와 구현을 분리시킬 수 있기에)
'프로그래밍 > java' 카테고리의 다른 글
[JAVA] 자바의정석 기초편 7장 연습문제 (0) | 2022.09.03 |
---|---|
[JAVA] default 메서드, static 메서드, 내부클래스, 익명클래스 (0) | 2022.09.03 |
[JAVA] 추상 클래스와 추상 메서드 (abstract) (0) | 2022.08.31 |
[JAVA] 매개변수의 다형성, 객체 배열과 벡터 (0) | 2022.08.31 |
[JAVA] 참조변수의 형변환 (0) | 2022.08.29 |