타입 변환과 다형성

Dorothy·2022년 12월 9일
0

항해99

목록 보기
11/17

매개 변수의 다형성

메소드를 호출할 때에는 매개 변수의 타입과 동일한 매개값을 지정하는 것이 정석이지만, 매개값을 다양화하기 위해 매개 변수에 자식 객체를 지정할 수도 있다.

매개 변수를 부모 타입(부모 클래스)으로 선언하면 메소드 호출 시 매개값으로 부모 객체 및 모든 자식 객체를 제공할 수 있다.

public class Vehicle {
    public void run() {
        System.out.println("차량이 달립니다.");
    }
}
// run() 메소드를 가지고 있는 Vehicle 클래스
public class Driver {
    public void drive(Vehicle vehicle) {
        vehicle.run();
    }
}
// Driver 클래스의 drive() 메소드안에 
// Vehicle 타입의 매개 변수를 선언한다.
public class DriverExample {
    public static void main(String[] args) {

        Driver driver = new Driver();
        Vehicle vehicle = new Vehicle();

        driver.drive(vehicle);
    }
}
// 실행 결과
// 차량이 달립니다.
public class Bus extends Vehicle {
    @Override
    public void run() {
        System.out.println("버스가 달립니다.");
    }
}
// Vehicle을 상속받는 Bus 클래스를 생성하고
// run() 메소드를 만들면 자동으로 @Override가 붙는다.
// override는 무시하다, ~보다 더 우선한다 등의 뜻이 있다.
// 부모 클래스의 run() 메소드를 자식 클래스에서 재정의 할 수 있다.
public class Taxi extends Vehicle {
    @Override
    public void run() {
        System.out.println("택시가 달립니다.");
    }
}
// 동일하게 Taxi 클래스 생성
public class DriverExample {

    public static void main(String[] args) {

        Driver driver = new Driver();
        Bus bus = new Bus();
        Taxi taxi = new Taxi();

        driver.drive(bus);
        driver.drive(taxi);
    }
}
// 실행 결과
// 버스가 달립니다.
// 택시가 달립니다.

drive() 메소드를 만들 때 Vehicle 타입의 매개 변수를 넣어줌으로써 자식 클래스인 Bus와 Taxi의 값까지 가져올 수 있다.

강제 타입 변환

자동 타입 변환 : 자식 타입이 부모 타입의 기능을 상속받기 때문에 부모 타입과 동일하게 취급될 수 있다는 것

부모타입 변수 = 자식타입;

강제 타입 변환 : 부모 타입을 자식 타입으로 변환하는 것
조건 : 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 반대로 변환할 때 사용

자식타입 변수 = (자식타입) 부모타입;
public class Parent {
    public String field1;

    public void method1() {
        System.out.println("Parent-method1()");
    }

    public void method2() {
        System.out.println("Parent-method2()");
    }
}
// method1() 과 method2()를 가진 부모 클래스
public class Child extends Parent {
    public String field2;

    public void method3() {
        System.out.println("Child-method3()");
    }
}
// Parent를 상속받고 method3()이 있음
public class ChildExample {
    public static void main(String[] args) {
        Parent parent = new Child(); // 자동 타입 변환

        parent.field1 = "data1";
        parent.method1();
        parent.method2();

        Child child = (Child) parent; // 강제 타입 변환

        child.field2 = "yyy";
        child.method3();
    }
}
// method3()을 사용하기 위해 자동 타입 변환된 상태에서 
// 다시 자식 타입으로 강제 타입 변환

객체 타입 확인

타입 확인하지 않고 강제 타입 변환 시도 시 ClassCastException 발생할 수 있다.

instanceof 연산자

  • 어떤 객체가 어느 클래스의 인스턴스인지 확인
  • 메소드 내 강제 타입 변환이 필요한 경우 사용
boolean result = 좌항(객체) instanceof 우항(타입)
public class ChildExample {
    public void method(Parent parent) {
        if (parent instanceof Child) {
            Child child = (Child) parent;
        }
    }
}
// Child가 Parent를 상속받기 때문에 예외 발생 X

0개의 댓글