All About IT
[Java 기초] 상속과 다형성의 관계
안녕하세요~
이번 시간에는 상속과 다형성의 관계에 대해 알아보려고 하는데요.
어떤 상황에서 사용되는지 한번 볼까요?
상속했을 때 사용가능한 다형성
class Animal {
String name="동물";
public void move() {
System.out.println("움직이다");
}
}
class Fish extends Animal {
String name="물고기";
public void move() {
System.out.println("물속을 헤엄친다");
}
}
class Dog extends Animal{
String name="강아지";
public void move() {
System.out.println("네발로 뛴다");
}
}
class Eagle extends Animal{
String name="독수리";
public void move() {
System.out.println("하늘에 훨훨 난다");
}
}
public class AnimalMain {
public static void main(String[] args) {
Animal fish = new Fish();
Animal dog = new Dog();
Animal eagle = new Eagle();
AnimalMain main = new AnimalMain();
main.moveAnimal(fish);
main.moveAnimal(dog);
main.moveAnimal(eagle);
}
public void moveAnimal(Animal animal) {
animal.move();
}
}
Animal 클래스를 상속받는 클래스 3개가 존재하고 AnimalMain 클래스에서 각각의 객체를 만들어 사용하는 코드.
오늘의 핵심 키워드
- 상속 관계에 있을 때 자식클래스에서 부모클래스의 필드와 메소드 등 사용이 가능하다.
- 오버라이딩이란 자식클래스에서 부모클래스의 메소드의 선언부는 똑같고 실행문이 다르게 재정의하는 것을 의미한다.
- 다형성은 객체를 생성할 때 변수의 타입을 자유롭게 사용할 수 있게 해준다. 예를 들어 상속 관계에 있는 부모클래스 Animal, 자식클래스인 Eagle 클래스가 있을 때 Animal eagle = new Eagle(); 이런 식으로 자식 객체를 생성할 때 타입을 부모클래스로 사용할 수 있다. 단, 반대로 부모 객체를 생성할 때 자식 클래스를 타입으로 사용할 수는 없다.
Fish, Dog, Eagle 객체를 각각 생성하고 moveAnimal이라는 메소드를 통해 move 메소드를 실행한 모습
타입인 Animal 기준에서
- 필드 name이 동물이기 때문에 모두 동물 출력
- move 메소드는 자식클래스에서 오버라이딩됐기 각각 재정의한 실행문 출력
객체의 타입들을 각각의 클래스와 동일하게 수정하고 다시 출력한 모습.
타입과 객체를 동일하게 작성하면 보시다시피 필드 name도 각각 다르게 출력되게 됩니다.
꼭 봐야되는 마무리 꿀팁!
- 상속 관계에서 메소드를 재정의할 때는 오버라이딩 기억하기!
- 자식클래스 객체에 부모클래스 타입은 가능, 부모클래스 객체에 자식클래스 타입은 불가능!
▲ 영상으로 한번 더 복습하세요 :)