Programming Language/Java

[Java] 다형성(polymorphism)

LeeJaeJun 2023. 12. 31. 01:35
728x90
반응형

다형성

- 여러 가지 형태를 가질 수 있는 능력

- Java에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현

즉, 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.

class Car{
    int wheel;
    int location;
    
    void wheel(int a) = {wheel = a;}
    void forward() = {location++;}
    void backward() = {location--;}
}

class SuperCar extends Car{
    boolean ceillingOpen;
    void Boost() {...}
}

다음과 같이 기본적으로 생성된 인스턴스를 다루기 위해서, 인스턴스의 타입과 일치하는 타입의 참조변수를 사용하였다.

Car c = new Car();
SuperCar sc = new SuperCar();

하지만 Car, SuperCar 클래스처럼 서로 상속관계이 있는 경우, 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하는 것이 가능하다. 반대로 자손타입의 참조변수로 조상타이브이 인스턴스를 참조할 수는 없다. 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다. (클래스는 상속을 통해서 확장될 수는 있어도 축소될 수는 없다.)

Car cc = new SuperCar();

하지만 인스턴스 cc는 c와 다르게 SuperCar() 인스턴스만의 모든 멤버를 사용할 수 없다. 여기서는  ceilingOpen과 Boost()를 사용할 수 없을 것이다. 즉, 둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 따라서 사용할 수 있는 멤버의 개수가 달라지는 것이다.

 

(+) 참조변수의 형변환

- 기본형 변수와 같이 참조변수도 서로 상속관계에 있는 클래스사이에서 형변환이 가능하다.

- 자손타입 -> 조상타입(Up-casting): 형변환 생략가능

=> 자손에서 조상은 참조변수가 다룰 수 있는 멤버의 개수가 실제 인스턴스가 갖고 있는 멤버의 개수가 적거나 같을 것이라는 것이 분명하므로 문제가 되지않아 형변환을 생략할 수 있도록 하였다.

- 조상타입 -> 자손타입(Down-casting): 형변환 생략불가(캐스트연사자를 사용하여, 즉, 괄호안에 변환하고자 하는 타입의 이름(클래스명)을 적어주여야 한다.)

- 형변환은 참조변수의 타입을 변환하는 것이지 인스턴스를 변환하는 것은 아니기에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다. 단지 참조변수의 형변환을 통해서, 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위(개수)를 조절하는 것뿐이다.

- 서로 상속관계에 있는 타입간의 형변환은 양방향으로 자유롭게 수행될 수 있으나, 참조변수가 가르키는 인스턴스의 자손타입으로 형변화은 허용되지 않는다. 그래서 참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인하는 것이 중요하다.

728x90
반응형

'Programming Language > Java' 카테고리의 다른 글

[Java] 프로그램 오류  (0) 2023.12.31
[Java] 인터페이스(interface)  (2) 2023.12.31
[Java] 제어자(modifier)  (0) 2023.12.31
[Java] 오버라이딩(overriding)  (1) 2023.12.30
[Java] 상속(inheritance)  (0) 2023.12.30