18. 객체 형변환

강태석·2022년 8월 18일
0

Java 기초

목록 보기
18/24

객체 형변환

java 기본 유형의 데이터들처럼 객체 참조변수의 경우에도 형변환(casting)이 이루어 진다.

  • 서로 다른 클래스 유형으로부터 나온 객체 참조변수들 간의 대입에는 일정한 규칙이 있다.
Parent parent = new Child();
  • 왼쪽 항(부모 클래스)과 오른쪽 항(자식 클래스)의 객체 유형이 서로 다른 경우, 두 유형이 서로 상속 관계에 있고 왼쪽 객체(부모 클래스)가 오른쪽 객체(자식클래스)의 상위 클래스인 경우에만 암묵적 형변환이 일어난다.
  • 하위 클래스에서 상위클래스 유형으로 할당하는 것은 가능하나 그 반대의 경우에는 명시적 형변환을 해야한다.
    -> 그러나 상위 클래스 유형을 하위 클래스 유형으로 강제 형 변환하는 경우에는 할당되는 객체의 유형에 따라서 실행 오류가 발생할 수 있다.

암묵적 형변환

/*-- 위의 표에서 암묵적 형변환이 어떻게 일어나는지 --*/

A a1 = new B();		// 암묵적 형변환 일어남
A a2 = new X();		// 암묵적 형변환 일어남
------------------
A a3 = new C();		// 암묵적 형변환 일어남
A a4 = new Y();		// 암묵적 형변환 일어남
------------------
B b1 = new C();		// 암묵적 형변환 일어남
X x1 = new Y();		// 암묵적 형변환 일어남
------------------
C c = new C();		
B b2 = c;			// 암묵적 형변환 일어남
------------------
Y y = new Y();		
X x2 = y;			// 암묵적 형변환 일어남

암묵적 형변환과 메서드 오버라이드

  • 암묵적 형변환은 부모를 상속받는 자식객체의 기능을 부모에게 물려받은기능만 사용하도록 제한한다.
  • 그러므로 암묵적 형변환이 발생하게 되면 오버라이드된 기능만 사용가능하고, 추가적으로 구현한 기능은 사용할 수 없다.
  • 주의할 점은 기능의 제한이지 기능의 변경은 아니다.
Unit u1 = new Army();
Unit u2 = new Navy();
Unit u3 = new AirForce();	

// Army, Navy, AirForce 클래스는 Unit의 자식클래스들 이며,
// Unit 클래스의 attack() 메서드를 오버라이드 했음

u1.attack();
u2.attack();
u3.attack();
  • 상속관계의 객체를 부모형태로 변환하면 클래스의 종류를 구분하지 않고 일관된 기능을 호출할 수 있다.

  • 객체가 상위클래스형태로 형변환 되더라도 Override된 자신의 기능은 잃지 않는다.

  • 하지만, 추가적으로 구현했던 기능은 사용할 수 없게 되므로 원래의 기능을 다시 사용할 수 있는 방법이 필요해졌다.


명시적 형변환

  • 부모 클래스의 객체를 자식 클래스 형태로 변환하는 것.
  • 형변환을 위해서는 변환할 클래스 이름을 명시적으로 지정해 주어야 한다.
ChildClass child = (ChildClass)parent;

명시적 형변환의 조건

  • 객체가 최초 생성될 때 자식 클래스 형태로 생성되고,
    부모 형태로 암묵적 형변환이 된 상태를 다시 원래 자식 클래스 형태로 되돌릴 경우에만 가능하다.
ChildClass child1 = new ChildClass();
ParentClass parent = child1;	// 암묵적 형변환
ChildClass child2 = (ChildClass)parent;

명시적 형변환이 가능한 경우

Army army1 = new Army();
Unit u = army1;
Army army2 = (Army)u;
----------------------
Unit u = new Navy();
Navy navy = (Navy)u;

명시적 형변환이 불가능한 경우

// 최초 객체 생성이 부모 형태로 만들어진 경우 불가능하다.
Unit u = new Unit();
Army army = (Army)u;
-------------------------------
// 최초 생성된 것과 다른 형식으로 변환하는 것은 불가능 하다.
Army army = new Army();
Unit u = army;
Navy navy = (Navy)u;

0개의 댓글