인터페이스와 추상 클래스 총정리

홍성덕·2025년 1월 19일

추상화

인터페이스(interface)와 추상(abstract) 클래스는 모두 객체 지향 프로그래밍(OOP)에서 추상화(abstraction)를 구현하기 위한 중요한 도구이다. 추상화란 복잡한 시스템을 단순화하여 핵심적인 개념과 기능에 집중할 수 있도록 표현하는 것을 말한다. 추상화는 불필요한 세부 사항을 숨기고, 중요한 속성과 동작만을 드러내어 시스템의 이해와 관리, 유지보수를 용이하게 만든다.

인터페이스와 추상 클래스는 각각의 방식으로 추상화를 지원하지만, 사용 목적과 특성에서 차이가 있다.

인터페이스

인터페이스란?

인터페이스는 설계 단계에서 구체적인 구현이 있는 클래스를 만드는 것이 아니라, 클래스가 구현해야 할 메서드의 시그니처(메서드 이름, 매개변수, 반환 타입 등)를 미리 정의하는 추상적인 계약이다. 이를 통해 다양한 클래스가 동일한 인터페이스를 구현함으로써 일관된 방식으로 동작할 수 있다.

Kotlin에서는 프로퍼티도 선언할 수 있으므로, 클래스가 구현해야 할 특정 속성이나 기능을 미리 정의하는 추상적인 계약이라고 표현하는 것이 더 옳을 것이다.

인터페이스를 사용하는 이유

인터페이스를 구현한 클래스가 인터페이스에 정의되어 있는 특정 기능을 반드시 구현하도록 강제하기 위함이다.

인터페이스의 또다른 용도는 외부에 노출되는 것을 정의해 놓고자 할 때 사용된다.
MemberManagerImpl이라는 클래스가 있는데 이 클래스를 외부에 노출시키는 것이 아니라 MemberManager라는 인터페이스만 외부에 노출시킴으로써, 외부에서는 MemberManager 인터페이스만을 통해 기능을 사용할 수 있게 되어, 나중에 MemberManagerImpl의 구현을 변경하더라도 외부 코드에 미치는 영향을 최소화할 수 있다.
즉 구현 세부 사항을 숨기고 외부 코드가 인터페이스에만 의존하도록 함으로써 구현 변경의 영향을 최소화하는 데 목적이 있다.

추상 클래스

추상 클래스란?

추상 클래스(Abstract Class)는 하나 이상의 추상 메서드(구현되지 않은 메서드)를 포함할 수 있는 클래스이다. 일반 클래스처럼 일반 필드와 일반 메서드를 가질 수 있지만, 직접 인스턴스를 생성할 수 없으며 다른 클래스들이 상속받아서 사용한다.

Kotlin에서는 추상 메서드 뿐만 아니라 추상 프로퍼티도 포함 가능하다. 그래서 Kotlin에서 추상 클래스는 하나 이상의 추상 프로퍼티(초기화되지 않은 프로퍼티) 혹은 하나 이상의 추상 메서드(구현되지 않은 메서드)를 포함할 수 있는 클래스이다.

추상 클래스를 사용하는 이유

추상 클래스는 여러 클래스 간에 공통된 속성과 동작을 정의하여 코드의 재사용성을 높이고 유지보수를 용이하게 만들고, 추상 클래스를 상속받은 자식 클래스에서 특화된 기능을 추가하거나 기존 기능을 확장하는 것이 주 목적이다.

참고로 자바의 추상 클래스는 추상 필드 선언(예를 들어, abstract int a;)이 불가능하지만, 코틀린의 추상 클래스는 추상 프로퍼티를 선언하는 것이 가능하다.

인터페이스와 추상 클래스의 차이

  1. 목적성의 차이 (위에서 각각 설명했다)
  2. 인터페이스는 상태를 가질 수 없지만, 추상 클래스는 클래스이기 때문에 상태를 가질 수 있다. 인터페이스와 추상 클래스 둘다 일반 메소드를 정의할 수 있는데, 인터페이스와 다르게 추상 클래스에서는 일반 메소드에서 상태를 변경시킬 수 있다는 차이가 있다.
  3. 추상 클래스는 부모-자식 간의 계층화된 관계를 명확히 표현하고 싶을 때, 그리고 인터페이스는 계층화와 관계 없이 특정 기능을 그냥 강제해야 할 때 사용하는 것이 적합하다.
  4. 인터페이스는 다중 상속(구현) 가능, 추상 클래스는 불가능
profile
안드로이드 주니어 개발자

0개의 댓글