OOP 활용: 인터페이스(Interface)
이번 글에서는 객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 요소 중 하나인 '인터페이스(Interface)'에 대해 상세하게 다루겠습니다. 이전에는 추상 클래스와 그 활용법에 대해 살펴봤지만, 이번 글에서는 인터페이스를 어떻게 활용하는지, 그리고 왜 필요한지 등에 대해 심화된 내용과 실제 사례를 통해 설명하겠습니다.
1. 인터페이스(Interface)란?
객체 지향 프로그래밍에서 '인터페이스'란 모든 메서드가 추상 메서드로 구성된 '참조 타입'입니다. 클래스와 비슷하지만, 인터페이스의 메서드들은 기본적으로 public abstract이며, 필드(Field)는 public static final로 선언됩니다. 이는 클래스와 달리 인터페이스가 명시적으로 상태를 가질 수 없다는 것을 의미합니다.
2. 왜 인터페이스를 사용하는가?
인터페이스는 여러 클래스 간 공유되어야 하는 행동이나 속성을 정의합니다. 예를 들어 Flyable이라는 인터페이스가 있고 Bird와 Airplane이라는 클래스들은 Flyable을 구현하여 날다(fly)라는 동작을 공유할 수 있습니다.
주된 목적은 서로 다른 객체들이 동일한 방식으로 동작할 수 있는 규약(contract)을 제공하는 것입니다. 이렇게 함으로써 코드의 유연성과 재사용성을 높일 수 있으며, 다형성(Polymorphism)의 원칙을 적극적으로 활용할 수 있습니다.
3. 인터페이스 활용
Java 언어 기준으로 Flyable라는 이름의 인터페이스가 있고 Bird와 Airplane클래스가 Flyable인터페이스를 구현하였다고 가정하겠습니다.
예시 코드:
public interface Flyable {
void fly();
}
public class Bird implements Flyable {
@Override
public void fly() {
System.out.println("The bird flies");
}
}
public class Airplane implements Flyable {
@Override
public void fly() {
System.out.println("The airplane flies");
}
}
위 예제에서 Bird와 Airplane클래스 모두 부모클래스인 Flyable로부터 fly()메소드(추상 메소드)를 상속받았으며 각각 재정의하여 고유한 날기 출력을 구현하였습니다.
4. 인터페이스 사용 예시
Flyable myFlyer = new Bird();
myFlyer.fly(); // Outputs: "The bird flies"
myFlyer = new Airplane();
myFlyer.fly(); // Outputs: "The airplane flies"
위 코드는 인터페이스의 활용 예시입니다. Flyable 타입의 변수 myFlyer에 Bird 객체와 Airplane 객체를 할당한 후, fly() 메서드를 호출하면 각각 다른 결과가 출력됩니다. 이는 다형성(Polymorphism)의 한 예시로, 동일한 메서드 호출이지만 실제 참조하는 객체에 따라 다른 결과를 보여줍니다.
5. 주의사항
인터페이스는 추상 클래스와 마찬가지로 직접 인스턴스화할 수 없습니다. 또한, 인터페이스 내부에 있는 추상 메서드들은 반드시 구현 클래스에서 구현되어야 합니다.
6. 활용 사례
인터페이스는 다양한 상황에서 유용하게 사용됩니다.
- 게임 개발: 게임 내 캐릭터들이 공격(attack), 방어(defend), 이동(move) 등 같은 행동을 공유하지만, 특정 캐릭터마다 고유한 방식으로 행동해야 할 때, 이러한 행동들을 인터페이스로 정의하고 각 캐릭터마다 이를 구현할 수 있습니다.
- API 개발: 서로 다른 시스템간 데이터 교환을 위해 API(Application Programming Interface)를 설계할 때, 어떤 메소드가 제공되어야 하는지 정의하기 위해 인터페이스를 사용합니다.
7. 결론
객체 지향 프로그래밍에서 '인터페이스'는 중요한 개념입니다. 이 개념을 이해하고 활용하면 코드의 유연성과 확장성을 높일 수 있으며 복잡한 문제에 대응하는데 유용합니다.
하지만 모든 것이 그렇듯이 잘못 사용되면 복잡성과 관리 난이도가 올라갈 수 있으니 주의하여 설계해야 합니다. 또한, 인터페이스는 추상 클래스와 마찬가지로 너무 많은 메서드를 포함하면 해당 인터페이스를 구현하는 클래스에서 복잡성이 증가할 수 있습니다.
따라서, 설계 단계에서 충분히 고려하여 적절한 방법으로 사용하는 것이 중요합니다. 그리고 인터페이스는 객체 지향 설계 원칙 중 하나인 '공통된 부분을 상위(부모) 클래스로 올리라'는 원칙에 잘 드러납니다.
마지막으로, 인터페이스를 사용함으로써 코드의 재사용성을 높일 수 있는 것은 물론, 팀원들 간의 협업도 용이해집니다. API와 같은 경우에는 다른 팀원들과 협업하기 위해 필요한 메소드들을 정의하는 규약 역할을 하게 됩니다.