인터페이스(Interface)
인터페이스는 객체 간의 상호작용을 위한 계약 역할을 담당한다.
인터페이스는 객체 간의 상호작용을 위한 계약(contract) 역할을 담당한다. 즉, 인터페이스는 객체가 가져야 할 속성과 메소드의 시그니처를 정의하여, 이를 구현하는 클래스가 반드시 해당 속과 메소드를 포함하도록 강제한다. 이로 인해, 여러 개발자가 참여하는 대규모 프로젝트에서 새로운 객체를 도입할 때 정해진 기본 틀을 따르게 되어 코드의 일관성과 유지보수성을 높일 수 있다.
인터페이스의 역할은 단순히 객체의 골조(구조)를 정의하는 것을 넘어서, 다형성(polymorphism) 과 의존성 역전 원칙(Dependency Inversion Principle) 등의 객체지향 설계 원칙을 구현하는 데에도 중요한 역할을 한다.
대부분의 경우 인터페이스는 직접적인 구현을 담고 있지 않지만, 최근 몇몇 언어(Java 8의 default 메소드, C#의 default interface methods 등)에서는 기본 구현을 제공할 수 있도록 허용한다. 이러한 기본 구현은 개발 편의성을 높여주지만, 인터페이스의 순수 추상적 특성을 훼손할 수 있다는 비판도 존재하므로 언제, 어떻게 사용할지에 대해 신중하게 고려해야 한다.
또한, 클래스 간에는 다중 상속에 제한이 있지만, 인터페이스는 개수 제한 없이 여러 개를 구현할 수 있다는 점에서 유연성을 제공한다. 다만, 여러 인터페이스가 동일한 메소드 시그니처를 가질 경우 의도치 않은 충돌이나 우선순위 문제가 발생할 수 있으므로, 인터페이스 설계 시 각 메소드의 역할과 이름을 직관적으로 정해 혼란을 방지해야 한다.
또한, 관련성이 떨어지는 여러 기능을 하의 인터페이스에 담아버리는 경우, 즉 여러 다른 객체들이 하나의 인터페이스를 구현하도록 강제하는 상황은 마치 God Class와 유사한 문제를 야기할 수 있다. 따라서 인터페이스는 그 목적과 역할이 명확하게 드러나도록 설계되어야 하며, 불필요한 추상화의 남용은 피하는 것이 좋다.
결론적으로, 인터페이스는 객체 간의 계약을 정의하여 일관된 구조와 상호작용을 보장하고, 다형성과 의존성 역전 등의 객체지향 원칙을 실현하는 데 필수적인 요소이다. 다만, 기본 구현의 도입과 다중 구현 등의 장점을 활용하더라도 그 사용에 있어서 적절한 기준과 명확한 설계가 필요하는 점을 항상 염두에 두어야 한다.
Enjoy Reading This Article?
Here are some more articles you might like to read next: