본문 바로가기

JAVA

다형성

1. 다형성이란?

 

다형성은 여러 가지 형태를 가질 수 있는 특성을 의미한다.

자바에서는 하나의 타입으로 여러 타입의 객체를 참조할 수 있도록 구현하였다.

이러한 특성으로 인하여 부모 클래스 타입으로 자식 클래스 타입의 인스턴스 주소를 저장할 수 있게 된다.

class Car {
	
    int door;
    String color;
    
    void move() {
    	System.out.println("차가 움직입니다.");
    }
}

class MiniCar extends Car {
	
    int battery;
    
    void recharge() {
    	System.out.println("미니카가 충전 중입니다.");
    }
}

이렇게 두 개의 클래스가 있고 미니카가 카를 상속하는 구조가 있다고 가정해보자.

기본적으로 두 개의 클래스에 대한 인스턴스 생성은 다음과 같이 나타낼 수 있을 것이다.

Car car = new Car();
MiniCar mimiCar = new MiniCar();

그리고 다형성이 적용된다면 다음과 같은 형태로도 인스턴스 생성이 가능해진다.

Car mini = new MiniCar();

// 자식 클래스 타입으로는 만들 수 없음
MiniCar car = new Car(); - 런타임 에러

다만 자기 자신과 다른 타입으로 인스턴스를 생성하는 경우에는 

해당 타입에 있는 멤버만 사용할 수 있다는 단점이 있다. 

즉 참조 변수 mini 를 통해 접근 할 수 있는 것은 Car 클래스의 멤버만 접근이 가능하고 MiniCar 클래스의 멤버에는 접근이 불가하다.

다만 참조 변수와 인스턴스의 타입이 동일할 경우에는 해당 클래스의 멤버에 대해 전부 접근이 가능하다.

 

만일 어떠한 메서드가 부모 클래스 타입을 매개변수로 사용한다면 

다형성을 이용하여 부모 클래스 타입으로 인스턴스를 저장한 자식 클래스를 매개변수로 대신 사용할 수도 있게 된다.

 

2. 상속 관계의 형변환

 

자식 클래스 타입으로 부모 클래스의 인스턴스를 생성할 수 없는 이유

자식 클래스 멤버는 항상 부모 클래스 멤버에 비해 많거나 같기 때문이다.  

 

이러한 이유로 형변환에 있어서도 차이가 발생한다.

자식 클래스에서 부모 클래스로 형변환 하는 경우에는 묵시적 형변환을 허용하지만,

부모 클래스에서 자식 클래스로 형변환 하는 경우에는 명시적 형변환을 해야만 한다.

자식 ➡️ 부모 : 묵시적 형변환 (up-cating)
부모 ➡️ 자식 : 명시적 형변환 (down-cating)

형변환의 주의점은 참조 변수의 타입을 변경하는 것일 뿐, 인스턴스의 타입을 변경하는 것이 아니라는 것을 기억해야 한다. 

 

 

3. instanceof 연산자

 

간혹 참조 변수가 어떠한 타입의 인스턴스를 참조하고 있는지 확인해야 할 때가 있는데 

그때 유용하게 사용할 수 있는 연산자가 바로 instanceof 이다.

참조 변수 instanceof 클래스명

왼쪽에는 확인하고자 하는 대상이 될 참조 변수를 두고,

오른쪽에는 인스턴스 타입을 확인할 클래스를 둔다.

car instanceof Car           // true
miniCar instanceof MiniCar   // true
mini instanceof Car          // false
mini instanceof MiniCar      // true

참조 변수 mini 의 경우 참조 변수 타입은 Car 클래스 타입이기는 하지만

인스턴스 생성은 MiniCar 클래스로부터 생성되었기 때문에 위와 같은 결과를 볼 수 있게 된다.

'JAVA' 카테고리의 다른 글

추상 클래스 (Abstract class)  (0) 2022.09.25
여러 타입의 객체를 하나의 배열로 다루기  (1) 2022.09.25
this 와 super  (0) 2022.09.21
오버라이딩(Overriding)  (0) 2022.09.20
클래스 간의 관계 - 상속, 포함  (0) 2022.09.18