JAVA - 객체배열

박종휘·2022년 10월 29일
0

JAVA - 국비

목록 보기
20/29
post-thumbnail
post-custom-banner

1. 객체배열

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

  • 객체 배열의 경우
    Army[ ] data = new Army[3];

    Army a1 = new Army();
    Army a2 = new Army();
    Army a3 = new Army();

  • 각 경우에 대한 배열의 요소 할당처리
    • 일반 데이터 형은 단순히 값을 대입하지만, 객체 배열은 'new'를 사용하여 객체를 할당해야한다.
  • 일반 데이터 형 배열의 경우
    data[0] = 10;
    data[1] = 20;
    data[2] = 35;

  • 객체 배열의 경우
    Army a1 = new Army();
    data[0] = new Army();
    data[1] = new Army();
    data[2] = new Army();

1-1. 정리

  • 객체 형변환
    • 같은 부모 클래스에서 파생된 서로 다른 자식 클래스의 객체들은 부모 형태로 암묵적 형변환되어 일관된 형식으로 사용 가능하다.
  • 객체 배열
    • 동일한 클래스의 객체는 배열로 묶어서 여러 개를 한꺼번에 제어할 수 있다.

1-2. 부모 클래스의 배열에 자식 클래스의 객체를 넣기

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

public class Unit {
	private String name;

	// 생성자를 정의
	public Unit(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	// 재정의 대상
	public void attack() {
		System.out.println(this.name + " >>> 공격준비!!! ");
	}
}

------------------------------------------------------------

package boxing;

public class AirForce extends Unit{

	public AirForce(String name) {
		super(name);
	}
	
	@Override
	public void attack() {
		super.attack();
		System.out.println( this.getName() + " >> 이륙" );
		System.out.println( this.getName() + " >> 공중공격 실행" );
	}
	
	public void bombing() {
		System.out.println(
			this.getName() + " >> 폭격");
	}
}

------------------------------------------------------------

package boxing;

public class Army extends Unit {

	// 부모 클래스의 생성자를 강제 호출하기 위한 생성자
	public Army(String name) {
		super(name);
	}

	// 공격의 형태를 육군에 맞게 변경하지만,
	// 부모 클래스가 가지고 있는 공격 준비 기능을
	// super 키워드를 통해 보전
	@Override
	public void attack() {
		super.attack();
		System.out.println( super.getName() + " >> 지상공격 실행" );
	}
	
	public void tank() {
		System.out.println( 
			super.getName() + " >> 탱크공격");
	}
}

------------------------------------------------------------

package boxing;

public class Navy extends Unit{

	public Navy(String name) {
		super(name);
	}
	
	@Override
	public void attack() {
		super.attack();
		System.out.println( this.getName() + " >> 어뢰발사" );
		System.out.println( this.getName() + " >> 지상 상륙" );
	}
	
	public void nucleus() {
		System.out.println( 
			this.getName() + " >> 핵미사일");
	}
}

------------------------------------------------------------

package boxing;

public class Main02 {

	public static void main(String[] args) {
		// 부대지정
		Unit[] units = new Unit[5];
		
		units[0] = new AirForce("공군1호");
		units[1] = new AirForce("공군2호");
		units[2] = new Navy("해군1호");
		units[3] = new Army("육군1호");
		units[4] = new Army("육군2호");
		
		// 부대 일괄 공격 attack();
//		units[0].attack();
//		units[1].attack();
//		units[2].attack();
//		units[3].attack();
//		units[4].attack();
		
		// 각 기능의 고유한 기능 호출
		for( int i = 0; i<units.length; i++ ) {
			units[i].attack();
			
			// 각 기능의 고유한 기능 호출
			if( units[i] instanceof Army ) {
				Army a = (Army)units[i];
				a.tank();
			} else if( units[i] instanceof Navy ) {
				Navy n = (Navy)units[i];
				n.nucleus();
			} else {
				AirForce f = (AirForce)units[i];
				f.bombing();
			}
		}
		
	}
}
result

공군1>>> 공격준비!!! 
공군1>> 이륙
공군1>> 공중공격 실행
공군1>> 폭격
공군2>>> 공격준비!!! 
공군2>> 이륙
공군2>> 공중공격 실행
공군2>> 폭격
해군1>>> 공격준비!!! 
해군1>> 어뢰발사
해군1>> 지상 상륙
해군1>> 핵미사일
육군1>>> 공격준비!!! 
육군1>> 지상공격 실행
육군1>> 탱크공격
육군2>>> 공격준비!!! 
육군2>> 지상공격 실행
육군2>> 탱크공격

1-3. 원래의 기능으로 복귀하기 (instanceof)

  • 배열의 각 요소가 확장한 기능을 사용하기 위해서는 원래의 클래스 형태로 명시적 형변환이 이루어져야 한다.
  • 하지만 반복적으로 처리되는 과정에서 몇 번째 요소가 어떤 클래스에서 최초로 생성되었는지를 판단하기란 쉽지않다.
  • instanceof 연산자
    -> instanceof 연산자는 어떤 객체에 대한 출처를 판단하여 boolean 형으로 결과를 반환한다.
if(units[0] instanceof Army) { // units[0]에 할당되어 있는 객체가 Army 인지 아닌지 (true or false)
	Army temp1 = (Army)units[0];
    temp1.tank();
}
profile
개린이의 개발 고수되기 작전!
post-custom-banner

0개의 댓글