📝 인터페이스 (Interface)
- 일종의 추상클래스이다.
- 오직 추상메서드와 상수만을 구성 멤버로 가진다.
- 다중 상속이 가능하기 때문에 용도별로 세분화 하여 필요한 요소만 상속할 수 있다.
클래스를 작성하는 것과 같다.
❗❗ 다만, class 키워드 대신 interface를 사용해야 한다.
인터페이스 내의 모든 메서드는 추상 메서드이기 때문에 'abstract' 키워드를 명시할 필요가 없다.
public interface 인터페이스명 {
public 리턴타입 메서드명(파라미터,...);
}
인터페이스의 상속은 implements 키워드를 사용한다.
인터페이스도 추상화를 구현하고 있기 때문에, 인터페이스를 상속받는 클래스는
인터페이스내의 모든 메서드들을 반드시 재정의 해야 한다.
인터페이스는 클래스와 달리 Object클래스와 같은 최상위 클래스가 없다.
다중 상속이 가능하다.
// 콤마(,)로 연결하여 동시에 상속한 경우
public class Monster implements Fight, Move {
...
}
// 다른 클래스와 동시에 상속한 경우
public class Monster extends User implements Fight, Move{
...
}
public abstract class Unit{
public abstract void attack(); // 공격
public abstract void shield(); // 방어
public abstract void walk(); // 걷다
public abstract void run(); // 뛰다
public abstract void jump(); // 점프
public abstract void pickup(); // 아이템 줍기
}
추상클래스인 Unit 클래스가 있다.
주인공과 몬스터 클래스가 Unit을 상속받을 경우
주인공 클래스는 Unit의 모든 기능을 사용하지만,
몬스터 클래스는 사용하지 않는 기능도 재정의해야하는 문제가 발생한다.
그래서 추상 클래스인 Unit의 기능을 용도별로 분할하여 나누어 놓고,
주인공과 몬스터가 각각의 기능 중에서 자신에게 필요한 것들만 상속받도록 해야한다.
클래스 다이어그램으로 표현하면 다음과 같다.
// Action 인터페이스
public interface Action {
public void pickup(); // 줍다
}
// Fight 인터페이스
public interface Fight {
public void attack(); // 공격
public void shield(); // 방어
}
// Move 인터페이스
public interface Move {
public void walk(); // 걷기
public void run(); // 뛰기
public void jump(); // 점프
}
// Monster 클래스
public class Monster implements Fight, Move{
private String name; // 몬스터 이름
public Monster(String name) { // 생성자
super();
this.name = name;
}
// 다음과 같이 메서드 재정의가 이루어지면 필요한 기능을 구현한다.
@Override
public void walk() {
System.out.println(this.name + " >> 걷다");
}
@Override
public void run() {
System.out.println(this.name + " >> 뛰다");
}
@Override
public void jump() {
System.out.println(this.name + " >> 점프");
}
@Override
public void attack() {
System.out.println(this.name + " >> 공격");
}
@Override
public void shield() {
System.out.println(this.name + " >> 방어");
}
}
// Character 클래스
public class Character implements Action, Fight, Move{
private String name; // 캐릭터 이름
public Character(String name) { // 생성자
super();
this.name = name;
}
@Override
public void attack() {
System.out.println(this.name + " >> 공격");
}
@Override
public void shield() {
System.out.println(this.name + " >> 방어");
}
@Override
public void pickup() {
System.out.println(this.name + " >> 아이템을 줍다");
}
@Override
public void walk() {
System.out.println(this.name + " >> 걷다");
}
@Override
public void run() {
System.out.println(this.name + " >> 뛰다");
}
@Override
public void jump() {
System.out.println(this.name + " >> 점프");
}
}
// Main 클래스
public class Main {
public static void main(String[] args) {
Character c = new Character("주인공");
c.walk();
c.run();
c.attack();
c.shield();
c.pickup();
c.jump();
System.out.println("------------------------------------");
Monster m = new Monster("몬스터");
m.attack();
m.shield();
m.walk();
m.run();
m.jump();
}
}
👉 실행 결과
주인공 >> 걷다
주인공 >> 뛰다
주인공 >> 공격
주인공 >> 방어
주인공 >> 아이템을 줍다
주인공 >> 점프
------------------------------------
몬스터 >> 공격
몬스터 >> 방어
몬스터 >> 걷다
몬스터 >> 뛰다
몬스터 >> 점프
일반 클래스 | 추상 클래스 | 인터페이스 | |
---|---|---|---|
생성자, 멤버변수 | 가능 | 가능 | 불가능 (상수만 가능) |
일반 메서드 | 가능 | 가능 | 불가능 |
추상 메서드 | 불가능 | 가능 | 가능 |