(객체part2 ) 8. 다형성의 장점(2)/ 참조변수의 배열
여러 종류의 객체를 배열로 다루기 .
다형성의 장점
- 다형적 매개변수
- 하나의 배열에 여러 종류 객체 저장
이번엔 배열에 참조변수를 넣어 여러 객체를 저장해보는 코드를 만들어보자.
buyer라는 클래스가 사는 행위 'buy' 라는 메소드에 구입을 할 때 마다 장바구니에 하나 씩 제품을 넣는다고 가정해보면
아래 같은 코드가 나온다.
Buyer 클래스
case 1.
아래 코드에서 cart라는 배열은 관점을 어떻게 갖느냐에 따라 다르게 해석될 수 있다.
위 코드는 쉽게 이마트와 홈플러스 같은 마트라고 상상해보자. 우리는 대형 마트에서 바코드 스캔과 동시에 장바구니에 다시 물건들을 넣는
다. 그리고 아마 포스기에는 누적된 계산해야할 금액이 있을 것이고, 그에 따라 보너스 포인트도 측정된다. 여기서 내 지갑에 있는 돈이 소지
금이 될 것이고 이렇게 결제를 마치고 나면, 그 후로 쇼핑카트에 넣은 물건들을 자동차로 옮겨 담기 위해 카트로 끌고 주차장으로 향한다.
이런 상황을 전제로 하면 아래와 같은 코드를 구사할 수 있을 것이다.
case 2.
이번 상황은 온라인 쇼핑을 상상해보자. 보통 우리는 제품들을 둘러본 후 맘에 든 제품들을 장바구니에 넣어 한 번에 결제하고, 잔액 그리고
포인트를 확인할 수 있다. 그러면 cart라는 배열을 이전과 달리 prodcut를 참조변수로 하여, Buyer가 담는 행위와 구매하는 행위를 각각
구분해줄 것이다.
putProduct 구현
void putProduct (Product p) {
cart[i++] = p ;
}
위와 같이, 제품들을 장바구니에 넣고 반복문을 사용하여, 성공적으로 구매한 모습을 볼 수 있다.
++ 혹시나 장바구니에 있는 제품을 제거하고 싶을 때는 어떻게 할까 ?
다음은 removeProduct에 대한 메서드 구현이다.
void removeProduct(Product p) {
for (int j = 0; j < i; j++) { // i는 배열의 길이, j는 지우려는 배열의 인덱스
if (cart[j] == p) {
// 제품을 찾았으면 배열에서 제거하고 정리
for (int k = j; k < i - 1; k++) { //찾았다면 지우려는 배열의 시작 부터, 배열의길이 -1까지 1칸씩 밀어 넣을
cart[k] = cart[k + 1];
}
cart[i - 1] = null;
i--;
System.out.println(p + "을 장바구니에서 제거하였습니다.");
return; // 반환 값 없이 처리
}
}
System.out.println("장바구니에 해당 제품이 없습니다.");
}
}
1. 우선 파라미터로 지우고 싶은 특정 객체를 받는다
.
2. 반복문과 조건문으로 특정 객체가 객체배열 중 몇 번째 인덱스에 있는지 확인한다.
3. 찾았다면, 지우려는 배열의 시작부터 배열의 길이 -1 (배열의 인덱스는 길이보다 하나 적으니까) 까지 뒤에 있는 배열의 값을 앞에 있는 배열의 값으로 덮어 씌어준다.
ex)cart[k] : [Tv, Audio, Computer]
cart[k]를 cart[k+1]로 이동: [Audio, Computer,Computer] // 배열의 길이가 3이지만 i-1이므로 2번만 반복.
4. 그리고 배열의 길이에서 -1인 값 즉, 배열의 끝에 있는 인덱스를 null 값으로 만들어준다.
cart[i-1] = null -> [Audio, Computer,null]
5. 마무리 작업으로 인덱스로 사용하였던 i를 똑같이 감소시킨다. ( 다음 메서드에도 사용할 수 있어야하니까)