제 13장. 다형성(polymorphism)

한동윤·2022년 4월 22일
0

java 기초다지기

목록 보기
14/15
post-thumbnail

다형성이란?

다형성이란 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미합니다.

생각을 해보면 부모는 아이일 수 있다.(부모도 누군가의 아들 혹은 딸이기에)
그러나 아이는 부모일 수 없다. 그렇기에 자바에서도 위 사진과 같이 오류를 나타내는 것이다.

그래서 자바에서는 아래와 같이 코드를 수정해줘서 사용한다.

Child child2 = (Child) new Parent();

이를 타입캐스팅(타입 변환)이라고 부르는데 어느 상황에서 타입변환을 할 수 있는지 알아보자.

============================================================
<넘어가기전 다시 이해를 해보자>

더 쉬운 예제로 생각해보면 사람은 남자이다. 사람은 여자이다. 둘 다 말이 된다.
그러나 남자는 사람이다? 여자는 사람이다? --> 의미가 모호해진다

여기서 중요한 점은 남자는 사람으로 표현할 수 있고 여자도 사람으로 표현할 수 있다는 점이다
--> "다형성"

=============================================================

참조 변수의 타입 변환

  1. 서로 상속 관계에있는 클래스 사이에만 타입 변환을 할 수 있다.
  2. 서브 클래스 타입에서 슈퍼 클래스 타입으로의 타입 변환은 생략할 수 있다.
  3. 부모 클래스 타입에서 자식 클래스 타입으로의 타입 변환은 반드시 명시해야한다.

예를 들어서 Child와 Sister은 Parent를 상속 받은 클래스라고 코드를 짜고 아래와 같은 코드를 실행해보자.

public static void main(String[] args) {
        Parent parent1 = new Parent();
        Parent parent2 = new Child();
        Child child1 = new Child();
        Child child2 = (Child) new Parent();
        Sister sister = new Sister();

        parent1 = child1; // parent1 = (Parent)child1;(2번)
        sister = (Sister) parent2; // 타입변환을 생략할 수 없다.(3번)
        sister = (Sister) child1; // 직접적인 상속 관계가 아니므로, 오류를 발생시킨다.
    }

instanceof

참조변수 instance of 클래스이름

왼쪽에 전달된 참조 변수가 실제로 참조하고 있는 인스턴스의 타입이 오른쪽에 전달된 클래스 타입이면 true를 반환, 아니면 false를 반환한다.

public static void main(String[] args) {
        Parent parent = new Parent();
        System.out.println(parent instanceof Parent);
        System.out.println(parent instanceof Child);

        Child child = new Child();
        System.out.println(child instanceof Parent);
        System.out.println(child instanceof Child);
    }

0개의 댓글