객체 형변환

devlsn96·2024년 7월 31일
0

java 언어 개념정리

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

  • 서로다른 클래스유형으로부터나온 객체 참조변수간의 대입에는 일정규칙이있다.

    	Parent p = new Child();
  • 왼쪽 항(Parent)과 오른쪽 항(Child)의 객체유형이 서로 다른 경우, 두 유형이 서로 상속관계에 있고 왼쪽 객체(Parent)가 오른쪽 객체(Child)의 상위 클래스인 경우에만 암묵적 형변환이 일어난다.

  • 하위 클래스에서 상위클래스 유형으로 할당하는 것은 가능하나, 그 경우에는 명시적 형변환을 해야한다.

1-1. 객체간의 암묵적 형변환

A a1 = new B();
A a2 = new X();
-------------------
A a3 = new Y();
A a4 = new C();
-------------------
B b1 = new C();
B x1 = new Y();
-------------------
C c = new C();
B b2 = c;
-------------------
Y y = new Y();
X x2 = new Y();

1-2. 암묵적 형변환과 매서드 오버라이드

  • 암묵적 형변환은 부모를 상속받는 자식객체의 기능을 부모에게 물려받은 기능만 사용하도록 제한한다.

  • 그러므로 암묵적 형변환이 발생하게 되면 오버라이드된 기능만 사용가능하고, 추가적으로 구현한 기능은 사용할 수 없다

  • 주의할 점은 기능의 제한이지 기능의 변경은 아니라는 것.

  • 상속관계의 객체를 부모 형태로 변환하면 클래스의 종류를 구분하지 않고 일관된 기능을 호출할 수 있고, 객체가 상위 클래스형태로 형변환 되더라 Override된 자신의 기능은 잃지 않는다.

    	Unit u1 = new Army();
    	Unit u2 = new Navy();
    	Unit u3 = new AirForce();
    
    	u1.attack();
    	u2.attack();
    	u3.attack();
  • 하지만, 추가적으로 구현한 기능은 사용할 수 없게 되므로, 원래의 기능을 다시 사용할 수 있는 방법이 필요해 졌다.

1-3. 명시적 형변환

  • 부모 클래스의 객체를 자식 클래스 형태로 변환
    하는 것

  • 형변환을 위해서는 다음과 같이 변환할 클래스 이름을 명시적으로 지정해 주어야 한다.

    	ChildCalss child = (ChildClass)parent;

1-4. 명시적 형변환의 조건

  • 객체가 최초 생성될때 자식클래스형태로 생성되고 부모형태로 암묵적 형변환이 된 상태를 다시 원래의 자식클래스 형태로 되돌릴 경우에만 가능하다.

    	CClass child1 = new CClass();		// 일반적
    	PClass parent1 = child1;			// 암묵적
    	CClass child2 = (CClass)parent2;	// 명시적 : 암묵적을 되돌리는것

-가능한 경우 : new 로 할당된 원본클래스로 되돌아 가는 경우에만 가능

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;
  • 위 두가지 경우 문법적 오류는 없기에 이클립스에서 에러를 검출하지 못한다.
    하지만 프로그램 실행시 에러가 발생한다.
profile
Quantum Jump to class for java….

0개의 댓글