본문 바로가기

JAVA

자바 기초(상속_다형성)

1. 다형성(Polymorphism)이란?

  1) 여러가지 형태를 가질 수 있는 것

  2) 하나의 메소드나 클래스가 있을 떄 이것들이 다양한 방법으로 동작하는 것

  3) 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것

     즉, 조상타입의 참조변수로 자손타입(상속관계)의 객체를 다룰 수 있는 것이

     다형성의 기본 개념이다.

 

 

2. 다형성 구현 방법

바로 예시를 들어 설명하겠다.

 

ex) 

class Animal{
    public void move(){
        System.out.println("동물이 움직입니다.");
    }
}

class Human extends Animal{
    public void move(){
        System.out.println("사람이 두 발로 뜁니다.");
    }
}

class Tiger extends Animal{
    public void move(){
        System.out.println("호랑이가 네 발로 뜁니다.");
    }
}

class Eagle extends Animal{
    public void move(){
        System.out.println("독수리가 날아갑니다.");
    }
}

class AnimalTest
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Animal human = new Human();
        Animal tiger = new Tiger();
        Animal eagle = new Eagle();
        
        AnimalTest test = new AnimalTest();
        test.moveAnimal(human);
        test.moveAnimal(tiger);
        test.moveAnimal(eagle);
    }
    
    public void moveAnimal(Animal animal){
        animal.move();
    }
    
    // [출력]
    // 사람이 두 발로 뜁니다.
    // 호랑이가 네 발로 뜁니다.
    // 독수리가 날아갑니다.
}

 

위의 코드를 보면 알 수 있듯이 Human, Tiger, Eagle이라는 각각의 클래스들이 Animal이라는 부모 클래스를 상속받고 있다. 그리고 Animal에 있는 move 메소드에 접근할 수 있기 위해, Animal human = new Human(); 와 같은 생성자를 만들어 주었다. 이때 Human animal = new Animal(); 와 같은 구문은 적용이 안 되는데, 그 이유는 부모와 자식의 각 메모리 영역이 다르기 때문이다. 후자와 같이 생성자를 정의하면 Animal이 가지고 있는 메모리 영역이 적어 Human의 영역까지 이를 수 없다. 

 

그런데 우리가 출력하고 싶은 것은 동물의 움직임이 아니라 사람, 호랑이, 독수리의 움직임이다. 그래서 자식 클래스에서 부모와 같은 이름의 메소드, 즉 move()를 재정의해 주었다. 이때 Animal이라는 부모 클래스에서 사용된 move와 같은 함수를 Virtual Method라고 한다. 다시 말해, 동물원이라는 추상적인 개념을 생성한 다음 그 안에 있는 동물들을 관리하는 것처럼, 다형성은 상속에서 부모 클래스에 존재하는 메소드를 자식 클래스에서 여러 형태로 바꿔가면서 사용하고자 할 때 쓰이는 개념이다.

'JAVA' 카테고리의 다른 글

자바 (Collection Framework)  (0) 2022.02.23
자바_커피 머신 구현  (0) 2022.02.22
자바 기초(상속)  (0) 2022.02.21
자바스크립트 기초(내장 객체)  (0) 2022.02.18
자바 기초(배열)  (0) 2022.02.18