추상 클래스(Abstract Class)

mskimdev·2026년 3월 7일

Java OOP-Advanced

목록 보기
4/8
post-thumbnail

추상 클래스(Abstract Class)

직접 객체를 만들 수 없는 클래스다. "동물"이라는 개념은 있지만 실제로 "동물"이라는 이름만의 존재는 없다. 강아지, 고양이처럼 구체적인 존재만 있을 뿐이다. 이런 개념을 코드로 표현하는 게 추상 클래스다.


추상 클래스란?

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;
    }
}

추상 클래스 vs 인터페이스

추상 클래스인터페이스
인스턴스 생성불가불가
다중 상속불가 (하나만)가능 (여러 개)
필드일반 변수 가능상수만 가능
메서드일반 + 추상추상 (+ default, static)
목적공통 기능 상속 (IS-A)기능 보장 (CAN-DO)

마무리

추상 클래스는 "이 클래스는 직접 쓰는 게 아니라 상속해서 완성시키는 것"이다. 공통 코드는 추상 클래스에 두고, 각 자식 클래스마다 다르게 구현해야 할 부분을 추상 메서드로 강제하는 방식이다.

profile
<- 개발 공부하는 나

0개의 댓글