[JAVA] 객체 배열

집 가고 싶다.·2024년 1월 4일

JAVA

목록 보기
24/33
post-thumbnail

1. 객체 배열

  • 정의: 객체 배열은 기본 데이터 유형의 배열과 유사하지만 특정 클래스의 객체를 저장합니다.

비교:

  • 기본 데이터 유형 배열
int[] data = new int[3];
  • 객체 배열
Army[] data = new Army[3];

요소 할당:

  • 기본 데이터 유형 배열
data[0] = 1; data[1] = 2; data[2] = 3;
  • 객체 배열
data[0] = new Army(); data[1] = new Army(); data[2] = new Army();

정리

  • 객체 형 변환
    동일한 부모 클래스에서 파생된 서로 다른 자식 클래스의 객체는 부모 형으로 암묵적 형변환될 수 있습니다.
  • 객체 배열
    동일한 클래스의 객체는 배열을 통해 한 번에 여러 개를 제어할 수 있습니다.

3. 부모 클래스 배열에 자식 클래스 객체 넣기

부모 클래스로 선언된 배열의 경우 모든 자식 클래스의 객체를 그 배열 요소에 할당할 수 있습니다.

Unit[] unit = new Unit[3];
unit[0] = new Army();
unit[1] = new Navy();
unit[2] = new AirForce();

4. 객체 배열 활용

  • 일괄 처리
    • 다양한 객체 배열을 루프로 반복하고 메서드를 호출하여 일괄 처리할 수 있습니다.
    • 메서드가 자식 클래스에서 재정의되었다면 해당 자식 클래스의 기능이 실행됩니다.
for(int i = 0; i < unit.length; i++){
    unit[i].attack(); // 실제 객체 유형에 따라 attack 메서드가 다를 수 있음.
}

5. 객체 배열 활용 2

  • 원래의 기능 복귀
    • 원래 클래스의 기능에 접근하려면 명시적 형변환이 필요합니다.
    • instanceof 연산자는 객체의 원래 클래스를 판별하여 불리언 결과로 반환합니다.
if (unit[0] instanceof Army) {
    // Army 클래스에 특정한 작업 수행.
}

예시

class Unit {
    protected String name;

    public Unit(String name) {
        this.name = name;
    }

    public void attack() {
        System.out.println(name + "이(가) 공격합니다!");
    }
}

class Army extends Unit {
    public Army(String name) {
        super(name);
    }

    @Override
    public void attack() {
        System.out.println(name + "이(가) 지상 공격을 실시합니다!");
    }

    public void specialCommand() {
        System.out.println(name + " 특수 명령을 실행합니다!");
    }
}

class Navy extends Unit {
    public Navy(String name) {
        super(name);
    }

    @Override
    public void attack() {
        System.out.println(name + "이(가) 해상 공격을 실시합니다!");
    }

    public void navalOperation() {
        System.out.println(name + " 해군 작전을 수행합니다!");
    }
}

class AirForce extends Unit {
    public AirForce(String name) {
        super(name);
    }

    @Override
    public void attack() {
        System.out.println(name + "이(가) 공중 공격을 실행합니다!");
    }

    public void airSuperiority() {
        System.out.println(name + " 공군이 공중 우위를 확보합니다!");
    }
}

public class Main {
    public static void main(String[] args) {
        // 객체 배열 생성 및 할당
        Unit[] units = new Unit[3];
        units[0] = new Army("육군");
        units[1] = new Navy("해군");
        units[2] = new AirForce("공군");

        // 객체 배열을 통한 일괄 처리
        for (Unit unit : units) {
            unit.attack();
        }

        // 특정 자식 클래스의 기능 사용
        if (units[0] instanceof Army) {
            ((Army) units[0]).specialCommand();
        }
    }
}

결과

육군이(가) 지상 공격을 실시합니다!
해군이(가) 해상 공격을 실시합니다!
공군이(가) 공중 공격을 실행합니다!
육군 특수 명령을 실행합니다!
profile
틀린거 있으면 알려주세요.

0개의 댓글