인터페이스와 추상 클래스

인터페이스(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++ 등) - 현대 언어에서는 인터페이스에 기본 구현이나 정적 메서드를 허용하는 등 기능이 확장되고 있습니다.

--- 필요시 특정 언어별 문법이나 활용 예시도 제공해드릴 수 있습니다.


관련 게시글

자바에서 병렬 처리를 구현하는 방법은 무엇인가요?

자바에서 병렬 처리는 여러 작업을 동시에 실행하여 프로그램의 성능과 응답성을 향상시키는 기법입니다....

문제 해결 및 면접 질문

문제 해결 및 면접 질문에 관한 글 --- 1. 문제 해결의 중요성 문제 해결 능력은 개인과...

자바에서 중복된 요소를 제거하는 방법은 무엇인가요?

자바(Java)에서 중복된 요소를 제거하는 방법에는 여러 가지가 있습니다. 주로 컬렉션프레임워크를 활용하...

자바 Collections에서 정렬하는 방법은 무엇인가요?

자바 Collections에서 정렬하는 방법에 대해 설명드리겠습니다. 자바에서는 컬렉션(Collection) 자료구조의...

자바의 메모리 누수 문제를 해결하는 방법은 무엇인가요?

자바의 메모리 누수 문제를 해결하는 방법 --- 1. 메모리 누수란? 자바는 가비지 컬렉션(GC)...

팩토리 패턴을 사용하여 주어진 문제를 해결해보세요.

팩토리 패턴을 사용하여 주어진 문제를 해결해보세요. --- 1. 팩토리 패턴이란? 팩토리 패턴...