
추상 클래스(Abstract class)
공통적인 속성과 기능을 정의하지만, 완전한 구현을 하지 않고, 자식 클래스가 반드시 구현해야 할 부분만 선언해놓는 클래스이다.
쉽게 말해서 자식 클래스에게 틀을 제공하고 자식 클래스가 구체적인 내용을 채워 넣는 것이다.
추상 클래스 선언
abstract 키워드를 사용해서 선언한다.
- 하나 이상의 추상 메서드(몸체 없는 메서드)를 가질 수 있다.
- 직접 객체를 생성할 수 없다. (생성 시도 시 컴파일 오류 : 불완전한 클래스는 직접 사용할 수 없다.)
- 추상 메서드가 하나라도 있으면, 추상 클래스로 선언해야 한다.
public abstract class Animal {}
추상 클래스 특징
| 특징 | 설명 |
| 인스턴스화 불가 | 직접 객체를 만들 수 없다. (new로 생성 불가) |
| 상속 전용 | 다른 클래스가 상속해서 써야 한다. |
| 추상 메서드 포함 | 하나 이상의 "구현되지 않은 메서드가 있음 (abstract method) |
| 일부 구현 가능 | 추상 클래스지만, 일반 메서드를 포함할 수 도 있다. |
| 구현 강제 | 추상 메서드를 자식 클래스가 반드시 구현하게끔 경고를 한다. |
일반 상속을 받는 것과 다르게 추상 메서드의 구현을 강제하기 때문에, 일반 클래스를 상속받아 오버라이딩 할 시 생기는 의도치 않은 결과를 예방할 수 있다.
사용 예제
Main
package practice;
public class Main {
public static void main(String[] args) {
System.out.println("--강아지--");
Dog dog = new Dog();
dog.move();
dog.speak();
System.out.println("--고양이--");
Cat cat = new Cat();
cat.move();
cat.speak();
}
}
Cat Class
package practice;
public class Cat extends Animal {}
/*
오류 : Class 'Cat' must either be declared abstract or
implement abstract method 'speak()' in 'Animal'
*/
Dog Class
package practice;
public class Dog extends Animal {
public void speak() {
System.out.println("멍멍");
}
}
Animal Class
package practice;
abstract public class Animal {
public abstract void speak();
public void move() {
System.out.println("이동 합니다.");
}
}
실행 시, 컴파일 오류를 통해 "Animal 추상 클래스를 상속받은 Cat Class에서 speak() 추상 메서드를 구현하지 않았다"라는 오류가 뜬다. (구현 강제)
완전 추상 클래스(fully abstract class)
모든 메서드가 추상 메서드인 추상 클래스를 의미한다. 즉, 메서드의 구현된 메서드(기능)가 하나도 없다는 의미이다.
📌 예시: 완전 추상 클래스
package practice;
abstract public class Animal {
public abstract void speak();
public abstract void move();
}
- 모든 메서드가 추상 메서드이다.
- 구현된 메서드가 없다.
- 직접 객체 생성 ❌, 반드시 상속해서 사용해야 한다.
다음으로
💡우리가 클래스를 상속받는 이유는 부모의 속성과 기능을 물려받아 재사용하기 위함이다. 단순히 부모가 정해준 틀을 받아서 자식이 구현해야하는 용도라면, 완전 추상 클래스보다 인터페이스를 사용하는 것이 더 좋다.
물론, 무조건이라는 것은 없다.
https://kimyongjun0129.tistory.com/104
[Java] 오버라이딩(overriding)이란?
오버라이딩(overriding)객체 지향 프로그래밍(OOP)에서 자식 클래스가 부모 클래스의 메서드를 재정의하는 것을 의미한다. 오버라이딩 방법오버라이딩할 메서드의 이름과 매개변수 동일해야 한다.
kimyongjun0129.tistory.com
'JAVA' 카테고리의 다른 글
| [Java] 익명 클래스란? (0) | 2025.04.17 |
|---|---|
| [Java] 람다(Lamda) (0) | 2025.04.17 |
| [Java] 오버라이딩(overriding)이란? (0) | 2025.04.16 |
| [Java] Wrapper Class란? (0) | 2025.04.16 |
| [Java] 상속(Inheritance)이란? (0) | 2025.04.15 |