
직접 객체를 만들 수 없는 클래스다. "동물"이라는 개념은 있지만 실제로 "동물"이라는 이름만의 존재는 없다. 강아지, 고양이처럼 구체적인 존재만 있을 뿐이다. 이런 개념을 코드로 표현하는 게 추상 클래스다.
abstract 키워드를 붙인 클래스로, 직접 인스턴스를 만들 수 없다.
public abstract class Animal {
String name;
public void eat() {
System.out.println(name + "이(가) 먹는다.");
}
// 추상 메서드: 구현 없이 선언만
public abstract void sound();
}
Animal animal = new Animal(); // 컴파일 에러 — 추상 클래스는 인스턴스화 불가
구현부({}) 없이 선언만 된 메서드다. 자식 클래스에서 반드시 구현해야 한다.
public abstract class Animal {
public abstract void sound(); // 구현 없음
}
public class Dog extends Animal {
@Override
public void sound() { // 반드시 구현해야 함
System.out.println("왈왈!");
}
}
public class Cat extends Animal {
@Override
public void sound() {
System.out.println("야옹~");
}
}
추상 메서드가 있으면 자식 클래스는 해당 메서드를 구현하지 않으면 컴파일 에러가 난다. "이 클래스를 상속하는 애들은 반드시 이 기능을 가져야 한다"고 강제하는 것이다.

abstract를 붙이면 추상 클래스가 된다super()로 호출)public abstract class Shape {
String color;
public Shape(String color) {
this.color = color;
}
// 일반 메서드
public void printColor() {
System.out.println("색상: " + color);
}
// 추상 메서드
public abstract double area();
}
public class Circle extends Shape {
double radius;
public Circle(String color, double radius) {
super(color); // 부모 생성자 호출
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
| 추상 클래스 | 인터페이스 | |
|---|---|---|
| 인스턴스 생성 | 불가 | 불가 |
| 다중 상속 | 불가 (하나만) | 가능 (여러 개) |
| 필드 | 일반 변수 가능 | 상수만 가능 |
| 메서드 | 일반 + 추상 | 추상 (+ default, static) |
| 목적 | 공통 기능 상속 (IS-A) | 기능 보장 (CAN-DO) |
추상 클래스는 "이 클래스는 직접 쓰는 게 아니라 상속해서 완성시키는 것"이다. 공통 코드는 추상 클래스에 두고, 각 자식 클래스마다 다르게 구현해야 할 부분을 추상 메서드로 강제하는 방식이다.