[JAVA] 다형성(Polymorphism), 다운캐스팅과 instanceof

GyeongEun Kim·2021년 6월 19일
0
post-custom-banner

다형성 (Polymorphism)

다형성이란, 객체지향의 중요한 특성으로, 하나의 코드가 여러 자료형으로 구현되어 실행되는 것을 말한다.

예를들어 Human클래스, Tiger클래스, Eagle클래스가 Animal클래스를 상속받는다고 해보자.

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("독수리가 하늘을 납니다.");
  }
}

public class AnimalTest {
  public static void main (String[] args) {
  AnimalTest aTest = new AnimalTest();
    aTest.moveAnimal(new Human());
    aTest.moveAnimal(new Tiger());
    aTest.moveAnimal(new Eagle());
    }
    
    
    public void moveAnimal (Animal animal) {
    	animal.move();
        }
    }
    /* 출력결과
    사람이 두 발로 걷습니다.
    호랑이가 네 발로 뜁니다.
    독수리가 하늘을 납니다.
    */

테스트를 위해 moveAnimal메서드에 각 인스턴스를 넣어 호출하면 모두 Animal형으로 변환된다. animal.move()에서 실행되는 메서드는 매개변수로 전달된 실제 인스턴스의 move()이다. 따라서 위와같은 출력결과를 내게 된다. 결론적으로 animal.move()라는 코드는 같지만 매개변수에 따라 실행되는 메서드가 달라지고, 실행결과가 달라진다. 이것이 바로 다형성이다.

상속과 다형성을 잘 활용하면 확장성 있고 유지보수가 편리한 프로그램을 만들 수 있다.

-> 상속과 다형성을 이용하면 좋은 관계

  • IS-A관계 : 일반적인 개념과 구체적인 개념의 관계

-> 상속과 다형성을 이용하지 않는게 좋은 관계

  • HAS-A관계 : 한 클래스가 다른 클래스를 소유한 관계, 상속이 아니라 멤버변수로 사용하는 것이 좋음

다운캐스팅과 instanceof

다운캐스팅이란, 여태까지 앞에서 살펴보았던 것처럼 상위 클래스로 형 변환 되었던 하위 클래스를 다시 원래 자료형으로 형 변환 하는 것을 말한다.
Animal ani = new Human();와 같이 상위 클래스형으로 묵시적 형 변환이 되었던 것을 다시 Human형으로 바꾸는 것이 다운캐스팅이다.

다운캐스팅을 하기 전에, 다운캐스팅을 하려는 인스턴스의 원래 자료형을 잘 확인해야 오류를 피할 수 있다. 인스턴스의 원래 자료형을 확인할 때 instanceof를 사용한다.

Animal hAnimal = new Human(); //인스턴스 자료형이 Animal
if (hAnimal instanceof Human) { //원래 자료형이 Human이면
	Human human = (Human)hAnimal; //다운캐스팅
    }

이렇게 instanceof로 원래 생성된 자료형이 오른쪽과 같은지 확인하고, 그 값이 true이면 다운캐스팅을 진행하는 식이다. 다운캐스팅은 명시적으로 변환할 형을 적어주어야한다.

instanceof를 활용하여 다운캐스팅을 하면 상속 받은 각 클래스에 존재하는 멤버변수와 메서드들에 접근할 수 있다.

profile
내가 보려고 쓰는 글
post-custom-banner

0개의 댓글