개발/자바
Java 추상 클래스 (abstract class)
피터JK
2025. 2. 18. 11:48
728x90
🔹 Java 추상 클래스 (abstract class)
1️⃣ 추상 클래스란?
- 추상 클래스(abstract class) 는 추상 메서드(abstract method)를 포함할 수 있는 클래스
- 추상 클래스 자체로 객체 생성이 불가능
- 일부 구현을 포함할 수도 있고, 포함하지 않을 수도 있음
- 자식 클래스가 상속받아 구현하도록 강제하는 역할
2️⃣ 추상 클래스 선언과 사용
✅ 추상 클래스 선언
abstract class Animal {
abstract void makeSound(); // 추상 메서드 (몸체 없음)
void sleep() {
System.out.println("잠을 잡니다.");
}
}
✔ abstract 키워드를 사용하여 클래스 및 메서드를 정의
✔ makeSound()는 구현이 없고, 하위 클래스에서 반드시 구현해야 함
✔ sleep() 메서드는 일반 메서드로 구현 포함 가능
✅ 추상 클래스를 상속받아 구현
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("멍멍!");
}
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("야옹!");
}
}
✔ Dog와 Cat 클래스는 Animal을 상속
✔ makeSound() 메서드를 반드시 구현해야 함
✅ 사용 예시
public class AbstractExample {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound(); // 출력: 멍멍!
myCat.makeSound(); // 출력: 야옹!
myDog.sleep(); // 출력: 잠을 잡니다.
}
}
✔ Animal 자체로는 객체를 생성할 수 없음
✔ Dog, Cat 객체는 Animal 타입으로 다형성(polymorphism) 적용 가능
3️⃣ 추상 클래스 vs 인터페이스
| 특징 | 추상 클래스 (abstract class) | 인터페이스 (interface) |
| 객체 생성 | ❌ 직접 생성 불가능 | ❌ 직접 생성 불가능 |
| 메서드 | ✔ 추상 메서드 + 일반 메서드 포함 가능 | ✔ 기본적으로 모든 메서드가 추상 메서드 (Java 8부터 default 메서드 지원) |
| 필드(변수) | ✔ 인스턴스 변수 가능 | ❌ 모든 필드는 public static final (상수) |
| 상속 관계 | ✔ extends 사용 (단일 상속) | ✔ implements 사용 (다중 구현 가능) |
| 사용 목적 | ✔ 공통된 동작 일부 구현 후 하위 클래스에서 확장 | ✔ 공통된 동작을 강제 (구현 없이 설계 제공) |
✅ 언제 사용해야 할까?
- 공통된 로직을 일부 구현하면서 하위 클래스가 추가적인 동작을 구현해야 할 때 → abstract class
- 구현 없이 단순히 설계(명세)만 제공하고 싶을 때 → interface
4️⃣ 추상 클래스의 활용 예시
✅ 템플릿 메서드 패턴 (Template Method Pattern)
abstract class Game {
abstract void initialize();
abstract void start();
abstract void end();
// 템플릿 메서드
public final void play() {
initialize();
start();
end();
}
}
class Soccer extends Game {
@Override
void initialize() { System.out.println("축구 게임 초기화"); }
@Override
void start() { System.out.println("축구 경기 시작!"); }
@Override
void end() { System.out.println("축구 경기 종료!"); }
}
public class TemplateMethodExample {
public static void main(String[] args) {
Game game = new Soccer();
game.play();
}
}
✔ 공통된 실행 흐름(play())은 추상 클래스에서 정의
✔ 세부 동작(initialize(), start(), end())은 하위 클래스에서 구현
✔ 객체마다 다른 동작을 유지하면서 공통된 흐름을 보장할 때 사용
🎯 정리
✅ 추상 클래스는 공통된 동작을 일부 구현하면서, 하위 클래스에서 필수적으로 구현해야 하는 기능을 정의할 때 사용
✅ 인터페이스와 달리 일반 메서드와 멤버 변수를 가질 수 있음
✅ 템플릿 메서드 패턴과 같은 설계 패턴에서 많이 사용됨
✅ 객체 생성 불가능하고, 반드시 하위 클래스에서 구현해야 사용 가능
🚀 "부분적으로 구현된 클래스가 필요할 때 추상 클래스를 고려하자!"
728x90