오늘도 난 존버한다
01 추상 클래스(Abstract Class)와 구상 클래스(Concrete Class) 본문
추상 말 그대로 추상적이다
구상은 말 그대로 구상하다
abstract class Animal { // 추상 클래스
String name;
// 일반 메서드
void eat() {
System.out.println(name + " is eating.");
}
// 추상 메서드
abstract void sound();
}
class Dog extends Animal { // 구상 클래스
@Override
void sound() {
System.out.println("Bark! Bark!");
}
}
class Cat extends Animal { // 구상 클래스
@Override
void sound() {
System.out.println("Meow! Meow!");
}
}
public class Main {
public static void main(String[] args) {
// Animal animal = new Animal(); // 에러: 추상 클래스는 객체 생성 불가
Animal dog = new Dog();
dog.name = "Buddy";
dog.eat(); // 추상 클래스의 일반 메서드 호출
dog.sound(); // 하위 클래스에서 구현한 메서드 호출
}
}
그래서
Class | Abstract | Concrete |
목적 | 상속을 통해 설계도 역할 수행 | 완전히 구현된 클래스 |
메서드 구현 여부 | 구현된 메서드 + 추상 메서드 포함 가능 | 모든 메서드 구현 필수 |
객체 생성 | 불가능 (상속 후 사용) | 가능 (독립적으로 사용 가능) |
상속 여부 | 다른 클래스에 의해 상속되어 사용됨 | 필요에 따라 상속 가능 |
사용 목적 | 공통 동작 정의 및 자식 클래스에서 구현 강제 | 실제 동작을 구현하여 객체로 사용 |
추상 클래스와 구상 클래스는 상속 관계를 기반으로 하며, 추상 클래스는 일반적으로 superclass 의 역할을 하고, subclass는 자식 클래스로 동작합니다. 즉, 상속을 통해 서로 연결됩니다.
- Abstract class → superclass
- 추상 클래스는 구체적인 객체를 생성하지 않고, 공통적인 특성과 동작을 정의합니다.
- 설계도 역할을 하며, 상속받은 자식 클래스가 이를 확장하거나 구체적인 동작을 구현합니다.
- Concrete class → subclass
- 구상 클래스는 추상 클래스를 상속받아 필요한 모든 동작(추상 메서드의 구현)을 완성합니다.
- 구상 클래스는 실제 객체를 생성할 수 있습니다.
// 추상 클래스 (부모 클래스, 설계도 역할)
abstract class Animal {
String name;
void eat() { // 공통 동작
System.out.println(name + " is eating.");
}
abstract void sound(); // 추상 메서드: 구체적 구현은 자식 클래스에 맡김
}
// 구상 클래스 1 (자식 클래스)
class Dog extends Animal {
@Override
void sound() {
System.out.println("Bark! Bark!");
}
}
// 구상 클래스 2 (자식 클래스)
class Cat extends Animal {
@Override
void sound() {
System.out.println("Meow! Meow!");
}
}
public class Main {
public static void main(String[] args) {
// Animal animal = new Animal(); // 에러: 추상 클래스는 객체 생성 불가
// 구상 클래스의 객체 생성
Animal dog = new Dog();
dog.name = "Buddy";
dog.eat(); // 부모 클래스의 공통 메서드 사용
dog.sound(); // 자식 클래스에서 구현된 메서드 호출
Animal cat = new Cat();
cat.name = "Kitty";
cat.eat();
cat.sound();
}
}
Buddy is eating.
Bark! Bark!
Kitty is eating.
Meow! Meow!
'Java' 카테고리의 다른 글
06 Void? (0) | 2024.12.30 |
---|---|
05 캡슐화란? (0) | 2024.12.29 |
04 Interface 인터페이스 vs Inheritance 상속 (0) | 2024.12.18 |
03 인스턴스화하다? Instance (2) | 2024.12.17 |
02 추상 클래스에서 abstract 생략 가능? (0) | 2024.12.17 |