[Java] 추상 클래스(Abstract)
추상 클래스란?
자바에서 추상 클래스(Abstract Class)는 공통적인 기능이나 구조를 정의하고,
구현은 하위 클래스에서 하도록 강제하기 위해 사용된다.
추상 클래스는 스스로는 인스턴스를 생성할 수 없고,
상속을 통해서 자식 클래스로 파생되기 위한 클래스인 것이다.
또한, 관련된 여러 클래스들의 공통분모를 정의하기 위한 클래스이다.
추상 클래스
abstract키워드로 선언된 클래스- 일부 메서드는 구현하고, 일부는 추상 메서드로 선언하여 자식 클래스에서 구현하도록 강제
- 인스턴스 생성 불가 (상속을 통해서만 가능)
1
2
3
4
5
6
7
8
9
abstract class Animal {
// 일반 메서드 (구현 ⭕️)
void breathe() {
System.out.println("숨을 쉽니다.");
}
// 추상 메서드 (구현 ❌)
abstract void sound();
}
추상 메서드
abstract메서드 사용- 본문이 없는 메서드
- 반드시 자식 클래스에서 오버라이딩 해야 함
1
abstract void sound(); // 구현 없이 선언만
사용 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
// 추상 클래스
abstract class Animal {
public void eat() {
System.out.println("먹는다.");
}
// ⭐️ 어짜피 자식 클래스에서 구현하도록 만드는 것이기 때문에
// 추상 메서드에서는 접근 제어자가 필요없다.
abstract void sound();
// ❌ 클래스 메서드는 abstract 불가 (상속만 가능하기 때문에)
// abstract static void sleep();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 구체 클래스
public class Dog extends Animal {
// ⭐️ 자식 클래스에서 반드시 구현
// 구현하지 않는다면 오류가 발생한다.
@Override
public void sound() {
System.out.println("멍멍");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("야옹");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
public static void main(String[] args) {
// ❌ 불가
// Animal animal = new Animal();
Animal dog = new Dog();
dog.eat(); // 먹는다.
dog.sound(); // 멍멍
Animal cat = new Cat();
cat.sound(); // 야옹
}
}