[TIL] 220623

Moon·2022년 6월 23일
0

다형성 (polymorphism)

  • 객체지향 개념에서 다형성은 여러 가지 형태를 가질 수 있는 능력을 의미한다.

  • 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있게 한다.
    -> 부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 한다.

  • 업캐스팅 : 자식클래스 객체가 부모 클래스 타입으로 형변환되는 것

  • 다운캐스팅 : 업캐스팅 된 것을 다시 원상태로 돌리는 것. 타입을 명시적으로 지정해줘야 한다.



public class UpDownCasting {

    public static void main(String[] args) {

//		부모 클래스 타입에 자식 클래스 타입의 객체가 생성된 주소를 대입했으므로 정상적으로 처리된다.
//		Base b = new Sub();		// 정상 실행
//		자식 클래스 타입에 부모 클래스 타입의 객체가 생성쇤 주소를 대입했으므로 에러가 발생된다.
//		Sub s = new Base();		// 에러 발생

//		부모 클래스 타입의 객체에 자식 클래스 타입의 객체가 생성된 주소를 대입한다. => upcasting
        Base b = sub;

//		자식 클래스 타입의 객체에 부모 클래스 타입의 객체가 생성된 주소를 대입한다.
//		Sub s = base;			// 에러 발생
//		자식 클래스 타입에 부모 클래스 타입의 객체가 생성된 주소를 대입하면 에러가 발생되는데 이 때 casting 시켜서 대입하면 대입은
//		가능하다. 이 경우 문법적인 오류는 발생되지 않지만 프로그램 실행 단계에서 ClassCaseException이 발생된다.
//		Sub s = (Sub) base;		// casting 시키면 문법적인 에러는 발생되지 않는다.

//		instanceof 연산자는 객체가 instanceof 뒤에 지정된 클래스 타입으로 안전하게 형변환이 가능한지 검사한다.
//		형식 => 객체이름 instanceof 클래스이름

        if (sub instanceof Base) {
            Base base2 = sub;
            base2.say();
        } else {
            System.out.println("Sub 클래스 타입의 객체는 Base 클래스 타입으로 형변환 시킬 수 없습니다.");
        }

        if (base instanceof Sub) {
            Sub sub2 = (Sub) base;
            sub2.say();
        } else {
            System.out.println("Base 클래스 타입의 객체는 Sub 클래스 타입으로 형변환 시킬 수 없습니다.");
        }

        try {
            Sub sub2 = (Sub) base;
            sub2.say();
        } catch (ClassCastException e) {
            System.out.println("Base 클래스 타입의 객체는 Sub 클래스 타입으로 형변환 시킬 수 없습니다.");
        }

    }

}
profile
매일 성장하는 개발자 되기😊

0개의 댓글