본문 바로가기

JAVA

abstract 추상 클래스 or 추상 메서드

 

abstract(앱스트랙트)는 “추상적인”, 즉 ‘형태만 있고 내용은 없는’ 이란 뜻이다.
자바에서는 클래스나 메서드에 붙어서 ‘아직 완성되지 않은 구조’임을 나타내는 키워드


 abstract의 기본 개념

키워드 의미

abstract “구현이 미완성이다.”, “하위 클래스가 완성해야 한다.”

즉,
👉 “이 클래스나 메서드는 형태만 정의하고, 구체적인 내용은 자식 클래스가 구현해라!
라는 약속이에요.


 abstract class (추상 클래스)

  • abstract가 붙은 클래스는 직접 객체 생성이 불가능
  • 대신 공통 속성과 메서드 구조를 정의하고
    구체적인 구현은 상속받은 클래스가 완성

예:

// 추상 클래스
public abstract class Animal {
    // 추상 메서드 (몸체 없음)
    public abstract void sound();

    // 일반 메서드도 포함 가능
    public void eat() {
        System.out.println("먹는 중...");
    }
}

// 구체적인 클래스 (상속 후 구현)
public class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("멍멍!");
    }
}

public class Main {
    public static void main(String[] args) {
        // Animal a = new Animal(); ❌ 에러: 추상 클래스는 직접 생성 불가
        Animal dog = new Dog();
        dog.sound(); // 멍멍!
        dog.eat();   // 먹는 중...
    }
}

abstract method (추상 메서드)

  • 선언만 있고, 구현(내용) 이 없다 
  • 반드시 하위 클래스에서 오버라이드(@Override) 해야 한다
public abstract void sound(); // ← 세미콜론만 있고, 중괄호 없음

주요 특징 요약

구분 추상 클래스 (abstract class) 인터페이스 (interface)

목적 “공통 기능 + 일부 미완성 기능” 제공 “규약(약속)” 제공
객체 생성 ❌ 불가능 ❌ 불가능
상속 방식 extends (단일 상속) implements (다중 구현 가능)
포함 요소 변수, 일반 메서드, 추상 메서드 (자바8 이후) 디폴트/정적 메서드도 가능
사용 예 여러 클래스가 일부 기능만 다를 때 완전한 규칙만 정하고 싶을 때

 현실 비유

예를 들어,

"모든 동물은 울 수 있다"
하지만, ‘어떻게 우는지’는 동물마다 다르다.

이럴 때:

  • Animal → 추상 클래스 (울 수 있다는 구조 정의)
  • Dog, Cat → 구체 클래스 (울음소리를 직접 구현)

한 줄 정리

abstract = “형태만 정의하고 내용은 자식이 완성해야 한다.”
즉, 공통 구조를 정의하고, 세부 구현은 강제하는 틀이다.