Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

Java와 C#에서 추상 클래스와 인터페이스의 차이점 완벽 정리

객체지향 프로그래밍을 하다 보면 추상 클래스(Abstract Class)인터페이스(Interface) 중 무엇을 사용해야 할지 고민하게 됩니다. 이 글에서는 Java와 C# 환경에서 두 개념이 어떻게 다른지 핵심적인 차이점을 체계적으로 정리해 드립니다.

추상 클래스(Abstract Class)란?

추상 클래스는 클래스의 공통된 뼈대를 제공하면서, 일부 기능은 구현하고 일부는 자식 클래스에게 위임하는 방식으로 동작합니다.

주요 특징

  • 선언과 구현 모두 포함: 추상 메서드뿐 아니라 실제 구현부가 있는 일반 메서드도 가질 수 있습니다.

  • 다중 상속 불가: 하나의 클래스는 오직 하나의 추상 클래스만 상속받을 수 있습니다.

  • 생성자 포함 가능: 자식 클래스 초기화 시 호출될 수 있는 생성자를 가질 수 있습니다.

  • 정적(static) 멤버 허용: static 필드나 메서드를 포함할 수 있습니다.

  • 다양한 접근 제어자 사용 가능: public, private, protected 등 여러 접근 수준을 지정할 수 있습니다.

  • 우수한 성능: 직접 참조 방식으로 동작하기 때문에 인터페이스보다 속도가 빠릅니다.

  • 핵심 정체성 구현에 적합: 클래스의 본질적인 기능과 공통 동작을 정의하는 데 사용됩니다.

  • 유연한 구현 수준: 전체 구현, 부분 구현, 또는 미구현 상태로 존재할 수 있습니다.

  • 구성 요소: 메서드, 필드, 상수를 모두 포함할 수 있습니다.

💡 여러 구현체가 유사한 로직과 공통 동작을 공유한다면 추상 클래스를 사용하는 것이 권장됩니다.

인터페이스(Interface)란?

인터페이스는 구현 세부 사항 없이 '무엇을 해야 하는가'라는 계약만을 정의하는 설계 도구입니다.

주요 특징

  • 선언부만 포함: 기본적으로 메서드의 시그니처만 정의합니다. (Java 8 이후 default 메서드 예외)

  • 다중 상속 가능: 하나의 클래스가 여러 인터페이스를 동시에 구현할 수 있어 다중 상속 효과를 얻습니다.

  • 생성자 없음: 인스턴스화할 수 없으므로 생성자를 가질 수 없습니다.

  • 정적 멤버 제한: C#에서는 static 멤버를 허용하지 않으며, Java에서도 인스턴스 static 멤버는 불가능합니다.

  • public 접근 제어자: 인터페이스의 모든 멤버는 기본적으로 public으로 간주됩니다.

  • 상대적으로 낮은 성능: 실제 메서드를 찾기 위해 런타임 조회가 필요해 추상 클래스보다 느립니다.

  • 주변 능력 부여에 적합: Comparable, Serializable처럼 클래스에 추가 기능을 부여하는 데 사용됩니다.

  • 완전한 구현 필수: 구현 클래스는 인터페이스의 모든 메서드를 반드시 구현해야 합니다.

  • 메서드 중심: 필드 선언은 불가능하며(상수 제외), 메서드 정의에 집중합니다.

💡 서로 다른 여러 구현체가 동일한 메서드 계약을 공유해야 한다면 인터페이스가 적합합니다.

한눈에 비교하는 추상 클래스 vs 인터페이스

구분추상 클래스인터페이스
구현 내용선언 + 구현 가능선언 중심
다중 상속불가능 (단일 상속)가능 (다중 구현)
생성자포함 가능포함 불가
static 멤버허용제한적
접근 제어자public, private, protected 등public 기본
성능빠름상대적으로 느림
사용 목적클래스의 핵심 정체성부가 기능·계약 정의
구현 의무선택적 (부분 구현 가능)전체 구현 필수

마무리: 어떤 것을 선택해야 할까?

두 개념의 선택 기준은 간단합니다. 클래스들 간에 긴밀한 관계와 공통 구현 로직이 있다면 추상 클래스를, 관계없는 클래스들에게 공통 규약을 부여하고 싶다면 인터페이스를 선택하세요. 실무에서는 두 가지를 함께 활용하여 유연하고 확장 가능한 설계를 만드는 것이 일반적입니다.