아래의 내용은 java_grammer 레파지토리 C03Inheritance 디렉터리에 저장되어있는 내용을 정리함
추상클래스는 반드시 상속을 전제로 설계된 클래스임.
즉, 직접 객체로 만들 목적이 아닌 “공통된 기본 틀”을 제공하기 위한 클래스인 것.
추상클래스는 ‘구현되지 않은 메서드(추상메서드)’를 포함할 수 있기 때문에 객체를 직접 생성할 수 없음.
반드시 상속을 통해 자식 클래스에서 구현(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("멍!!멍!!");
}
}
위 예시에서 AbstractDog는 AbstractAnimal의 추상메서드 makeSound2()를 구현함으로써 구체화된 클래스(Concrete Class)가 된 것임.
| 구분 | 추상클래스 | 인터페이스 |
|---|---|---|
| 목적 | 공통 기능의 기본 설계 | 규약(명세) 정의 |
| 메서드 구성 | 일반 메서드 + 추상메서드 | 모든 메서드는 기본적으로 추상(또는 default/static 가능) |
| 변수 | 인스턴스 변수 가질 수 있음 | 상수(public static final)만 가능 |
| 다중 상속 | 불가능 | 가능 |
| 객체 생성 | 불가능 | 불가능 (구현 클래스 필요) |
둘 다 ‘직접 사용할 수 없는’ 설계용 클래스지만, 추상클래스는 일부 구현이 포함되고, 인터페이스는 100% 설계-only 역할이라는 차이가 있음.
final 키워드는 상속을 금지할 때 사용하는 키워드임.
즉, 더 이상 확장할 수 없는 종단 클래스(final class)를 만들 때 사용함.
final class FinalParents { }
// class Test extends FinalParents {} // 오류: 상속 불가
final이 붙은 클래스는 다른 클래스가 extends로 상속받는 것이 불가능함. | 키워드 | 설명 | 객체 생성 여부 | 상속 여부 |
|---|---|---|---|
| abstract class | 추상 메서드를 포함한 설계용 클래스 | 불가능 | 가능 |
| abstract method | 구현 없이 선언만 존재하는 메서드 | - | 자식이 반드시 구현 |
| final class | 상속이 불가능한 클래스 | 가능 | 불가능 |