inflearn 김영한 실전 자바
Animal이라는 부모 클래스를 만들고 sound() 메서드를 정의함. sound()는 자식 클래스에서 오버라이딩 할 목적으로 만듦
public class AnimalMain {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
Caw caw = new Caw();
soundAnimal(dog); //멍멍
soundAnimal(cat); //야옹
soundAnimal(caw); //음메
}
private static void soundAnimal(Animal animal) {
animal.sound();
}
}
🤔 Animal 클래스를 직접 생성해서 사용할 일이 있을까?
동물이라는 추상적인 개념이 실제로 존재하는 것은 이상함
Animal 클래스는 다형성을 위해 필요한 클래스지 직접 인스턴스를 생성해서 사용할 일은 없음
그러나 Animal도 클래스이기 때문에 인스턴스를 생성하고 사용하는데 제약이 없음 → 실수로 new Animal()을 통해 인스턴스를 생성할 수 있음
🤔 만약 Animal 클래스를 상속 받는 곳에서 sound() 메서드를 오버라이딩 하지 않는다면?
실수로 sound() 메서드를 오버라이딩을 빠트렸다면, 부모의 기능을 상속 받음 → 코드상 아무런 문제 발생X
좋은 프로그램은 제약이 있는 프로그램
추상클래스 & 추상메서드로 해결~!
추상클래스
Animal과 같이 부모 클래스는 제공하지만 실제로 생성되면 안되는 클래스
- 추상적인 개념을 제공하고 실체인 인스턴스가 존재하지 않음
- 대신 상속을 목적으로 사용되고 부모 클래스 역할을 함
- 기존 클래스와 완전히 같고, new Animal()과 같이 직접 인스턴스를 생성하지 못하는 제약이 추가됨
추상 메서드
상속 받는 자식 클래스가 반드시 오버라이딩 해야 하는 메서드
- 실체 존재 X, 메서드 바디 X
- 추상 메서드가 하나라도 있는 클래스는 추상 클래스로 선언해야 함 - 작동하지 않는 메서드를 가진 불완전한 클래스
추상 클래스에 무조건 추상 메서드만 있는 것이 아님. 일반 메서드도 가능~!public abstract class AbstractAnimal { public abstract void sound(); //추상 메서드: 자식이 무조건 오버라이딩 해야함 public void move() { //일반 메서드: 오버라이딩 안 해도 됨 System.out.println("동물이 움직임"); } }
public class AbstractAnimalMain {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
Caw caw = new Caw();
dog.move();
soundAnimal(dog);
soundAnimal(cat);
soundAnimal(caw);
}
private static void soundAnimal(AbstractAnimal animal) {
animal.sound();
}
}
순수 추상 클래스
모든 메서드가 추상 메서드인 추상 클래스
- 코드를 실행할 바디 부분이 전혀 없음
- 실행 로직을 전혀 가지고 있지 않음
- 단지 다형성을 위한 부모 타입으로써 껍데기 역할만 함
상속하는 클래스는 모든 메서드를 구현해야 함 → 마치 어떤 규격을 지켜서 구현해야 하는 것처럼 느껴짐
자바는 순수 추상 클래스를 더 편리하게 사용하기 위해 인터페이스 개념을 제공함
'Java' 카테고리의 다른 글
[다형성] 메서드 오버라이딩 (2) | 2025.07.07 |
---|---|
[다형성] instanceof (0) | 2025.07.07 |
[다형성] 캐스팅 (0) | 2025.07.07 |
[다형성] 다형적 참조 (0) | 2025.07.07 |