하나 이상의 추상 메서드를 포함할 수 있는 클래스
직접 객체를 생성할 수 없고, 이를 상속한 하위 클래스가 구현을 완성해야 객체 생성 가능
공통적인 필드나 메서드는 구현 가능하며, 공통되지 않은 동작은 추상 메서드로 선언
public abstract class Animal {
String name;
// 일반 메서드
public void breathe() {
System.out.println("숨을 쉽니다.");
}
// 추상 메서드
public abstract void sound();
}
추상 클래스는 인스턴스를 생성할 수 없다
추상 클래스는 일반 메서드와 필드를 가질 수 있다
상속받은 자식 클래스는 반드시 추상 메서드를 구현해야 한다
단, 자식 클래스도 abstract라면 구현하지 않아도 됨
메서드의 선언부만 존재하고, 구현부는 없는 메서드
하위 클래스에서 반드시 오버라이딩해야 함
public abstract void sound();
abstract 메서드는 세미콜론(;)으로 끝나며 중괄호({})를 가지지 않음
반드시 추상 클래스 내에서만 선언 가능
// 추상 클래스
abstract class Animal {
public abstract void sound();
public void eat() {
System.out.println("먹습니다.");
}
}
// 구체 클래스
class Dog extends Animal {
@Override
public void sound() {
System.out.println("멍멍");
}
}
// 사용
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.sound(); // 멍멍
dog.eat(); // 먹습니다.
}
}
항목 |
추상 클래스 (abstract) |
인터페이스 (interface) |
---|---|---|
다중 상속 |
불가 |
가능 |
생성자 |
가질 수 있음 |
가질 수 없음 |
필드 |
인스턴스 변수, 정적 변수 가능 |
상수만 가능 (기본적으로 public static final) |
메서드 구현 |
가능 (일반 메서드 포함 가능) |
Java 8 이상부터 default/static 메서드 가능 |
사용 목적 |
공통 기능 제공 + 규격 설계 |
규격(명세) 설계 |
여러 클래스들이 동일한 기능을 공유하면서, 특정 동작은 다르게 구현해야 할 때
프레임워크나 라이브러리에서 기본 동작은 제공하되, 개발자에게 커스터마이징 부분을 남겨줄 때
예: 게임 캐릭터 설계
abstract class Character {
public void move() {
System.out.println("이동합니다.");
}
public abstract void attack();
}
class Warrior extends Character {
public void attack() {
System.out.println("칼로 공격합니다.");
}
}
class Archer extends Character {
public void attack() {
System.out.println("활로 공격합니다.");
}
}
키워드 |
설명 |
---|---|
abstract |
클래스나 메서드에 사용. 구현 없이 선언만 존재 가능 |
추상 클래스 |
직접 인스턴스 생성 불가. 하위 클래스에서 구현 필요 |
추상 메서드 |
구현 없이 선언만 존재. 하위 클래스에서 반드시 오버라이딩 |
주요 목적 |
다형성, 템플릿 구조 설계, 공통 인터페이스 제공 |
abstract는 공통된 설계를 정의하고, 세부 구현은 하위 클래스에 위임하는 데에 매우 유용한 도구입니다. 자바에서는 객체지향적인 설계를 위해 추상 클래스와 추상 메서드를 적극적으로 활용하며, 인터페이스와 함께 사용하는 경우가 많습니다.
객체지향 설계를 보다 체계적으로 구현하고 싶다면, 추상화 개념에 대한 이해는 필수입니다.