인터페이스
예시 코드
public class Battle {
public static void main(String[] args) {
Warrior jangbi = new Warrior("장비");
Paladin juyu = new Paladin("주유");
Cleric chosun = new Cleric("초선");
Dealer[] d = { jangbi, juyu };
Healer[] h = { juyu, chosun };
for (int i = 0; i < d.length; i++) {
d[i].dealing();
}
for (int i = 0; i < h.length; i++) {
h[i].healing();
}
}
}
interface Dealer {
public void dealing();
}
interface Tanker {
public void tanking();
}
interface Healer {
public void healing();
}
class Warrior implements Dealer {
String name;
public Warrior(String name) {
this.name = name;
}
public void dealing() {
System.out.printf("[%s]의 공격!\n", name);
}
}
class Paladin implements Dealer, Tanker, Healer {
String name;
public Paladin(String name) {
this.name = name;
}
public void dealing() {
System.out.printf("[%s]의 공격!\n", name);
}
public void tanking() {
System.out.printf("[%s]의 방어!\n", name);
}
public void healing() {
System.out.printf("[%s]의 힐!\n", name);
}
}
class Cleric implements Healer {
String name;
public Cleric(String name) {
this.name = name;
}
public void healing() {
System.out.printf("[%s]의 힐!\n", name);
}
}
1. 인터페이스란?
인터페이스(interface)는 클래스에 역할을 부여하는 개념이다. 인터페이스를 통해 역할을 정의한 후, implements 키워드를 통해 해당 인터페이스를 클래스에 부여할 수 있다. 인터페이스를 부여받은 클래스를 인터페이스를 구현하는 '구현체'라고 부른다.
위의 예시 코드에서 interface Dealer { public void dealing(); }는 Dealer라는 인터페이스를 선언하고 있다.
그리고 class Warrior implements Dealer { ... }를 통해 Warrior 클래스에 Dealer 인터페이스를 부여하고 있다. Warrior 클래스는 Dealer를 구현하는 구현체이다.
인터페이스는 추상 메소드(프로토타입 메소드)로 구성된다. 추상 메소드는 동작부분이 없는 메소드이다. 이 추상 메소드가 동작하기 위해서는 추상 메소드의 동작부분을 포함하여 구현체에 오버라이딩(재정의) 해야한다.
interface Dealer { public void dealing(); }를 보면 dealing은 동작부분이 없는 추상 메소드이며, Warrior와 Paladin 클래스에서 public void dealing() { System.out.printf("[%s]의 공격!\n", name);로 동작부분을 포함하여 오버라이딩 되고 있다.
2. 인터페이스의 장점
인터페이스는 각 클래스가 어떤 역할을 하는지 직관적으로 보여주어, 프로그램 설계의 명확성을 높여준다.
동일한 인터페이스를 서로 다른 클래스에 부여할 경우, 서로 다른 클래스 타입의 객체들은 동일한 인터페이스를 부여 받았다는 관계성을 갖게된다. 그리고 이러한 객체들은 인터페이스를 통해 업캐스팅 될 수 있다.
위의 예시코드에서 Warrior와 Paladin 클래스는 Dealer라는 공통의 인터페이스를 부여받았고, Paladin과 Cleric은 Healer라는 공통의 인터페이스를 부여 받았고, 해당 인터페이스로 업캐스팅 되어 해당 인터페이스 배열에 포함되어 있다.
Dealer[] d = { jangbi, juyu }; Healer[] h = { juyu, chosun };
하나의 클래스는 여러가지 인터페이스를 부여 받을 수 있다. 즉 하나의 클래스가 여러가지 인터페이스 타입으로 해석될 수 있는 다형성을 가질 수 있다.
위의 예시코드에서 Paladin 클래스는 Dealer, Tanker, Healer라는 세가지의 인터페이스를 부여 받았으며, 각각의 인터페이스 타입으로 해석될 수 있다.