Java는 프로그래밍 언어의 한 종류로, 다양한 디바이스에서 실행될 수 있는 플랫폼 독립적인 언어입니다. 이번 글에서는 Java의 인터페이스와 상태 패턴에 대해 알아보고, 이를 이용한 상태 패턴 구현 방법에 대해 자세히 살펴보겠습니다.
Java 인터페이스란 무엇인가?
Java 인터페이스는 클래스와 유사하지만, 추상 메서드와 상수만을 가지고 있습니다. 이는 인터페이스를 구현한 클래스에서 추상 메서드를 반드시 구현하도록 강제하는 역할을 합니다. 이를 통해 인터페이스를 사용하는 클래스들이 일관된 메서드를 제공하도록 보장할 수 있습니다. Java에서 인터페이스는 interface
키워드를 사용하여 정의할 수 있습니다.
Java 인터페이스는 단일 상속만을 지원하며, 다중 상속을 지원하지 않습니다. 그러나 인터페이스 간에는 다중 상속이 가능합니다. 또한 Java 8부터는 인터페이스에서 디폴트 메서드와 정적 메서드를 지원하므로, 더욱 유연한 인터페이스 설계가 가능해졌습니다.
상태 패턴이란 무엇인가?
상태 패턴은 객체의 상태가 바뀜에 따라 객체의 행동을 변경하는 디자인 패턴입니다. 이 패턴은 상태를 클래스로 표현하고, 상태에 대한 행동을 메서드로 정의하여 구현합니다. 이를 통해 상태 전환에 따른 코드 중복을 줄이고, 확장성 있는 코드를 작성할 수 있습니다.
예를 들어, 자판기를 상태 패턴으로 구현한다면, 자판기의 상태는 "동전이 없는 상태", "동전이 있는 상태", "음료가 나오는 상태" 등으로 나눌 수 있습니다. 각 상태에 대한 행동은 메서드로 정의하며, 자판기가 동전을 받지 않은 상태에서 음료를 선택하면 "동전을 넣으세요"라는 안내 메시지가 출력됩니다.
Java 인터페이스를 사용한 상태 패턴 구현하기
Java 인터페이스를 사용한 상태 패턴 구현 방법은 다음과 같습니다.
- Context 클래스를 정의합니다. Context 클래스는 상태 패턴에서 상태를 유지하고, 행동 메서드를 호출하는 역할을 합니다.
- State 인터페이스를 정의합니다. State 인터페이스는 상태에 대한 행동 메서드를 정의합니다.
- 각 상태에 해당하는 클래스를 정의합니다. 이 클래스들은 State 인터페이스를 구현하며, 상태에 따른 행동을 구현합니다.
- Context 클래스에서는 현재 상태를 유지하며, 행동 메서드를 호출합니다. 이때 상태에 따라 적절한 행동 메서드를 호출하도록 구현합니다.
아래는 Java 인터페이스를 사용한 상태 패턴의 예시 코드입니다.
interface State {
void insertCoin(Context context);
void pushButton(Context context);
}
class NoCoinState implements State {
@Override
public void insertCoin(Context context) {
context.setState(new CoinInsertedState());
}
@Override
public void pushButton(Context context) {
System.out.println("동전을 넣으세요");
}
}
class CoinInsertedState implements State {
@Override
public void insertCoin(Context context) {
System.out.println("이미 동전이 있습니다");
}
@Override
public void pushButton(Context context) {
System.out.println("음료가 나왔습니다");
context.setState(new NoCoinState());
}
}
class Context {
private State currentState;
public Context() {
currentState = new NoCoinState();
}
public void setState(State state) {
currentState = state;
}
public void insertCoin() {
currentState.insertCoin(this);
}
public void pushButton() {
currentState.pushButton(this);
}
}
위 코드에서 Context 클래스는 자판기를 나타내고, State 인터페이스는 자판기의 상태를 나타냅니다. NoCoinState와 CoinInsertedState는 각각 "동전이 없는 상태"와 "동전이 있는 상태"를 나타내며, insertCoin()과 pushButton() 메서드를 구현합니다. 이를 통해 자판기의 상태 전환이 가능해집니다.
Java 인터페이스를 사용한 상태 패턴은 객체지향 디자인 패턴의 대표적인 예시 중 하나입니다. 인터페이스를 이용하여 코드의 유연성과 확장성을 높일 수 있으며, 상태 패턴을 이용하여 객체의 행동을 동적으로 변경할 수 있습니다. 이를 통해 더욱 효율적인 코드를 작성하고, 유지보수를 용이하게 할 수 있습니다.