자바에서는 부모클래스가 다중으로 있을 수가 없다. (단일 상속) 하지만 자식클래스가 모두 다 부모클래스의 기능을 받아올 필요는 없다. 게임을 만들때 플레이어 캐릭터엔 아이템 줍기 기능이 있어야하지만 몬스터엔 그 기능이 필요없는 것 처럼, 만들어지는 자식 클래스의 특징에 따라 기능을 구분할 필요가 생겨났다.
그래서 기능별로 묶어서 모듈화를 시킨게 인터페이스다. 기능을 용도별로 분할하여 나누어 놓고 플레이어와 몬스터가 각각의 기능 중에서 자신에게 필요한 것들만 상속받도록 하는 방법을 필요로 한다.
추상클래스
인터페이스
인터페이스는 class 형태가 아닌 인터페이스 형태로 따로 생성한다.
인터페이스에 추가되는 메서드는 모두 추상메서드이기 때문에 abstract 키워드를 명시할 필요가 없다.
모듈화된 인터페이스들
public interface Action {
// 줍다
public void pickup();
}
public interface Move {
// 걷다
public void walk();
// 뛰다
public void run();
// 점프
public void jump();
}
public interface Fight {
// 공격
public void attack();
// 방어
public void shield();
}
모듈화된 인터페이스들을 활용하여 클래스들의 메소드를 강제해보자
public class Character implements Action, Move, Fight { // 플레이어니까 Action으로 템줍는 기능이 들어간다!
private String name;
public Character(String name) {
this.name = name;
}
@Override
public void attack() {
System.out.println(this.name + " >> " + "공격");
}
@Override
public void shield() {
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 + " >> " + "점프");
}
@Override
public void pickup() {
System.out.println(this.name + " >> " + "아이템을 줍다.");
}
}
public class Monster implements Fight, Move { // 몬스터라 Action기능이 없다
private String name;
public Monster(String name) {
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 + " >> " + "방어했습니다.");
}
}
잘 만들었으니 이제 써보자
public class Main01 {
public static void main(String[] args) {
// 주인공과 몬스터가 등장하는 프로그램
Character ch = new Character ("주인공");
ch.walk();
ch.run();
ch.attack();
ch.shield();
System.out.println("---------------");
Monster mon = new Monster("악당");
mon.walk();
mon.run();
mon.attack();
mon.shield();
}
}