안녕하세요~ 

이번 시간에는 상속과 다형성의 관계에 대해 알아보려고 하는데요.

어떤 상황에서 사용되는지 한번 볼까요?

상속했을 때 사용가능한 다형성

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 클래스에서 각각의 객체를 만들어 사용하는 코드.


오늘의 핵심 키워드
  1. 상속 관계에 있을 때 자식클래스에서 부모클래스의 필드와 메소드 등 사용이 가능하다.
  2. 오버라이딩이란 자식클래스에서 부모클래스의 메소드의 선언부는 똑같고 실행문이 다르게 재정의하는 것을 의미한다.
  3. 다형성은 객체를 생성할 때 변수의 타입을 자유롭게 사용할 수 있게 해준다. 예를 들어 상속 관계에 있는 부모클래스 Animal, 자식클래스인 Eagle 클래스가 있을 때 Animal eagle = new Eagle(); 이런 식으로 자식 객체를 생성할 때 타입을 부모클래스로 사용할 수 있다. 단, 반대로 부모 객체를 생성할 때 자식 클래스를 타입으로 사용할 수는 없다.

Fish, Dog, Eagle 객체를 각각 생성하고 moveAnimal이라는 메소드를 통해 move 메소드를 실행한 모습


타입인 Animal 기준에서 

  1. 필드 name이 동물이기 때문에 모두 동물 출력 
  2. move 메소드는 자식클래스에서 오버라이딩됐기 각각 재정의한 실행문 출력 

객체의 타입들을 각각의 클래스와 동일하게 수정하고 다시 출력한 모습.

타입과 객체를 동일하게 작성하면 보시다시피 필드 name도 각각 다르게 출력되게 됩니다.


꼭 봐야되는 마무리 꿀팁!

  • 상속 관계에서 메소드를 재정의할 때는 오버라이딩 기억하기!
  • 자식클래스 객체에 부모클래스 타입은 가능, 부모클래스 객체에 자식클래스 타입은 불가능!

 

▲ 영상으로 한번 더 복습하세요 :)