객체 형변환과 객체 배열

위수현·2023년 1월 31일
0
post-thumbnail

객체 형변환

🔎 java 기본 유형의 데이터들처럼 객체 참조변수의 경우에도 형변환(casting)이 이루어진다.
🔎 서로 다른 클래스 유형으로부터 나온 객체 참조변수들 간의 대입에는 일정한 규칙이 있다.

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

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

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

🔎 암묵적 형변환은 부모를 상속받는 자식객체의 기능을 부모에게 물려받은 기능만 사용하도록 제한한다.
🔎 그러므로 암묵적 형변환이 발생하게되면 오버라이드된 기능만 사용이 가능하고, 추가적으로 구현한 기능은 사용할 수 없다.
🔎 주의할 점은 기능의 제한이기 때문에 기능의 변경은 아니라는 것
🔎 상속관계의 객체를 부모 형태로 변환하면 클래스의
종류를 구분하지 않고 일관된 기능을 호출할 수 있다.
🔎 객체가 상위 클래스형태로 형변환 되더라도 Override된 자신의 기능은 잃지 않는다.
// 제한된 보기이기 때문에 기능이 사라지지는 않는다.//

	Unit u1 = army;
    Unti u2 = navy;
    Unit u3 = airforce;
    u1.attack();
    u2.attack();
    u3.attack();	// 가능하다 -> 상속받음 + 부모에 존재하는 정의

-> 추가적으로 구현한 기능은 사용할 수 없게 되므로 원래의 기능을 다시 사용할 수 있는 방법이 필요해졌다.

// 부모 클래스가 가지고 있는 기능이 아니므로 에러 발생
u1.tank();
u2.nucleus();
u3.bombing();

-> - instanceof 연산자를 통해 어떤 객체에 대한 출처를 판단하여 boolean형으로 결과를 반환한다.
-> 형변환이 가능해졌기에 다음 값을 읽어올 수 있다.

 	u1.tank();
    u2.nucleus();
    u3.bombing();

명시적 형변환

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

Child child = (Child)parent;

명시적 형변환의 조건

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

Ex)

< 형변환 가능한 경우>

1) ChildClass child1 = new ChildClass();
ParentClass parent1 = child1;
ChildClass child2 = (ChildClass)parent;

2) Army army1 = new Army();
unit u = army1; //암묵적 형변환
Army army2 = (Army)u; //명시적 형변환

3) Unit u = new Navy();
Navy navy = (Navy)u; //명시적 형변환

<형변환 불가능한 경우>

1) Unit u = new Unit();
Army army = (Army)u; //명시적 형변환 -> 불가
// 부모 형태로 암묵적 형변환이 된 상태를 다시 원래의
// 자식 클래스 형태로 되돌릴 경우에만 가능하다.

2) Army army = new Army();
Unit u = army;
Navy navy = (Navy)u;
// 최초 생성된 것과 다른 형식으로 변환하는
// 것은 불가능하다.

-> <형변환이 불가능한 경우>
1), 2)는 문법적인 오류는 없기 때문에, 이클립스에서는 에러를 검출하지 못한다.하지만 프로그램을 실행시켰을 경우에는 에러가 발생

profile
수현

0개의 댓글

관련 채용 정보