추상 클래스
동물(Animal)과 같이 부모 클래스는 제공하지만, 실제 생성되면 안되는 클래스를 추상 클래스라 한다. 추상적인 개념을 제공하는 클래스로서 실체인 인스턴스가 존재하지 않는다.
상속을 목적으로 사용되고, 부모 클래스 역할을 담당한다.
사용법
- 클래스를 선언할 때 앞에 추상이라는 의미의 abstract 키워드를 붙인다.
- 기존 클래스와 동일하나 new AbstractAnimal()와 같이 직접 인스턴스를 생성하지 못하는 제약이 있다.
abstract class AbstractAnimal {...}
추상 메서드
부모 클래스를 상속 받는 자식 클래스가 반드시 오버라이딩 해야 하는 메서드를 부모 클래스에 정의할 수 있다. 이것을 추상 메서드라 한다.
- 추상 메서드는 선언할 때 메서드 앞에 추상이라는 의미의 abstract 키워드를 붙인다.
- 추상 메서드가 하나라도 있는 클래스는 추상 클래스이다.
- 추상 메서드는 상속 받는 자식 클래스가 반드시 오버라이딩 해서 사용해야 한다.
- 따라서 바디가 없다.
- 오버라이딩 하지 않으면 자식도 추상클래스가 되어야 한다 .
public abstract void sound();
예제
AbstractAnimal.java
public abstract class AbstractAnimal {
public abstract void sound();
public void move() {
System.out.println("동물이 움직입니다. ");
}
}
=> move는 추상메서드가 아니다 따라서 자식에서 오버라이딩 해도 되고 안해도된다.
Dog.java
public class Dog extends AbstractAnimal{
@Override
public void sound() {
System.out.println("멍멍");
}
}
Cat.java
public class Cat extends AbstractAnimal{
@Override
public void sound() {
System.out.println("냐옹");
}
}
Caw.java
public class Caw extends AbstractAnimal{
@Override
public void sound() {
System.out.println("음메");
}
}
AbstractMain.java
public class AbstractMain {
public static void main(String[] args) {
// 추상클래스 생성 불가
// AbstractAnimal animal = new AbstractAnimal();
Dog dog = new Dog();
Cat cat = new Cat();
Caw caw = new Caw();
cat.sound();
cat.move();
soundAnimal(dog);
soundAnimal(cat);
soundAnimal(caw);
}
public static void soundAnimal(AbstractAnimal animal) {
System.out.println("동물 소리 테스트 시작");
animal.sound();
System.out.println("동물 소리 테스트 종료");
}
}
실행결과
정리
이전 포스팅 마지막에 다루었던 문제점을 추상 클래스와 추상 메서드를 통해 모두 해결했다.
- 추상 클래스 덕분에 실수로 Animal 인스턴스를 생성할 문제를 근본적으로 방지해준다.
- 추상 메서드 덕분에 새로운 동물의 자식 클래스를 만들 때 실수로 sound() 오버라이딩을 누락시키는 문제를 근본적으로 방지해준다.
순수 추상 클래스
모든 메서드가 추상 메서드인 추상 클래스. 이 경우 실행하는 로직을 전혀 가지고 있지 않다. 다형성을 위한 부모타입으로서 껍데기 역할만 한다.
이런 순수 추상클래스의 개념은 프로그래밍에서 자주 사용된다. 자바는 이를 더 편하게 사용할 수 있도록 인터페이스라는 개념을 제공한다.
* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.
'프로그래밍언어 > Java' 카테고리의 다른 글
[Java 기본] 좋은 객체 지향 프로그래밍이란? (0) | 2024.07.26 |
---|---|
[Java 기본] 인터페이스 (0) | 2024.07.26 |
[Java 기본] 다형성 활용 (0) | 2024.07.25 |
[Java 기본] 다형성과 메서드 오버라이딩 (0) | 2024.07.23 |
[Java 기본] instanceof (1) | 2024.07.23 |