추상 클래스
기술노트
🏛️ 추상 클래스 (Abstract Class)
추상 클래스는 미완성된 설계도에 비유할 수 있는 특별한 클래스입니다. 객체를 직접 생성할 수는 없으며, 다른 클래스들이 상속받아 미완성된 부분을 완성하여 사용하도록 만들어졌습니다.
추상 클래스는 구현된 일반 메서드와, 구현되지 않은 '추상 메서드'를 모두 포함할 수 있습니다. 이를 통해 자식 클래스들에게 공통적인 특징을 물려주면서도, 특정 기능은 각자 상황에 맞게 반드시 구현하도록 강제할 수 있습니다.
🧐 추상 클래스의 특징
- 객체 생성 불가 : `new` 키워드를 사용하여 직접 인스턴스화할 수 없습니다.
- 추상 메서드 포함 가능 : 몸체(body)가 없는 메서드인 추상 메서드를 가질 수 있습니다. 추상 클래스를 상속받는 자식 클래스는 이 추상 메서드를 반드시 오버라이딩(재정의)해야 합니다.
- 공통 기능 제공 : 일반 변수와 구현된 일반 메서드를 포함하여, 자식 클래스들에게 공통적인 기능을 물려줄 수 있습니다.
🆚 인터페이스와의 차이점
구분 | 추상 클래스 (Abstract Class) | 인터페이스 (Interface) |
---|---|---|
목적 | 상속을 통한 공통 기능 공유 및 일부 기능 구현 강제 | 구현 객체들의 동일한 동작 보장 및 규격 설정 |
상속/구현 | `extends` (단일 상속만 가능) | `implements` (다중 구현 가능) |
멤버 | 일반 변수, 일반 메서드, 추상 메서드 모두 가능 | 상수, 추상 메서드만 가능 (최신 Java에서는 일부 예외) |
관계 | 'is-a' 관계 (A는 B의 한 종류이다) | 'has-a' 또는 'can-do' 관계 (A는 B의 기능을 할 수 있다) |
💡 개발자 핵심 Point
- 추상 클래스는 여러 클래스 간의 공통된 특징을 뽑아내어 코드의 중복을 줄이고 싶을 때 유용합니다.
- 상속받는 클래스들이 서로 밀접한 관련이 있을 때 사용하는 것이 좋습니다. (예: `Animal` 추상 클래스와 `Dog`, `Cat` 클래스)
- "이 클래스는 상속을 위해 만들어졌습니다" 라는 의도를 명확하게 표현할 수 있습니다.
- 인터페이스와 추상 클래스는 경쟁 관계가 아니라, 상황에 맞게 사용하는 상호 보완적인 관계입니다.