인터페이스와 추상 클래스
인터페이스(Interface)와 추상 클래스(Abstract Class)는 객체지향 프로그래밍(OOP)에서 추상화(Abstraction) 를 구현하는 중요한 수단입니다.
둘 다 공통적으로 클래스에서 구현될 메서드의 시그니처(이름과 매개변수)를 정의하지만, 사용 목적과 구현 방식에 차이가 있습니다.
아래에서 각각의 개념과 차이점을 설명하겠습니다.
--- 1. 인터페이스 (Interface) 정의 - 인터페이스는 구현해야 할 메서드들의 명세(시그니처) 만 정의한 추상형 타입입니다.
- 객체가 가져야 할 행위(메서드) 를 정의하며, 변수는 일반적으로 상수만 선언할 수 있습니다.
- 인터페이스를 구현하는 클래스는 인터페이스에 정의된 모든 메서드를 반드시 구현해야 합니다.
특징 - 다중 상속이 가능: 클래스는 여러 개의 인터페이스를 구현할 수 있습니다.
- 구현 내용 없음: 인터페이스 메서드는 기본적으로 구현이 없고, 구현 클래스에서 구현합니다.
(단, 자바 8 이상에서는 `default` 메서드로 기본 구현을 가질 수 있습니다) - 상수 선언 가능: 인터페이스 내에 선언된 변수는 `public static final` 상수입니다.
- 객체 생성 불가: 인터페이스 자체로는 인스턴스를 만들 수 없습니다.
예시 (Java) ```java public interface Animal { void eat(); void move(); } public class Dog implements Animal { public void eat() { System.out.println("Dog eats bones."); } public void move() { System.out.println("Dog runs."); } } ``` --- 2. 추상 클래스 (Abstract Class) 정의 - 추상 클래스는 클래스의 일종으로, 일부 메서드는 구현되어 있고, 일부 메서드는 구현이 되어 있지 않은(추상 메서드) 상태로 둘 수 있는 클래스입니다.
- 추상 클래스는 공통 속성이나 메서드의 일부 구현을 자식 클래스와 공유하기 위해 사용됩니다.
특징 - 추상 메서드를 가질 수 있고, 일반 메서드도 가질 수 있음. - 기존 구현을 포함할 수 있어 코드 재사용성이 높음. - 단일 상속만 지원: 한 클래스는 하나의 추상 클래스만 상속할 수 있습니다.
- 인스턴스 생성 불가: 추상 클래스도 직접 객체화 할 수 없습니다.
예시 (Java) ```java public abstract class Animal { public void breathe() { System.out.println("Animal breathes."); } public abstract void eat(); // 추상 메서드 } public class Dog extends Animal { public void eat() { System.out.println("Dog eats bones."); } } ``` --- 3. 인터페이스 vs 추상 클래스 비교 | 구분 | 인터페이스 | 추상 클래스 | |------------------------|---------------------------------|----------------------------------| | 목적 | 행동의 명세(계약) 정의 | 공통 기능의 부분 구현 및 명세 제공 | | 다중 상속 지원 여부 | 지원 (여러 인터페이스 구현 가능) | 불가 (하나의 부모 클래스만 상속 가능) | | 메서드 구현 | 기본적으로 없음 (Java 8 이후 `default` 가능) | 일부 메서드 구현 가능 | | 변수 선언 | `public static final` 상수만 가능 | 인스턴스 변수 선언 가능 | | 생성자 | 없음 | 있음 | | 접근 제어자 | 인터페이스 내 멤버는 모두 `public` (자바의 경우) | 다양한 접근 제어자 사용 가능 | --- 4. 언제 사용해야 하나? - 인터페이스 - 서로 관련이 없거나 다른 부모 클래스를 이미 상속받고 있는 클래스들이 공통의 행위를 공유해야 할 때. - 다중 상속이 필요한 경우. - API 설계 시 구현에 대한 약속(계약)을 정의하려 할 때. - 추상 클래스 - 여러 클래스들이 공통된 속성(필드) 이나 기본 구현 을 공유해야 할 때. - 클래스 계층 구조 내에서 기본 동작을 정의하고 일부만 서브클래스에서 구현하기를 원할 때. - 다중 상속이 필요 없고, 클래스간의 관계가 ‘~이다’(is-a) 관계일 때. --- 5. 요약 | | 인터페이스 (Interface) | 추상 클래스 (Abstract Class) | |-------------------|-------------------------------------------|---------------------------------------------| | 구현 내용 | 없음 (기본 구현 가능하려면 `default` 사용) | 일부 구현 가능 | | 상속 | 다중 구현 가능 | 단일 상속만 가능 | | 변수 | 상수만 가능 | 인스턴스 변수 가능 | | 생성자 | 없음 | 있음 | | 접근 지정자 | 멤버는 기본적으로 `public` | 다양하게 설정 가능 | | 용도 | 행위(동작) 정의, 계약 (behavior specification) | 공통 기능 구현 및 기본 클래스 역할 | --- 참고 - 각 언어의 세부 문법이 다를 수 있으니 사용하는 프로그래밍 언어의 공식 문서를 참조하는 것이 좋습니다.
(예: Java, C , C++ 등) - 현대 언어에서는 인터페이스에 기본 구현이나 정적 메서드를 허용하는 등 기능이 확장되고 있습니다.
--- 필요시 특정 언어별 문법이나 활용 예시도 제공해드릴 수 있습니다.