BE전문가 프로젝트

8. 클래스의 타입 변환 및 다형성 본문

JAVA

8. 클래스의 타입 변환 및 다형성

원호보고서 2023. 11. 8. 19:10

다형성

동일한 사용 방법을 다양한 객체를 활용하여 각자 다른 결과 값을 도출하는 것을 의미한다.

컴퓨터 부품으로 예를 들어 설명하면 본체는 그대로지만 성능이 다른 그래픽 카드를 갈아 끼는 것과 비슷하다고 볼 수 있다.

 

자동 타입 변환

클래스도 기본 타입과 마찬가지로 타입 변환이 가능하다. 기본 타입에서는 작은 타입에서 큰 타입으로 저장될 때 발생한다. 이와 비슷하게 클래스에서도 자식 타입이 부모 타입으로 자동 타입 변환이 가능하다. 

Car car = new Car();
Vehicle v1 = car;

Vehicle v2 = new Car();

car과 v1은 따로 동일한 객체를 참조하기 때문에 ==연산에서도 ture가 나오는 것을 확인할 수 있다.

 

앞에 코드와 같이 부모 타입으로 변환이 된 후에는 다시 자식 클래스의 메소드를 사용할 수 없다.

이전 포스팅을 살펴보면 자식 클래스에서 부모 클래스의 메소드를 재정의(Overiding)할 수 있다는 것을 확인 할 수 있다.

이 이야기를 하는 이유는 부모 클래스로 타입 변환된 인스턴스가 자식 클래스에서 재정의된 메소드를 사용할 시에는 부모 클래스에서 정의된 메소드가 아닌 자식 클래스의 메소드가 실행된다라는 사실을 확인해야하기 때문이다.

부모 클래스
public class Calculator {
    
    double multiplication(double x, double y){
        return x * y;
    }
    
    double add(double x, double y) {
        return x + y;
    }
}
자식 클래스
public class CalculatorTen extends Calculator {

    @Override
    double add(double x, double y) {
        return x + y + 10;
    }

    double multiplicationTen(double x, double y) {
        return x * y * 10;
    }
}
public class HelloWorld {

    public static void main(String[] args) {

        Calculator cal = new CalculatorTen();

        double num1 = cal.multiplication(10, 10);//호출 가능
        
        double num2 = cal.add(10, 10);           //자식 메소드 호출
        
        double num3 = cal.multiplicationTen(10, 10);  //호출 불가능

    }
}
  • num1는 부모 클래스에 정의된 메소드임으로 호출 가능
  • num2는 자식 메소드를 호출함
  • num3는 자식 클래스에 정의된 메소드임으로 호출 불가능(강제 타입 변환 시 사용 가능)

 

필드의 다형성

위에 코드를 설명한 이유는 바로 다형성을 구현하기 위해 만들어낸 코드이다. 앞에서는 하나의 자식만 가지고 있기 때문에 필요성을 느끼기 어렵지만 여러개의 자식을 가지게 되면 각자 특색에 맞게 다양한 메소드들을 사용할 수 있기 때문이다.

마치 자동차의 바퀴마다 성능이 다르듯 다른 성능을 프로그램에서 구현하고 싶을 때 사용된다.

 

강제 타입 변환

이것도 역시 기본 타입과 같이 큰 타입에서 작은 타입으로 강제로 변환이 가능하듯 부모클래스에서 자식 클래스로 강제 변환이 가능하다. 단 자식클래스에서 부모 클래스로 자동 타입 변환이 일어난 인스턴스의 경우에만 가능하다.

다시 자식 타입의 메소드를 사용해야되는 순간이 온다면 아래와 같이 강제 타입 변환을 해주면 된다.

Vehicle ve = new Vehicle();
Car car = (Car) ve;

 

 

객체 타입 확인(instanceof)

위에서 설명했듯 강제 타입 변환은 자식 타입이 부모 타입으로 변환한 이력이 있는 인스턴스만 가능하다. 이것을 확인하지 않는다면 예외가 발생할 상황을 대비하지 못하기 때문에 강제 타입 변환 전에 instanceof를 사용하여 타입을 확인 하는 것이 좋다.

Car car = new Car();
Vehicle ve = car;	         //자동 타입 변환


if(car instanceof Vehicle) { //강제 형변환이 가능한지 알아보는 코드
    Car car2 = (car) ve;
}

'JAVA' 카테고리의 다른 글

10. 인터페이스  (0) 2023.11.09
9. 추상 클래스  (0) 2023.11.09
7.상속  (0) 2023.11.08
6. 인스턴스 멤버 및 정적 멤버  (0) 2023.11.08
5.객체 지향 프로그래밍(객체 및 Class에 대하여)  (0) 2023.11.07
Comments