사전적인 의미로는 키보드, 디스플레이 등과 같이 사람과 컴퓨터를 연결하는 장치이다.
Java에서는 인터페이스의 역할이 크게 두가지이다.
public interface Ainterface {
public void funcA(); // 선언
}
public class AinterfaceImpl implements Ainterface{
@Override
public void funcA() {
System.out.println("AAA"); // 구현
}
}
인터페이스 타입을 가진 변수의 경우, 해당 인터페이스를 구현한 클래스의 인스턴스로 값을 초기화할 수 있다. 그리고 해당 변수를 통하여 인터페이스의 메서드를 호출할 수 있다.
이렇게 인터페이스는 메서드를 사용하기 위한 통로가 되어준다.
public class Main {
public static void main(String[] args) {
Ainterface ainterface = new AinterfaceImpl();
ainterface.funcA(); // AAA
}
}
한 객체가 기능 구현에 대한 책임을 다른 객체로 넘겨주는 것을 말한다.
public class AObj {
Ainterface ainterface;
public AObj(){
ainterface = new AinterfaceImpl();
}
public void funcAA(){
// Ainterface를 구현하는 클래스에서 필요한 기능을 구현하면 됨
ainterface.funcA();
ainterface.funcA();
}
}
여러 알고리즘을 하나의 추상적인 접근점을 만들어 접근점에서 서로 교환하도록 하는 패턴을 말한다.
다음 그림을 보자.
중심에 Strategy라는 인터페이스가 있다. Client는 Strategy 타입을 가진 strategy라는 필드를 소유하고 있다. 그리고 Strategy를 구현한 클래스인 세 개의 클래스가 있다. client는 setStrategy 함수를 통하여 strategy를 세 개의 클래스 중 하나로 설정할 수 있다.
즉, client는 전략을 세 가지 중 하나를 골라 선택하고, 나중에 기존의 전략을 다른 전략으로 바꿀 수 있는 것이다.
어떤 게임에서 캐릭터와 무기를 구현해야 하는데 무기는 칼과 검 두가지가 있다. 캐릭터는 무기를 둘 중 하나로 설정할 수가 있다.
우선 캐릭터가 무기에 접근하기 위한 접근점 역할을 하는 Weapon 인터페이스를 구현한다.
public interface Weapon {
public void attack();
}
그 다음 각 무기에 해당하는 Knife, Sword 클래스를 선언한다.
public class Knife implements Weapon{
@Override
public void attack() {
System.out.println("칼 공격");
}
}
public class Sword implements Weapon{
@Override
public void attack() {
System.out.println("검 공격");
}
}
그 다음 캐릭터에 해당하는 GameCharacter 클래스를 만든다. attack 함수의 경우, attack의 기능 구현의 책임을 다른 클래스에 위임하였다.
public class GameCharacter {
// 무기에 대한 접근점
private Weapon weapon;
// 무기 교환
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
public void attack(){
if(weapon == null)
System.out.println("맨손 공격");
else
weapon.attack(); // 위임
}
}
다음 코드를 실행해 보면, 게임이 잘 구현된 것을 확인할 수 있다.
public class Main {
public static void main(String[] args) {
GameCharacter character = new GameCharacter();
character.attack(); // 맨손 공격
character.setWeapon(new Knife()); // 무기 칼로 설정
character.attack(); // 칼 공격
character.setWeapon(new Sword()); // 무기 검으로 설정
character.attack(); // 검 공격
}
}
도끼가 새로운 무기로 추가된다.
Ax라는 새로운 클래스를 만든다.
public class Ax implements Weapon{
@Override
public void attack() {
System.out.println("도끼 공격");
}
}
그러면 도끼도 정상적으로 사용된다. 다음과 같이 클래스를 하나만 추가해주면 유지보수도 쉽게 할 수가 있다.
public class Main {
public static void main(String[] args) {
GameCharacter character = new GameCharacter();
character.attack(); // 맨손 공격
character.setWeapon(new Knife()); // 무기 칼로 설정
character.attack(); // 칼 공격
character.setWeapon(new Sword()); // 무기 검으로 설정
character.attack(); // 검 공격
character.setWeapon(new Ax()); // 무기 검으로 설정
character.attack(); // 검 공격
}
}