개발 새발/JAVA
[Java] 자바 객체지향 - 추상클래스
recordari
2025. 4. 9. 16:01
추상클래스
= 미완성 설계도(= template) 또는 추상 메서드를 가진 클래스라고 할 수 있다.
추상클래스는 키워드 abstract를 붙이면 된다.
abstract class Animal {
abstract void sound(); // 추상 메서드
void breathe() {
System.out.println("숨을 쉰다");
}
}
미완성 설계도로 완성된 제품을 만들 수 없듯이, 추상클래스로는 인스턴스를 생성할 수 없다.
왜 완성을 안 시켰을까?
사람들이 공통적으로 잘 쓸만한 것들/변경되지 않을 것들(템플릿)을 남겨두고, 추가적으로 덧붙이는 걸 쉽게 하도록 도와주기 위해서
추상메서드
메서드는 선언부와 구현부(몸통)으로 구성되어 있다.
선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상메서드이다. 즉, 미완성 메서드다.
abstract class Animal {
abstract void sound(); // 선언만 하고, 구현은 X
}
왜 완성을 안 시켰을까?
메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문이다.
추상메서드 역시 키워드 abstract를 앞에 붙이고, {} 괄호 대신 ;으로 끝내면 된다.
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍!");
}
}
추상화란?
공통점을 찾아내서 공통의 조상을 만드는 것.
- 변하지 않는 것(공통의 것)을 남기고
- 변하는 것과 분리한다
그리고 분리한 다음에는 다시 완전하게 만들어야 한다.
1. 상속, 2. 주입 으로 완성
→ 상속으로 하는 게 template method 패턴
→ 주입(포함)으로 하는 게 전략 패턴
→ 상속과 주입을 따로 해도 되고, 같이 써도 됨
예시 코드
abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
// 일반 메서드: 공통 로직
void readyMessage() {
System.out.println("=== 게임을 시작합니다 ===");
}
// 템플릿 메서드 (순서 고정)
public final void play() {
readyMessage(); // 공통 동작
initialize(); // 각 게임별 초기화
startPlay(); // 게임 시작
endPlay(); // 게임 종료
}
}
class Football extends Game {
void initialize() {
System.out.println("축구 게임 준비 중");
}
void startPlay() {
System.out.println("축구 게임 시작!");
}
void endPlay() {
System.out.println("축구 게임 종료");
}
}
public class Main {
public static void main(String[] args) {
Game game = new Football();
game.play();
}
}
- play()는 템플릿 메서드
→ 전체 실행 순서를 정의하고,
→ 구체적인 내용은 하위 클래스에 위임 - readyMessage()는 일반 메서드
→ 게임 시작 전 공통 메시지를 출력
→ 모든 게임에서 같은 방식으로 사용되는 공통 기능이기 때문에 추상화하지 않고 추상 클래스에서 직접 구현된다.
탬플릿 메서드란?
템플릿 메서드 패턴 은 알고리즘의 구조(순서)를 상위 클래스에 정의하고, 그 구조를 이루는 구체적인 단계(step)는 하위 클래스에 맡기는 패턴