상속(타입 변환, instanceof)

Eunjeon_g·2023년 3월 5일
0

1. 타입 변환

다른 타입으로 변환하는 것을 말한다.
자동 타입 변환과 강제 타입 변환(casting)이 있다.

- 자동 타입 변환

자동으로 타입 변환이 일어나는 것이다.
다음과 같이 자식은 부모의 기능을 상속받았기 때문에 부모의 타입으로 자동 타입 변환이 가능하다.

public class Parent { }
class Child extends Parent { }
//부모타입 변수 = 자식타입객체;
Parent p = new Child();
바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 가능하다.

부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드, 메소드만 접근이 가능하다. 단, Overriding 된 메소드가 있다면 Overriding된 메소드가 호출된다. (자식 메소드가 실행된다.)

다형성
사용 방법은 동일하지만 실행 결과가 다르게 나오는 것 이다.
객체의 메소드는 동일하지만 결과가 다르게 나오는 성질을 말한다.

- 강제 타입 변환

부모 타입은 자식 타입으로 자동 변환되지 않는다.
대신 캐스팅을 통해 강제로 타입 변환을 할 수 있다.

//자식타입 변수 = (자식타입) 부모타입객체;
Child c = (Child) p;
단, 한번이라도 자식 타입을 받은 적이 있어야 한다. (자동 타입 변환을 격은 객체만 가능하다.)
Parents p1 = new Child();
Child c1 = (Child) p1; //강제 타입 변환 가능
		
Parents p2 = new Parents();
Child c2 = (Child) p2; //강제 타입 변환 불가능, 런타임 에러

2. instanceof : 객체 타입 확인

변수가 참조하는 타입을 확인할 때 instancof를 사용하며, boolean 값을 리턴해준다.

다음은 위에서 작성한 c1 객체가 Child 타입인지 확인해주는 코드다.

boolean result = c1 instanceof Child;

다음과 같이 강제 타입 변환 전에 사용하고자 하는 타입(Child2)인지 instance로 확인한다. 사용하고자하는 타입이 아니라면(!Child2) 강제 타입 변환을 할 수 없다.
강제 타입 변환을 하는 이유는 사용하고자 하는 자식 객체의 모든 멤버에 접근하기 위해서다. ( Child2의 필드인 name에 접근하기 위해서다. Child1,3에는 name 필드가 존재하지 않아 접근할 수 없다. )

부모 객체로 자동 타입 변환된 자식 객체는 자식 객체의 필드, 메소드에 접근할 수 없다. 부모 객체의 필드, 메소드에만 접근할 수 있다. (오버라이딩 제외)
class Child1 extends Parents{}
class Child2 extends Parents{
	String name = "두번째";
}
class Child3 extends Parents{}

public class Child{
	
    //부모 타입으로 받음 : 자식 객체면 아무나 typeCheck사용 가능
	static void typeCheck(Parents p) {
    	//타입 확인 후 강제 타입 변환
    	/* 방법 1
        if(p instanceof Child2) {
			Child2 ch = (Child2) p;
			System.out.println(ch.name +" : Child2 타입이다.");
		}
        */
    	//방법 2 : java 12부터 사용, true일 경우 객체가 우측 변수에 담김
		if(p instanceof Child2 ch)	
			System.out.println(ch.name +" : Child2 타입이다.");
	}

	public static void main(String[] args) {
		Parents c1 = new Child1();
		Parents c2 = new Child2();
		Parents c3 = new Child3();
		
		typeCheck(c1);
		typeCheck(c2);
		typeCheck(c3);
	}
}

결과는 다음과 같다.
두번째 : Child2 타입이다.

🙇🏻‍♀️

이것이 자바다 - 한빛미디어

0개의 댓글