1. 다형성 (polymorphism)

다성형이란?
객체 지향 개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미한다.
자바에서 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 한다.

class Tv {
    int one;
    int two;
}

class CaptionTv extends Tv {
    int three;
}

CaptionTv c = new CaptionTv(); // 1번
Tv c = new CaptionTv(); // 2번

위의 예제에서 1번은 동일한 타입으로 모든 멤버를 사용 가능하고 2번은 CaptionTv에는 Tv가 가지고 있는 모든 멤버를 가지고 있어서 Tv 클래스 타입으로 참조 변수를 사용할 수 있다.
ex) CaptionTv c = new Tv();
하지만 위의 예제처럼 TV 클래스는 CaptionTv 클래스의 멤버를 가지고 있지 않기 때문에 인스턴스가 생성 불가능하다.

 

* 정리

  1. 부모 타입의 참조 변수로 자식 타입의 인스턴스를 참조할 수 있다.
  2. 반대로 자식 타입의 참조변수로 부모 타입의 인스턴스를 참조 할수 없다.

1.1. 참조 변수의 형 변환

참조 변수도 형 변환이 가능하며 상위 타입에서 하위 타입 뿐만 아니라 반대로도 형변환이 가능하며 상속 관계에 있는 모든 타입이 형변환 가능하다.
기본형의 형 변환과 마찬가지로 하위 타입이 상위 타입으로 자동 형변환 된다.

* 생략 여부

  • up-casting : 하위 타입 -> 상위 타입 // 형변환 생략 가능
  • down-casting : 상위 타입 -> 하위 타입 // 형변환 생략 불가

형 변환 시 캐스팅 연산자인 '(클래스)'를 사용한다.
down-casting에서만 캐스팅 연산자를 사용하는 이유는 down-casting 할 때 어떤 타입으로 갈 것인지 명시가 필요하기 때문이다.
형 변환은 인스턴스를 변환하는 것이 아닌 참조 변수를 변환하는 것이다.

Tv tv = (Tv) new CaptionTv();

2. instanceof 연산자

instanceof 연산자란?
참조 변수가 참조하고 있는 인스턴스에 실제 타입을 알아보기 위한 연산자이다.

if(c instanceof Parent) { // true or false
    ...
}

위의 예제는 참조 변수 c가 검사 타입인 Parent 클래스로 형 변환 여부를 체크하는 예제이다.

상위 타입의 참조 변수로 하위 타입의 인스턴스를 생성할 수 있기 때문에 instanceof로 타입 체크를 할 필요가 있다.
어떤 타입에 대한 instanceof연산의 결과가 true라는 것은 검사한 타입으로 형 변환이 가능하다는 뜻이다.

3. 참조 변수와 인스턴스의 연결

메서드의 경우 타입에 상관없이 항상 실제 인스턴스의 메서드(오버라이딩 된 메서드)가 호출된다.
멤버 변수의 경우 상위, 하위 클래스에서 중복으로 정의된 경우 상위 클래스에서는 상위 멤버를 하위 클래스에서 하위 멤버를 사용한다.

4. 매개변수의 다형성

메서드의 매개변수를 상위 클래스로 선언하고 매개변수로 하위 클래스를 받아 사용한다.

class Parent {}
class Child extends Parent {
    method(Parent p) {}
}

Child c = new Child();
c.method(new Child()) {}

5. 여러 종류의 객체를 배열로 다루기

상속 관계또

Product[] p = new Product[3];

p[0] = new Tv();
p[1] = new Computer();
p[2] = new Radio();

Vactor 클래스는 배열의 크기를 동적으로 관리한다.

'개발 언어 > Java' 카테고리의 다른 글

[Java] 인터페이스  (0) 2021.08.27
[Java] 추상 클래스&추상 메서드  (0) 2021.08.26
[Java] 제어자  (0) 2021.08.25
[Java] Package와 import  (0) 2021.08.24
[Java] 상속  (0) 2021.08.24

+ Recent posts