728x90
추상 클래스
추상 클래스란 객체를 직접 생성할 수 없는 클래스로, 주로 다른 클래스들이 상속받아 사용할 공통적인 기능(메서드, 필드 등)을 정의하는 용도로 사용된다.
공통적인 기능을 정의하고, 일부 메서드는 자식 클래스가 반드시 구현하도록 강제하는 역할을 한다.
1. 목적
- 코드의 재사용성 증가
- 공통적인 메서드를 제공하여 중복 코드 방지
- 일관된 인터페이스를 제공한다.
- 특정 기능을 반드시 구현하도록 강제
- 유지보수 및 확장에 용이하다.
- 추상 클래스에 새로운 기능을 추가하면, 이를 상속받은 모든 클래스에서 사용할 수 있음
- 객체의 역할과 행동을 명확히 구분할 수 있다.
- 예: 동물(Animal) 클래스에서 먹다(eat)는 공통적으로 제공하고, 소리 내기(makeSound)는 각 동물마다 다르게 구현하도록 강제
2. 특징
- 객체 생성 불가능
new
키워드로 직접 인스턴스를 생성할 수 없다.- 반드시 하위 클래스에서 상속받아 사용해야 한다.
- 추상 메서드를 가질 수 있음
abstract
키워드가 붙은 메서드는 구현 없이 선언만 존재하며, 이를 상속받은 클래스가 반드시 오버라이딩해야 한다.
- 일반 메서드와 필드를 가질 수 있음
- 공통된 동작을 정의할 수 있다.
private
,protected
,public
접근 제어자를 사용할 수 있다.
- 다형성 활용 가능
- 부모 클래스 타입으로 자식 객체를 참조할 수 있다.
- 런타임 시점에서 동적 바인딩이 가능하다.
- 단일 상속만 가능
- 인터페이스와 다르게 하나의 추상 클래스만 상속이 가능하다.
사용 예시
1. 추상 클래스 선언
// 추상 클래스 정의
abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
// 일반 메서드 (공통 기능 제공)
void eat() {
System.out.println(name + " is eating.");
}
// 추상 메서드 (각 클래스에서 구현 필수)
abstract void makeSound();
}
2. 하위 클래스에서 상속 및 구현
/ 개(Dog) 클래스 - 추상 클래스를 상속받음
class Dog extends Animal {
public Dog(String name) {
super(name);
}
// 추상 메서드 구현 (필수)
@Override
void makeSound() {
System.out.println(name + " says: Woof woof!");
}
}
// 고양이(Cat) 클래스 - 추상 클래스를 상속받음
class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
void makeSound() {
System.out.println(name + " says: Meow!");
}
}
3. 사용 예시
public class Main {
public static void main(String[] args) {
// Animal animal = new Animal("Some Animal"); // 오류: 추상 클래스는 직접 객체 생성 불가
Dog dog = new Dog("Buddy");
Cat cat = new Cat("Whiskers");
dog.eat(); // Buddy is eating.
dog.makeSound(); // Buddy says: Woof woof!
cat.eat(); // Whiskers is eating.
cat.makeSound(); // Whiskers says: Meow!
// 다형성 활용
Animal myPet = new Dog("Charlie");
myPet.makeSound(); // Charlie says: Woof woof!
}
}
728x90
'자바' 카테고리의 다른 글
[JAVA] 인터페이스(Interface) (0) | 2025.03.13 |
---|---|
[JAVA] 다형성과 정적, 동적 바인딩 (0) | 2025.03.13 |
[JAVA] 상속 (0) | 2025.03.12 |
[JAVA] Stream (0) | 2025.03.11 |
[JAVA] 배열(Array) (0) | 2025.03.11 |