추상클래스(Abstract Class)
추상 클래스란 인스턴스화 할 수 없는 클래스로, 하나 이상의 추상 메소드(abstract method)를 포함하는 클래스입니다.
추상 메소드는 선언만 있고 구현이 없는 메소드입니다.
추상 클래스는 하위 클래스에서 공통된 기능을 상속하면서, 하위 클래스가 구현해야 할 기능을 강제하는 역할을 합니다.
특징
- 추상 클래스는 인스턴스를 생성할 수 없습니다. 따라서, 추상 클래스를 상속받은 자식 클래스의 인스턴스를 통해 사용할 수 있습니다.
- 추상 클래스는 추상 메소드와 일반 메소드를 모두 포함할 수 있습니다.
- 추상 클래스를 상속받은 자식 클래스는 추상 클래스에 선언된 추상 메소드를 모두 구현해야 합니다.
Example. 코드로 알아보자
abstract class Animal {
abstract void makeSound(); // 추상 메소드
void sleep() { // 일반 메소드
System.out.println("The animal is sleeping.");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("The dog barks.");
}
}
public class Main {
public static void main(String[] args) {
// Animal animal = new Animal(); // 오류: 추상 클래스의 인스턴스를 생성할 수 없음
Dog dog = new Dog(); // 추상 클래스를 상속받은 Dog 클래스의 인스턴스 생성
dog.makeSound(); // 추상 메소드의 구현 호출
dog.sleep(); // 일반 메소드 호출
}
위 예시에서 Animal
클래스는 추상 클래스로, makeSound
추상 메소드를 포함하고 있습니다.
Dog
클래스는 Animal
클래스를 상속받아 makeSound
메소드를 구현하였습니다.
추상 클래스 Animal
의 인스턴스를 직접 생성할 수 없으며, 상속받은 Dog
클래스의 인스턴스를 생성하여 사용할 수 있습니다
Example. 실제 사용 사례 Feat Template 메서드 패턴
템플릿 메서드 패턴은 추상 클래스를 활용한 좋은 예시입니다.
JDK(Java Development Kit)에서도 템플릿 메서드 패턴이 광범위하게 사용되고 있습니다.
JDK에서 템플릿 메소드 패턴으로 구현된 추상 클래스 예시로는, java.io.InputStream 클래스가 있습니다. InputStream 클래스는 추상 클래스이며, read 메소드가 템플릿 메소드로 작성되어 있습니다. 아래는 해당 코드 일부입니다.
public abstract class InputStream implements Closeable {
public int read(byte b[], int off, int len) throws IOException {
// ...
return read();
}
}
위 코드에서 read 메소드는 템플릿 메소드로 구현되어 있습니다. read 메소드는 다음과 같은 일련의 작업을 수행합니다.
- 입력 스트림에서 바이트를 읽어옴
- 바이트를 buffer에 저장
- 읽은 바이트 수를 반환
이 과정에서 실제 읽기 작업은 하위 클래스에서 구현됩니다. 따라서 read 메소드는 추상 메소드로 선언되어 있습니다.
이와 같이 JDK에서 추상 클래스를 사용하여 템플릿 메소드 패턴을 구현하는 경우가 많습니다.
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Java' 카테고리의 다른 글
Interface (0) | 2023.04.27 |
---|---|
타입 상속 (0) | 2023.04.27 |
프레임워크와 라이브러리의 차이 (0) | 2023.04.27 |
Template 메서드 패턴 (0) | 2023.04.27 |
다운 캐스팅(DownCasting) (0) | 2023.04.27 |