interface vs abstract class 가이드: 언제 무엇을 써야 할까
Dev

interface vs abstract class 가이드: 언제 무엇을 써야 할까


객체 지향을 공부하다 보면 interfaceabstract class를 둘 다 만나게 됩니다. 처음에는 둘 다 “구현을 미루는 것”처럼 보여서 차이가 모호하게 느껴질 수 있습니다. 하지만 실제 설계에서는 역할이 꽤 다릅니다.

이 글에서는 아래 내용을 정리합니다.

  • interface와 abstract class가 어떻게 다른지
  • 각각이 잘 맞는 상황은 무엇인지
  • 어떤 기준으로 선택하면 좋은지

핵심은 interface는 역할과 약속을 표현하는 데 더 가깝고, abstract class는 공통 상태나 기본 동작을 공유하는 데 더 가깝다는 점입니다.

interface란 무엇인가

interface는 보통 “무엇을 할 수 있는가”를 표현하는 계약에 가깝습니다.

즉:

  • 어떤 메서드를 제공해야 하는지
  • 어떤 역할을 수행해야 하는지

를 드러내는 데 유리합니다.

구현 세부사항보다 역할을 중심으로 볼 때 잘 맞습니다.

abstract class란 무엇인가

abstract class는 완성되지 않은 부모 클래스로 볼 수 있습니다.

즉:

  • 일부 공통 상태를 가질 수 있고
  • 기본 동작을 제공할 수 있으며
  • 일부 메서드는 하위 타입에 맡길 수 있습니다

역할 계약뿐 아니라 공통 구현을 함께 나누고 싶을 때 자주 쓰입니다.

무엇이 가장 큰 차이일까

입문자 입장에서는 아래 기준이 가장 실용적입니다.

  • 역할/계약 중심이면 interface
  • 공통 상태/기본 구현 공유가 중요하면 abstract class

즉, “무엇을 할 수 있는가”와 “어떤 공통 기반을 공유하는가”의 차이로 보면 이해가 쉽습니다.

언제 interface가 더 잘 맞을까

  • 여러 구현이 같은 역할을 수행해야 할 때
  • 구현 세부사항보다 사용 규약이 중요할 때
  • 조합과 DI 중심 설계와 잘 맞추고 싶을 때

예를 들어 결제, 저장, 알림처럼 대체 가능한 역할을 표현할 때 잘 맞습니다.

언제 abstract class가 더 잘 맞을까

  • 하위 타입 사이에 공통 상태가 있을 때
  • 기본 동작을 일부 재사용하고 싶을 때
  • 상속 관계가 자연스럽고 안정적일 때

즉, 계약만이 아니라 구현 기반을 함께 공유하고 싶은 경우에 더 잘 맞습니다.

자주 하는 오해

1. interface가 항상 더 좋은 설계다

그렇지는 않습니다. 공통 상태와 기본 동작이 핵심이면 abstract class가 더 자연스러울 수 있습니다.

2. abstract class는 상속이니 무조건 피해야 한다

상속이 과할 때 문제가 되는 것이지, 자연스러운 공통 기반에는 유용할 수 있습니다.

3. 둘은 거의 같은 도구다

비슷해 보일 수 있지만, 설계에서 강조하는 지점이 다릅니다.

FAQ

Q. 입문자는 무엇을 더 먼저 익히면 좋을까

역할 분리와 의존성 설계 관점에서는 interface 감각을 먼저 잡는 것이 도움이 됩니다.

Q. 공통 코드가 조금만 있어도 abstract class가 맞나

항상 그런 것은 아닙니다. 공통 코드 양보다 상속 관계가 정말 자연스러운지가 더 중요합니다.

Q. DI와는 어떤 쪽이 더 잘 맞나

대체 가능한 역할을 표현하는 쪽에서는 interface가 자주 잘 맞습니다.

먼저 읽어볼 가이드

검색 유입이 많은 핵심 글부터 이어서 보세요.