추상 클래스와 인터페이스에 대한 이해
Java에서 객체지향 프로그래밍을 이해하는 데 있어 중요한 개념인 추상 클래스와 인터페이스에 대해 알아보겠습니다. 이 두 개념은 코드의 재사용성과 유연성을 높이고, 모듈화된 설계를 가능하게 합니다. 각 개념을 자세히 살펴보겠습니다.
추상 클래스 (Abstract Class)
추상 클래스란?
추상 클래스는 abstract 키워드로 선언된 클래스로, 객체를 직접 생성하기 위한 것이 아니라 상속을 통해 재사용 가능한 슈퍼 클래스를 만들기 위한 것입니다. 추상 클래스는 추상 메소드를 한 개 이상 포함하거나, 직접적인 인스턴스를 생성할 수 없게 하여 상속을 강제하는 역할을 합니다.
추상 메소드란?
추상 메소드는 abstract 키워드와 함께 선언되며, 메소드의 원형만 존재하고 구현은 없습니다. 즉, 해당 메소드가 무엇을 해야 할지는 정해져 있지만, 어떻게 할지는 서브 클래스가 결정하도록 합니다.
abstract public String getName();
위의 코드처럼, 추상 메소드는 메소드 바디가 없으며, 서브 클래스가 반드시 이 메소드를 구현해야 합니다.
추상 클래스의 예시
abstract class Shape { // 추상 클래스 선언
public Shape() { /* 생성자 */ }
public void edit() { /* 구현된 메소드 */ }
abstract public void draw(); // 추상 메소드 선언
}
위의 Shape 클래스는 추상 클래스이며, draw()라는 추상 메소드를 포함하고 있습니다. 따라서 이 클래스를 상속받는 서브 클래스는 draw() 메소드를 반드시 구현해야 합니다.
추상 클래스의 특징
- 추상 클래스의 인스턴스는 생성할 수 없습니다. 이유는 추상 메소드가 미완성 상태이기 때문입니다.
- 서브 클래스가 추상 클래스를 상속받을 경우, 해당 서브 클래스도 추상 클래스가 되거나 모든 추상 메소드를 오버라이딩하여 구현해야 합니다.
추상 클래스의 목적
- 상속을 위한 슈퍼 클래스로 사용됩니다.
- 서브 클래스가 반드시 구현해야 하는 메소드를 추상 메소드로 정의하여 인터페이스 역할을 합니다.
- 다형성을 실현할 수 있습니다.
인터페이스 (Interface)
인터페이스란?
인터페이스는 클래스의 일종으로, 서로 다른 하드웨어나 소프트웨어 간의 규격을 정의한 것입니다. Java에서 인터페이스는 소프트웨어 모듈의 규격화를 통해 모듈화된 설계를 가능하게 합니다.
인터페이스 선언
인터페이스는 interface 키워드를 사용해 선언합니다. 인터페이스 안에는 상수 필드, 추상 메소드, 디폴트 메소드, 정적 메소드 등이 포함될 수 있습니다.
interface PhoneInterface {
int TIMEOUT = 10000; // 상수 필드
void sendCall(); // 추상 메소드
void receiveCall(); // 추상 메소드
default void printLog() { // 디폴트 메소드
System.out.println("** phone **");
}
}
- 상수 필드:
public static final키워드가 생략되어도 상수로 취급됩니다. - 추상 메소드:
public abstract가 생략되어도 추상 메소드로 취급됩니다. - 디폴트 메소드: 인터페이스에서 구현할 수 있는 메소드로,
default키워드를 사용합니다.
인터페이스의 특징
- 객체 생성 불가: 추상 메소드가 있기 때문에 인터페이스의 인스턴스를 생성할 수 없습니다.
- 다중 상속 가능: 인터페이스는 여러 인터페이스를
extends키워드를 사용해 다중 상속할 수 있습니다. - 구현 클래스: 인터페이스를 구현하는 클래스는
implements키워드를 사용하여 인터페이스의 모든 추상 메소드를 구현해야 합니다.
인터페이스 상속과 구현 예시
interface Phone extends PhoneInterface, MP3Interface { }
class SmartPhone implements PhoneInterface {
@Override
public void sendCall() {
System.out.println("Calling...");
}
@Override
public void receiveCall() {
System.out.println("Receiving a call...");
}
}
위 예시에서 Phone 인터페이스는 두 개의 인터페이스를 상속받으며, SmartPhone 클래스는 PhoneInterface를 구현하여 모든 추상 메소드를 정의하고 있습니다.
추상 클래스와 인터페이스의 차이점
| 구분 | 추상 클래스 | 인터페이스 |
|---|---|---|
| 키워드 | abstract class |
interface |
| 멤버 | 필드, 메소드, 추상 메소드 포함 가능 | 상수, 추상 메소드, 디폴트/정적 메소드 |
| 상속 | 단일 상속 (다중 상속 불가) | 다중 상속 가능 |
| 인스턴스 생성 | 불가능 | 불가능 |
| 목적 | 상속을 통해 코드 재사용 및 다형성 구현 | 모듈 간 규격화 및 다중 구현 가능 |
마무리
추상 클래스와 인터페이스는 각각 다른 목적을 가지고 있지만, 둘 다 객체지향 프로그래밍의 중요한 요소로, 코드의 재사용성, 유지보수성, 다형성 등의 이점을 제공합니다. 추상 클래스는 상속을 통한 기능 공유에, 인터페이스는 구현의 강제화와 다중 상속을 통해 보다 유연한 설계를 가능하게 합니다.
참조 📜: 명품 JAVA ESSENTIAL - 황기태 지음
'☕ Java' 카테고리의 다른 글
| [Java] 메모리 영역 (1) | 2024.10.16 |
|---|---|
| [Java] 클래스에 대한 캐스팅(Casting)과 오버라이딩(Overriding) (0) | 2024.10.16 |
| [Java] Thread와 Java Thread (0) | 2024.10.15 |
| [Java] 자료형 (0) | 2024.10.15 |
