인프런 김영한 강사님 강의를 수강한 뒤 작성한 글입니다.
수정 또는 잘못된 부분이 있다면 댓글 부탁드리겠습니다🧐
Animal 이란 클래스는 동물을 추상화한 클래스이고,
상속으로 실제 동물의 울음소리를 구현한 dog, cat, caw 클래스를 선언 할 것이다. 이때 Animal 클래스의 메서드를 오버라이딩 할 것 이다.
package poly.Exmaple;
public class Animal {
public void sound() {
System.out.println("동물 울음 소리");
}
}
package poly.Exmaple;
public class Cat extends Animal {
@Override
public void sound() {
System.out.println("야옹");
}
}
========================================
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("멍멍");
}
}
========================================
public class Caw extends Animal {
@Override
public void sound() {
System.out.println("음메");
}
}
package poly.Exmaple;
public class SoundMain {
public static void main(String[] args) {
Animal[] AnimalArr = {new Cat(), new Dog(), new Caw()};
animalSoundCall(AnimalArr);
}
private static void animalSoundCall(Animal[] AnimalArr) {
for (Animal animal : AnimalArr) {
System.out.println("***************");
animal.sound();
System.out.println("***************");
}
}
}
다형성을 사용하지 않고 코드를 작성 했다면, 아래의 예시 처럼 동일한 목적(동물 소리)의 코드를 각각 dog, caw, cat 객체마다 반복하여 작성 했을 것이다.
Cat cat = new Cat();
System.out.println("***************");
cat.sound();
System.out.println("***************");
하지만, 상속을 사용하여 코드의 중복성을 줄였으며, 추후 다른 동물의 객체를 추가 하여도 실질적으로 Animal 타입의 배열에만 추가하면 된다.
그리고 중요한 한 가지를 알 수 있다.
다형성을 구현 하면 메서드를 overide 하게 되는데 이때, 오버라이딩 한 메서드가 우선 권을 가진다!!
public class Animal {
public void sound() {
System.out.println("동물 울음 소리");
}
}
위의 코드를 보면 부모 클래스의 Animal에서 sound 메서드를 정의 하였지만, 자식 클래스의 메서드에서 정의된 함수를 로그에 찍는 것을 보면 알 수 있다.
- 오버라이딩 된 메서드가 우선권을 가짐.
- 동일한 목적을 추상화 할 수 있다면, 다형성 설계 하는 것을 생각.
- 멤버 변수는 오버라이딩 되지 않음.