인터페이스와 추상 클래스, 그 차이를 간단히 이해해보자!

OOP(객체지향 프로그래밍)을 접하다 보면 인터페이스추상 클래스에 대한 질문이 항상 따라옵니다. 둘 다 '추상적'인 개념을 다루며, 공통적으로 특정 클래스들이 따라야 할 '틀'을 제공한다는 점에서 비슷해 보일 수 있습니다. 그렇다면 왜 두 개념이 따로 존재할까요? 이를 개발자의 입장에서 이해하기 쉽게 설명해보겠습니다.

인터페이스와 추상 클래스, 그 차이를 간단히 이해해보자!인터페이스와 추상 클래스, 그 차이를 간단히 이해해보자!인터페이스와 추상 클래스, 그 차이를 간단히 이해해보자!

1. 역할을 나눠보자!

인터페이스와 추상 클래스는 각자의 ‘역할’을 명확하게 이해하는 것이 핵심입니다. 쉽게 말해, 이 둘은 특정 상황에 맞게 적절히 사용될 때 빛을 발합니다.

  • 인터페이스는 약속이다!
    인터페이스는 말 그대로 '약속'입니다. 클래스가 인터페이스를 구현한다는 것은, 해당 클래스가 그 인터페이스에 정의된 모든 메서드를 반드시 구현하겠다는 약속이죠. 즉, 인터페이스는 행동의 설계도를 제공하는 역할을 합니다.
  • 추상 클래스는 유산이다!
    반면에 추상 클래스는 말 그대로 '유산'입니다. 이를 상속하는 클래스들이 일정한 공통된 기능을 물려받도록 하면서도, 각자 구체적인 구현은 자유롭게 할 수 있습니다. 즉, 추상 클래스는 공통된 속성과 기능을 물려주는 설계도입니다.

2. 구현과 상속의 차이

이제 인터페이스와 추상 클래스가 어떻게 다른지 구현과 상속의 관점에서 살펴보겠습니다.

  • 인터페이스는 100% 추상적이다.
    인터페이스는 메서드의 이름만 제공하고, 실제 내용은 전혀 없습니다. 다시 말해, 모든 메서드는 구현되지 않은 상태로 정의됩니다. 그래서 인터페이스는 어떤 클래스가 해당 인터페이스를 구현할 때, 그 클래스가 이 메서드들을 반드시 구현해야 합니다.인터페이스는 이렇게 추상적이기 때문에 여러 개를 동시에 구현(다중 구현)할 수 있습니다. 즉, 클래스는 여러 인터페이스와 약속할 수 있습니다.
  • public interface Flyable { void fly(); }
  • 추상 클래스는 완성된 코드도 가질 수 있다.
    추상 클래스는 추상 메서드도 가질 수 있지만, 일반 메서드도 가질 수 있습니다. 즉, 일부는 미리 구현된 기능을 제공하고, 일부는 자식 클래스에서 구현하도록 강제할 수 있죠. 예를 들어, 비슷한 행동을 하는 여러 동물 클래스를 만들 때 공통 기능을 추상 클래스에서 미리 정의할 수 있습니다.추상 클래스는 하나의 클래스만 상속받을 수 있기 때문에, 다중 상속은 불가능합니다.
  • public abstract class Animal { abstract void sound(); public void sleep() { System.out.println("잠을 잡니다."); } }

3. 상속받는 것 vs 약속하는 것

쉽게 말해, 추상 클래스는 상속받는 것, 인터페이스는 약속하는 것이라는 차이점이 있습니다.

  • 추상 클래스는 상속 관계를 만들고, 공통된 속성이나 기능을 물려주는 역할을 합니다. 상위 클래스에서 기본적으로 제공되는 기능을 자식 클래스들이 상속받아 사용할 수 있습니다.
  • 반면, 인터페이스는 구현을 약속하는 규칙을 정의하는 것이므로, 이를 구현하는 클래스들은 반드시 그 약속을 지켜서 해당 메서드를 구현해야 합니다.

4. 언제 무엇을 사용해야 할까?

인터페이스와 추상 클래스 중 무엇을 선택해야 할지는 설계의 목적에 따라 달라집니다.

  • 여러 종류의 행동을 클래스가 구현해야 할 때: 인터페이스 사용
    • 만약 어떤 클래스가 여러 종류의 행동을 가져야 하고, 특정 행동에 대한 약속만 필요하다면 인터페이스가 더 적합합니다. 예를 들어, 어떤 클래스가 Flyable, Swimmable 같은 여러 행동을 가져야 한다면 인터페이스로 다중 구현이 가능합니다.
  • 공통된 속성을 공유하면서도 세부적인 구현이 달라야 할 때: 추상 클래스 사용
    • 만약 공통적인 속성을 공유하면서도 구체적인 구현은 각자 다르게 가져가야 한다면 추상 클래스를 사용하는 것이 좋습니다. 예를 들어, 여러 동물이 공통적으로 ‘잠을 자는’ 기능을 가지고 있지만 ‘소리 내는’ 방식은 다르다면, sleep() 메서드는 미리 구현해두고 sound() 메서드는 추상 메서드로 남겨 자식 클래스가 구현하게 할 수 있습니다.

5. 정리

인터페이스와 추상 클래스의 차이를 쉽게 정리하면:

  • 인터페이스는 행위의 규약으로, 메서드만 선언하고 모든 메서드를 구현해야 함.
  • 추상 클래스는 공통된 속성과 행동을 상속하는 클래스로, 일부 메서드는 미리 구현할 수 있고, 상속 관계에서만 사용 가능.

이제 인터페이스와 추상 클래스의 차이를 명확하게 이해하고, 코드 설계 시 적절하게 선택할 수 있겠죠? 언제 어디서든 '약속이 필요할 때는 인터페이스', '유산을 물려줄 때는 추상 클래스'라는 점을 기억하세요!


이 글이 여러분의 코드 설계에 도움이 되길 바랍니다. OOP의 핵심은 객체 간의 관계를 잘 설계하는 것이며, 그 중심에는 인터페이스와 추상 클래스가 중요한 역할을 합니다. Happy Coding! 😄