예제로 공부하는 Java 100 문제풀이 Part.4
abstract class Animal{ // 부모 클래스
// 구체적인 내용은 작성하지 않고 공통적인 특징을 추상적으로 선언 --> 리턴값 조차도 없이 메서드명만 선언.
abstract void cry(); // 추상 클래스
void eat() {
System.out.println("먹다.");
}
}
class Dog extends Animal{ // 자식 클래스
void cry() {
System.out.println("멍멍");
}
}
class Cat extends Animal{
void cry() {
System.out.println("야옹"); // 추상 클래스 재정의
}
}
class Cow extends Animal{
void cry() {
System.out.println("음메");
}
}
class Animal2{
void fly() {
System.out.println("날다.");
}
}
public class Java100Ex14{
public static void main(String[] args) {
// [1]: 추상 클래스는 구체적인 내용이 없기 때문에 객체를 생성할 수 없다.
Animal2 dragonfly = new Animal2();
dragonfly.fly();
// [2]: 추상 클래스 사용은? --> 상속을 받아서 사용.
// 즉, 추상(부모) 클래스를 상속받은 자식 클래스에서 해당 메서드를 오버라이딩하여 재정의한 후 사용한다.
Dog dog = new Dog();
dog.cry();
Cat cat = new Cat();
cat.cry();
Cow cow = new Cow();
cow.cry();
}
}
[3]: Summary
추상(부모) 클래스는 다른(자식) 클래스들의 공통적인 특징을 변수나 메서드로 정의만 해놓는 것을 말한다. → 추상 메서드
abstract를 앞에 붙이고 클래스 안에 추상 메서드를 포함하고 있다는 것을 제외하면 사실 일반 클래스와 별반 차이가 없다.
Field, Constructor, Method(추상 메서드 말고 일반 메서드)도 포함할 수 있다.
메서드 선언만 있고 구체적인 내용은 없으므로 객체를 생성할 수 없다.
따라서, 부모 클래스로서의 역할은 하지만, 구체적인 사용은 상속받은 자식 클래스에서 재정의(오버라이딩)하여 사용해야 한다. → 강제성
추상 클래스에서 선언만 해놓음으로써 이후 새로운(자식) 클래스들이 이를 상속받아 구현하므로 새로운 클래스를 작성할 때 하나의 틀이 된다.
추상 클래스를 사용하는 이유
우선 강제하기 위함이다.
부모(추상) 클래스가 선언해놓은 메서드를 상속받은 자식 클래스들이 이름 그대로 재정의해서 구현하라고 강제하는 것이다.
상속받은 자식 클래스 입장에서는 자칫 상속만 받고 재정의해서 사용을 안할 수도 있기 때문이다.
즉, 일반 메서드로 구현하며 누군가는 해당 메서드를 구현 안 할수도 있다.
무조건 상속받은 자식 클래스 입장에서는 추상 메서드를 재정의해서 구현하도록 강제하기 위함이다.
위의 cat 클래스에서 재정의한 cry() 메서드를 지운다면 에러가 난다. → 추상 메서드를 재정의(오버라이딩)하지 않아서이다.
꼭 재정의(오버라이딩) 해야만 하는가?
자식 클래스는 일단은 무조건 부모(추상) 클래스로부터 상속받은 추상 메서드는 오버라이딩해서 재정의해야 한다.
추상 메서드를 포함하고 있다면 곧 추상 클래스여야 한다.
만약, 재정의 하고 싶지 않다면?
자식 클래스에서 상속받은 추상 메서드를 구현하지 않는다면 자식 클래스도 abstract를 붙여서 추상으로 만들어 준다.
class 앞에다가 abstract를 붙이면 된다.
결론
부모(추상) 클래스에서 구현을 하지 않는 이유는 해당 메서드의 구현이 상속받는 클래스에 따라서 달라질 수 있기 때문에 선언만 해둔 것이다.
이러한 추상 클래스는 여러 명의 개발자가 작업할 때 코드의 확장과 분업을 효율적으로 처리할 수 있게 해준다
분업화된 시스템에서 공통의 프로젝트를 진행할 때 많이 사용되는 중요한 문법이다.
'Backend > Java' 카테고리의 다른 글
[인프런] 인터페이스, 문법, 개념 (0) | 2022.03.06 |
---|---|
[인프런] 인터페이스, interface, 개념 (0) | 2022.03.06 |
[인프런] 반복문, for문, 객체 배열 (0) | 2022.03.02 |
[인프런] 객체, 참조값, 요소, 객체 배열 (0) | 2022.03.02 |
[인프런] getter, setter, 클래스 (0) | 2022.03.02 |