객체 지향을 공부하다 보면 interface와 abstract 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가 자주 잘 맞습니다.
Read Next
- 역할 교체 구조는 전략 패턴 가이드와 잘 이어집니다.
- 의존성 설계는 DIP 가이드와 의존성 주입 가이드를 같이 보면 좋습니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.
먼저 읽어볼 가이드
검색 유입이 많은 핵심 글부터 이어서 보세요.
- 미들웨어 트러블슈팅 가이드: Redis vs RabbitMQ vs Kafka 개발자를 위한 미들웨어 트러블슈팅 허브 글입니다. Redis, RabbitMQ, Kafka 중 어떤 증상부터 먼저 봐야 하는지와 어떤 문제 패턴이 각 시스템에 가까운지 정리합니다.
- Kubernetes CrashLoopBackOff: 먼저 볼 것들 startup failure, probe, config, resource limit 관점에서 CrashLoopBackOff를 어떻게 나눠서 봐야 하는지 정리한 가이드입니다.
- Kafka consumer lag가 계속 늘 때: 트러블슈팅 가이드 Kafka consumer lag가 계속 늘어날 때 무엇부터 봐야 하는지 정리합니다. poll 주기, 처리 속도, rebalance, consumer 설정까지 실전 기준으로 다룹니다.
- Kafka Rebalancing Too Often 가이드 Kafka consumer group에서 rebalance가 너무 자주 일어날 때 membership flapping, poll timing, protocol, assignment churn을 어떤 순서로 봐야 하는지 설명하는 실전 가이드입니다.
- Docker container가 계속 재시작될 때: 먼저 확인할 것들 exit code, command failure, environment mistake, health check 관점에서 Docker restart loop를 푸는 실전 가이드입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.