본문 바로가기
프로그래밍/JAVA

[JAVA] Java TPC 강의 정리 (PART 2) - 다형성

by 소소로드 2020. 9. 19.
  • 1. 다형성
    (1) 다형성 이론
    (2) 다형성 인수
    (3) 다형성 배열

1. 다형성

(1) 다형성 이론

다형성이란 상속관계에 있는 클래스에서

상위클래스가 동일한 메시지로 하위클래스들을 서로 다르게 동작시키는 객체지향 원리이다.

1. 상속 관계가 되어 있을 것

2. upcasting 상태일 것. 쉽게말해 부모 클래스에서 클래스를 생성할 것(Animal ani = new Dog();)

3. 동적 바인딩을 통해 실현된다.


(2) 다형성 인수

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
        
        Dog dog = new Dog();
        display(dog);
        
        Cat cat = new Cat();
        display(cat);
    }
    
    public static void display(Animal ani) {
        ani.eat();
//dog, cat의 eat()를 모두 출력
    }

cs

만약 dog, cat을 인수로 받을 때 다형성으로 활용하지 않는다면

display메서드를 계속 몇 번이고 만들어야 할 수도 있다.

Dog와 Cat을 둘 다 받을 수 있는 그들의 부모 클래스를 인수로 받을 수 있다.

이를 다형성 인수라고 부른다.

근데 만약 전 차수처럼 Cat에 night() 메서드가 있는 경우는?

다운캐스팅하여 ((Cat)ani).night();는 에러가 걸린다.

왜냐하면 Dog에는 night()가 없기 때문에.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
        
        Dog dog = new Dog();
        display(dog);
        
        Cat cat = new Cat();
        display(cat);
    }
    
    public static void display(Animal ani) {
        ani.eat();
        if(ani instanceof Cat) {
            ((Cat)ani).night();
        }    
    }
cs

그럴 때는 주로 상속관계에서 많이 사용하는 instanceof 연산자를 이용하여 처리한다.

의미는 ani클래스가 Cat클래스로 형변환이 가능하냐 이다.

(쉽게 생각해서 ani가 Cat를 참조하고 있냐, Cat과 연관되어 있냐)

(3) 다형성 배열

Animal[] ani = new Animal[2];
ani[0] = new Dog();
ani[1] = new Cat();

ani[0].eat(); //개는 먹는다.
ani[1].eat(); //고양이는 먹는다.

자식들의 타입이 달라도 부모 이름으로 배열을 만들면
부모 배열의 각각의 공간에 자식들을 담을 수 있다.

* 해당 다형성에 대한 내용은 Object class로도 활용이 가능하다.
Object class는 우리 눈에는 보이지 않지만 모든 클래스의 상위에 존재하는 클래스이므로
굳이 Animal - Dog처럼 상속관계를 만들지 않아도
Animal 클래스를 만드는 순간 부모는 Object가 된다.
그러므로 다형성 인수, 다형성 배열 또한 Object를 대신 사용할 수 있다.