인터페이스(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:

  • ROUGE
  • 덕 타이핑, 그리고 파이썬이 타입을 다루는 방식
  • 행렬 곱의 네 가지 관점
  • How to teach your embedding model new words
  • classmethod vs staticmethod in Python