이번 시간에는, 상속과 직접적인 관련이 있는 기능은 아니지만 배열을 통해 다수의 객체를 관리하는 방법에 대해서 살펴보겠습니다. 일종의 코드 최적화 방법이라고 볼 수 있는데, 다수의 인스턴스를 다루는 데 있어서 효율성을 증대할 수 있고 자식 객체의 자동 변환과도 연관되어 있는 방법입니다. 앞선 아티클에서 작성한 Car, Tire 클래스 예시를 수정해서 진행해 보겠습니다.
우선 Car 클래스의 필드를 다시 살펴보겠습니다. Tire 클래스 타입으로 바퀴 네 개의 인스턴스를 생성해 사용했던 것을 기억하실 겁니다. 이 경우, 다른 부분에서 해당 인스턴스를 사용하게 될 때 긴 변수명을 그대로 적어야 했습니다.
public class Car {
Tire frontLeftTire = new Tire("앞왼쪽", 6);
Tire frontRightTire = new Tire("앞오른쪽", 2);
Tire backLeftTire = new Tire("뒤왼쪽", 3);
Tire backRightTire = new Tire("뒤오른쪽", 4);
// ...
}
이제, 위의 네 개의 Tire 타입의 변수를 배열로 만들어 보겠습니다. Tire타입의 객체가 요소로 구성되는 배열이니, 배열의 타입은 Tire[]가 되겠네요. 배열 변수 명은 tires로 정하겠습니다.
public class Car {
Tire[] tires = {
new Tire("앞왼쪽", 6),
new Tire("앞오른쪽", 2),
new Tire("뒤왼쪽", 3),
new Tire("뒤오른쪽", 4)
};
}
위와 같이 Tire 타입의 객체 배열로 변경하게 되면, 간단하게 해당 객체들을 컨트롤할 수 있게 됩니다. 기존에 변수명을 일일이 입력하여 자식 객체를 대입하던 과정을, tires[i] 인덱스를 활용하여 간단하게 작성할 수 있기 때문입니다.
// 기존 코드
frontRightTire = new KumhoTire("앞오른쪽", 13);
// 변경 후 코드
tires[1] = new KumhoTire("앞오른쪽", 13);
당연한 이야기지만, tires라는 배열 변수의 데이터 타입은 Tire 입니다. 그러므로, 기존 상속 속성과 동일하게 Tire의 자식 클래스 객체인 KumhoTire 또는 HankookTire 클래스 객체가 대입되면 동일하게 자동 변환이 일어나게 됩니다. 중요한 것은 이제 이 원리를 사용하여, 기존 작성했던 코드를 최적화하는 것입니다. 기존 코드에서 Car 클래스와 실행 클래스의 일부를 수정해 간단하게 만들어 보겠습니다.
기존의 Car 클래스
public class Car {
Tire frontLeftTire = new Tire("앞왼쪽", 6);
Tire frontRightTire = new Tire("앞오른쪽", 2);
Tire backLeftTire = new Tire("뒤왼쪽", 3);
Tire backRightTire = new Tire("뒤오른쪽", 4);
int run() {
System.out.println("자동차가 달립니다.");
if(frontLeftTire.roll() == false) {
stop();
return 1;
}
if(frontRightTire.roll() == false) {
stop();
return 2;
}
if(backLeftTire.roll() == false) {
stop();
return 3;
}
if(backRightTire.roll() == false) {
stop();
return 4;
}
return 0;
}
void stop() {
System.out.println("자동차가 멈춥니다.");
}
}
코드 최적화 후 Car 클래스
public class Car {
Tire[] tires = {
new Tire("앞왼쪽", 6),
new Tire("앞오른쪽", 2),
new Tire("뒤왼쪽", 3),
new Tire("뒤오른쪽", 4)
};
int run() {
System.out.println("자동차가 달립니다.");
for(int i = 0; i < tires.length; i++) {
if(tires[i].roll() == false) {
stop();
return (i+1);
}
}
return 0;
}
void stop() {
System.out.println("자동차가 멈춥니다.");
}
}
기존의 실행 클래스
public class ExampleMain {
public static void main(String[] args) {
Car car = new Car();
for(int i = 1; i <= 5; i++) {
int problemLocation = car.run();
switch(problemLocation) {
case 1:
System.out.println("앞왼쪽 HankookTire로 교체");
car.frontLeftTire = new HankookTire("앞왼쪽", 15);
break;
case 2:
System.out.println("앞오른쪽 KumhoTire로 교체");
car.frontRightTire = new KumhoTire("앞오른쪽", 13);
break;
case 3:
System.out.println("뒤왼쪽 HankookTire로 교체");
car.backLeftTire = new HankookTire("뒤왼쪽", 14);
break;
case 4:
System.out.println("뒤오른쪽 KumhoTire로 교체");
car.backRightTire = new KumhoTire("뒤오른쪽", 17);
break;
}
System.out.println("-----------------------");
}
}
}
코드 최적화 후 실행 클래스
public class ExampleMain {
public static void main(String[] args) {
Car car = new Car();
for(int i = 0; i <= 5; i++) {
int problemLocation = car.run();
if(problemLocation != 0) {
System.out.println(car.tires[problemLocation - 1].location + " HankookTire로 교체");
car.tires[problemLocation - 1] = new HankookTire(car.tires[problemLocation-1].location, 15);
}
System.out.println("---------------------");
}
}
}
'Programming > JAVA' 카테고리의 다른 글
상속(10) - 강제 타입 변환(Casting) (0) | 2023.03.07 |
---|---|
상속(9) - 파라미터의 다형성 (0) | 2023.03.06 |
상속(7) - 필드의 다형성 3 (0) | 2023.03.03 |
상속(7) - 필드의 다형성 2 (0) | 2023.03.01 |
상속(7) - 필드의 다형성 1 (0) | 2023.02.28 |