23.01.31 day07 객체 형 변환과 객체 배열

Lee·2023년 1월 31일
0

2. 객체 형변환과 객체 배열

2-1. 객체 형변환

  • java 기본 유형의 데이터들처럼 객체 참조변수의 경우에도
    형변환(casting)이 이루어 진다.
  • 서로 다른 클래스 유형으로부터 나온 객체 참조변수들 간의
    대입에는 일정한 규칙이 있다.
Parent parent = new Child();
  • 왼쪽 항(parent)과 오른쪽 항(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;

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

  • 암묵적 형변환은 부모를 상속받는 자식객체의 기능을
    부모에게 물려받은 기능만 사용하도록 제한한다.
  • 그러므로 암묵적 형변환이 발생하게 되면 오버라이드된
    기능만 사용가능 하고, 추가적으로 구현한 기능은 사용할 수 없다.
  • 주의할 점은 기능의 제한이지 기능의 변경은 아니라는 것
  • 상속관계의 객체를 부모 형태로 변환하면 클래스의
    종류를 구분하지 않고 일괄된 기능을 호출할 수 있다.
  • 객체가 상위 클래스형태로 형변환 되더라도 Override된
    자신의 기능은 잃지 않는다.
Unit u1 = army;
Unit u2 = navy;
Unit u3 = airforce;
u1.attack();
u2.attack();
u3.attack();
  • 추가적으로 구현한 기능은 사용할 수 없게 되므로
    원래 기능을 다시 사용할 수 있는 방법이 필요해 졌다.
// 부모 클래스가 가지고 있는 기능이 아니므로 에러
u1.tank();
u2.nucleus();
u3.bumbing();

2-3. 명시적 형변환

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

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

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

2-5. 형변환 가능 여부

- 가능한 경우
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
wow

0개의 댓글