C#

인터페이스 vs 추상 클래스, 진짜 차이가 뭔데?

Juan_ 2025. 6. 3. 18:02
728x90

인터페이스 vs 추상 클래스, 진짜 차이가 뭔데?

개발 좀 하다 보면 누구나 한 번쯤은 이 고민에 부딪힌다.

"이거 인터페이스로 뽑아야 하나?
아니면 그냥 추상 클래스로 가야 하나?"

나도 그랬다. C#에 처음 발을 들였을 때, 팀 리더가 "여긴 I~~로 인터페이스 하나 만들고~"라고 말했는데 속으로는

"아니 그거 그냥 클래스 만들면 안되나…?"

근데 이 차이를 모르면 나중에 구조 잡다가 '뒤틀린 설계의 늪'에 빠지기 딱 좋다.

오늘은 그 차이를 진짜 현실적인 눈높이로 확실하게 정리해보자.


📌 개념부터 간단하게 정리해보자

인터페이스 (interface)

  • 말 그대로 '약속'이다.
  • 어떤 행위만 정의하고, 구현은 안 함.
  • 여러 개를 동시에 구현할 수 있음.
public interface IAnimal
{
    void MakeSound();
}

추상 클래스 (abstract class)

  • 약속도 하지만, 공통 로직도 넣을 수 있음.
  • 일부 구현은 해놓고, 나머지는 자식이 채워야 함.
  • 단일 상속만 가능.
public abstract class Animal
{
    public void Breathe() => Console.WriteLine("숨을 쉰다");

    public abstract void MakeSound();
}

📌 그런데 진짜 중요한 건 "왜" 사용하는가

케이스 1. 구현 방식이 제각각일 때

예를 들어 메시지를 보낸다고 치자. 이메일, 카카오톡, SMS… 전송 방식은 다 다르다.
이럴 땐?

👉 인터페이스로 추상화하면 된다.

public interface IMessageSender
{
    void Send(string to, string message);
}

public class EmailSender : IMessageSender { ... }
public class KakaoSender : IMessageSender { ... }

핵심: 공통 기능은 없고, 계약(행위)만 있을 때 인터페이스!

케이스 2. 공통 기능이 있을 때

모든 동물은 숨을 쉰다. 그런데 울음소리는 다르다.
이럴 땐?

👉 추상 클래스로 공통 구현을 묶는다.

public abstract class Animal
{
    public void Breathe() => Console.WriteLine("후...");

    public abstract void MakeSound();
}

public class Dog : Animal
{
    public override void MakeSound() => Console.WriteLine("멍멍");
}

핵심: 공통된 기능이 있고, 몇몇 기능만 오버라이드 해야 할 땐 추상 클래스!


📌 그럼 표로 한 번 정리해보자

항목인터페이스추상 클래스
목적행위 약속행위 + 공통 로직 제공
다중 구현가능불가능 (단일 상속만)
생성자없음있음
필드, 상태 보관불가가능
언제 쓰나구성 요소 교체가 유연해야 할 때공통 로직을 공유할 때

📌 실무에서 가장 많이 하는 실수

  1. 무조건 인터페이스만 쓰는 경우
    → 공통 로직이 흩어져 유지보수가 더 힘들어짐.
  2. 추상 클래스에 너무 많은 책임을 몰아주는 경우
    → 상속 구조가 강한 결합이 되어 변경에 취약해짐.
  3. 헷갈리면 일단 상속부터 쓰는 습관
    → 처음 설계가 잘못되면 나중엔 손도 못 댐.

📌 나만의 기준은 이렇게 세운다

  • I로 시작하는 이름이 자연스럽게 떠오르면 인터페이스다.
    예: ILogger, INotifier, IStorage
  • 부모 클래스가 데이터를 가질 필요가 있거나, 일부 기능을 재사용한다면 추상 클래스다.
  • 고민되면?
    → 일단 인터페이스로 시작하고, 공통 코드가 반복되기 시작하면 추상 클래스로 정리하자.

✅ 마무리하며

인터페이스와 추상 클래스는 단순히 "문법"의 차이가 아니다.
코드의 유연성과 재사용성, 그리고 미래의 확장 가능성에 깊은 영향을 준다.

처음에 제대로 구분해두면, 나중에 기능이 커져도 구조는 쉽게 흔들리지 않는다.

이 차이를 지금 확실하게 이해해두면,

"왜 우리 프로젝트는 이렇게 구조가 엉켜있을까?"
라는 고민이 조금은 줄어들 수 있을 거다.
728x90