DAY07(1) - 객체 형변환, 객체 배열

은나현·2023년 1월 31일
0
post-thumbnail

📌 1. 객체 형변환

📍 1-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;

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

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

📍 1-3. 명시적 형변환

  • 부모 클래스의 객체를 자식 클래스 형태로 변환하는 것이 명시적 형변환이다.

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

    • Child child = (Child)Parent;
  • 명시적 형변환의 조건

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

      • 명시적 형변환이 가능한 경우의 예시
      		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;	//최초 생성된 것과 다른 형식으로 변환하는 것은 불가능
      • 불가능한 2가지 경우 문법적인 오류는 없기 때문에 이클립스에서는 에러를 검출하지 못한다. 하지만 프로그램을 실행시켰을 경우에는 에러가 발생한다.

📌 2. 객체 배열

📍 2-1. 객체 배열이란

  • 일반 데이터 타입의 배열과 동일한 개념으로, 같은 클래스의 객체 여러 개를 그룹화할 수 있다.
    • Army[] data = new Army[3];

📍 2-2. 객체 배열의 할당

  • 일반 데이터형은 단순히 값을 대입하지만 객체 배열은 new를 사용하여 객체를 할당해야 한다.
    • 일반 데이터형 배열

      data[0] = 1;
      data[1] = 2;
      data[2] = 10;
      ...

    • 객체 배열

      data[0] = new Army();
      data[1] = new Army();
      data[2] = new Army();
      ...

  • 부모 클래스의 배열에 자식 클래스의 객체를 할당할 수 있다.
    • 배열의 생성이 부모 클래스로 지정되었을 경우, 모든 자식 클래스의 객체들은 그 배열에 포함될 수 있다.
    • 요소가 할당되면서 암묵적 형변환이 일어난다.
      // Army, Navy, AirForce가 각각 Unit을 상속할 경우
      	Unit[] unit = new Unit[3];
       	Unit[0] = new Army();
          Unit[1] = new Navy();
          Unit[2] = new AirForce();

📍 2-2. 객체 배열의 활용

  • 일괄 처리가 가능
    • 서로 다른 객체를 부모 형태의 배열에 담게 되면, 반복문으로 일괄처리가 가능하다.
    • 이 때 배열의 각 요소를 통하여 사용하는 메서드가 Override되어 있을 경우, 부모의 메서드가 아니라 자신이 재정의한 기능을 뜻한다.
    	for( int i = 0; i<unit.length; i++){
    		unit[i].attack();
    	}
        // 부모 클래스에 attack()메소드가 존재하고 각 자식 클래스에서 오버라이딩되었을 경우, 
    	반복문을 통해 배열에 포함된 자식 객체들의 attack()메소드를 일괄적으로 처리할 수 있다.

0개의 댓글