본문 바로가기
JAVA

[JAVA] 상속 중 타입 변환(자동 타입 변환, 강제 타입 변환)

by IT 정복가 2023. 8. 18.
728x90

타입 변환이란 타입을 다른 타입으로 변환하는 것을 말한다.

클래스의 타입 변환은 상속 관계에 있는 클래스 사이에서 발생한다.

 

1. 자동타입 변환

자동타입 변환은 의미 그대로 자동적으로 타입 변환이 일어나는 것을 말한다. 

자동 타입 변환
- Cat cat = new Cat();
  Animal animal = cat;
                   ↓
- Animal animal = new Cat( );

(cat과 animal 변수는 타입만 다를 뿐 모두 동일한 Cat 객체를 참조한다.)

예제)

class A{
	
}

class B extends A{
	
}

class C extends A{
	
}

class D extends B{
	
}

class E extends C{
	
}

public class PromotionExample {

	public static void main(String[] args) {
		B b = new B();
		C c = new C();
		D d = new D();
		E e = new E();
		
		A a1 = b; //자동타입 변환
		A a2 = c; //자동타입 변환
		A a3 = d; //자동타입 변환
		A a4 = e; //자동타입 변환
		
		B b1 = d; //자동타입 변환
		C c1 = e; //자동타입 변환
		
//		B b3 = e; 컴파일 에러(상속관계 아님)
//		C c2 = d; 컴파일 에러(상속관계 아님)

	}

}

부모 타입으로 자동 타입 변환이된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.

그러나 자식 클래스에 오버라이딩된 메소드가 있다면 부모 대신 오버라이딩된 메소드가 호출된다.

 

예제)

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

class Child extends Parent{
	
	@Override
	public void method2() {
		System.out.println("Child method2()");
	}
	
	public void method3() {
		System.out.println("Child method3()");
	}
}

public class ChildExample {

	public static void main(String[] args) {
		
		Child child = new Child();
		Parent parent = child;
		//Parent parent = new Child();

		parent.method1();
		parent.method2();
		parent.method3(); //에러 (호출 불가)
		
	}

}


2. 강제 타입 변환

자식 타입은 부모 타입으로 자동 변환되지만, 반대로 부모 타입은 자식 타입으로 자동 변환되지 않는다.

대신 캐스팅 연산자로 강제 타입 변환을 할 수 있다.

하지만, 부모 타입 객체를 자식 타입으로 무조건 강제 변환할 수 있는 것은 아니다. 

자식 객체가 부모 타입으로 자동 변환된 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.

Parent parent = new Child( ); //자동 타입 변환
Child child = (Child) parent; // 강제 타입 변환

 

728x90