[Java] 심화 - 추상클래스와 final 키워드

이지연·2025년 12월 19일

개요

아래의 내용은 java_grammer 레파지토리 C03Inheritance 디렉터리에 저장되어있는 내용을 정리함


추상클래스(abstract class)란?

추상클래스는 반드시 상속을 전제로 설계된 클래스임.
즉, 직접 객체로 만들 목적이 아닌 “공통된 기본 틀”을 제공하기 위한 클래스인 것.

추상클래스는 ‘구현되지 않은 메서드(추상메서드)’를 포함할 수 있기 때문에 객체를 직접 생성할 수 없음.
반드시 상속을 통해 자식 클래스에서 구현(override) 해야 함.


기본 구조 예시

abstract class AbstractAnimal {
    void makeSound() {
        System.out.println("동물은 소리를 냅니다.");
    }

    // 추상메서드: 구현부 없이 선언만 존재
    abstract void makeSound2();
}
  • makeSound() → 일반 메서드로 구현부 존재함.
  • makeSound2() → 추상메서드로 구현부 없음.
  • 추상메서드를 하나라도 가지면 클래스 전체가 abstract로 지정되어야 함.

추상클래스 사용 예제

package C03Inheritance;

public class C06AbstractMain {
    public static void main(String[] args) {
        // 추상클래스는 객체 생성 불가
        // AbstractAnimal a1 = new AbstractAnimal(); // 오류 발생

        // 익명 클래스로 임시 구현체 생성(참고용)
        /*
        AbstractAnimal a1 = new AbstractAnimal() {
            @Override
            void makeSound2() {
            }
        };
        */

        // 자식 클래스를 통해 추상클래스 구현
        AbstractDog d1 = new AbstractDog();
        d1.makeSound();  // 부모의 일반 메서드 호출
        d1.makeSound2(); // 자식에서 오버라이딩된 메서드 호출

        // 부모 타입으로 자식 객체 참조도 가능
        AbstractAnimal d0 = new AbstractDog(); 

        // 인터페이스 예시
        // 인터페이스도 구현체가 없으면 객체 생성 불가능
        List<Integer> myList = new ArrayList<>();
        // List<Integer> myList = new List<>(); // 불가능
    }
}

추상메서드 오버라이딩

자식 클래스에서 부모 추상메서드를 반드시 재정의해야 함.
재정의하지 않으면 해당 클래스도 abstract로 선언해야 함.

class AbstractDog extends AbstractAnimal {
    @Override
    void makeSound2() {
        System.out.println("멍!!멍!!");
    }
}

위 예시에서 AbstractDogAbstractAnimal의 추상메서드 makeSound2()를 구현함으로써 구체화된 클래스(Concrete Class)가 된 것임.


추상클래스 vs 인터페이스 비교

구분추상클래스인터페이스
목적공통 기능의 기본 설계규약(명세) 정의
메서드 구성일반 메서드 + 추상메서드모든 메서드는 기본적으로 추상(또는 default/static 가능)
변수인스턴스 변수 가질 수 있음상수(public static final)만 가능
다중 상속불가능가능
객체 생성불가능불가능 (구현 클래스 필요)

둘 다 ‘직접 사용할 수 없는’ 설계용 클래스지만, 추상클래스는 일부 구현이 포함되고, 인터페이스는 100% 설계-only 역할이라는 차이가 있음.


final 클래스

final 키워드는 상속을 금지할 때 사용하는 키워드임.
즉, 더 이상 확장할 수 없는 종단 클래스(final class)를 만들 때 사용함.

final class FinalParents { }

// class Test extends FinalParents {} // 오류: 상속 불가
  • final이 붙은 클래스는 다른 클래스가 extends로 상속받는 것이 불가능함.
  • 보안상 또는 변경을 막기 위한 클래스 설계 시 사용되는 경우가 많음.

정리

키워드설명객체 생성 여부상속 여부
abstract class추상 메서드를 포함한 설계용 클래스불가능가능
abstract method구현 없이 선언만 존재하는 메서드-자식이 반드시 구현
final class상속이 불가능한 클래스가능불가능
profile
Eazy하게

0개의 댓글