업캐스팅
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 31번째.
업캐스팅은 특정한(파생) 타입을 더 일반적인(기본) 타입으로 취급하는 행위입니다. C의 컴포지션 모델에서는 기본 타입을 포함하는 struct에 대한 포인터를 기본 타입을 필요로 하는 함수에 전달하는 것을 의미합니다.
Vehicle 기본 구조체와 이를 포함하는 Car를 생각해 보세요.
typedef struct {
int speed;
} Vehicle;
typedef struct {
Vehicle vehicle; // 베이스를 첫 번째 멤버로
int doors;
} Car;이제 모든 차량에 대해 작동하는 일반 함수를 생각해 보세요.
void accelerate(Vehicle* v, int amount) {
v->speed += amount;
}first member 규칙 덕분에 Car*를 Vehicle*로 캐스팅하여 이 function에 pass할 수 있습니다:
Car my_car = {{0}, 4}; // speed=0, doors=4
accelerate((Vehicle*)&my_car, 50);
printf("Speed: %d\n", my_car.vehicle.speed); // 출력: 50이것이 업캐스팅입니다. 특정 타입에서 일반적인 타입으로 "위로" 이동하는 것입니다. accelerate 함수는 자신이 Car와 함께 작업하고 있다는 사실을 알지 못하며, Vehicle만 봅니다. 이를 통해 기본 타입에서 작동하면서 이를 임베드하는 파생 타입은 무엇이든 받아들일 수 있는 재사용 가능한 코드를 작성할 수 있습니다.
챌린지
쉬움업캐스팅이 실제로 작동하는 모습을 보여주는 간단한 교통 시스템을 만들어 봅시다. 기본 Vehicle 타입과 더 구체적인 Motorcycle 타입을 만든 다음, 포인터 캐스팅을 통해 일반적인 function이 두 타입 모두와 어떻게 작동할 수 있는지 보여 줍니다.
업캐스팅의 장점은 기본 타입을 위한 function을 작성하면 이를 포함하는 모든 파생 타입에서 원활하게 사용할 수 있다는 것입니다. 여러분의 motorcycle은 "Vehicle이다"라고 할 수 있으므로, Vehicle*을 기대하는 모든 function이 이를 처리할 수 있어야 합니다.
코드를 세 개의 파일로 구성합니다:
vehicle.h: include guard를 사용하여 구조체 계층을 Define합니다. 두 개의 fields를 가진Vehicle구조체를 Create합니다:speed(현재 속도를 나타내는 정수)와max_speed(차량의 최고 속도를 나타내는 정수)입니다. 그런 다음Vehicle을 첫 번째 member로 포함하고has_sidecarfield (1은 예, 0은 아니요를 의미하는 정수)를 추가하는Motorcycle구조체를 Define합니다.Vehicle*과 속도를 Increase할 amount를 받는boostfunction과Motorcycle*을 받는print_motorcyclefunction을 Declare합니다.vehicle.c: 두 function을 모두 Implement합니다.boostfunction은 주어진 amount만큼 차량의 속도를 Increase해야 하지만, 새 속도가 최댓값을 exceed할 경우max_speed에서 제한해야 하며, 대신 속도를max_speed로 설정합니다.print_motorcyclefunction은 포함된 차량 데이터를 포함하여 motorcycle의 모든 information을 표시해야 합니다.main.c:Motorcycle을 Create하고 모든 fields를 initialize합니다. 그런 다음boostfunction을 calling하여 업캐스팅을 Demonstrate합니다.Motorcycle*을Vehicle*로 cast하여 이 일반적인 function에 pass합니다. boost한 후 motorcycle의 information을 Print하여 결과를 확인합니다.
네 가지 inputs를 받습니다: motorcycle의 initial speed, max speed, has a sidecar 여부 (1 또는 0), 그리고 boost amount입니다.
Output은 다음과 같아야 합니다:
Speed: 75
Max Speed: 120
Sidecar: Yes여기서 75는 boost 후의 속도(초기 속도 50 + boost 25)이고, 120은 max speed이며, Yes 또는 No는 motorcycle이 sidecar를 has_sidecar하는지를 나타냅니다. boost로 인해 속도가 max_speed를 초과하게 된다면 속도는 max_speed로 제한되어야 합니다.
여기서 핵심적으로 배울 점은 boost가 motorcycle에 대해 아무것도 알지 못한다는 것입니다. 이 function은 Vehicle과만 작동합니다. 하지만 업캐스팅을 통해 motorcycle이 이 일반적인 function을 사용하여 포함된 차량 데이터를 수정할 수 있습니다.
직접 해보기
#include <stdio.h>
#include "vehicle.h"
int main() {
int initial_speed, max_speed, has_sidecar, boost_amount;
// 입력 읽기
scanf("%d", &initial_speed);
scanf("%d", &max_speed);
scanf("%d", &has_sidecar);
scanf("%d", &boost_amount);
// TODO: Motorcycle를 생성하고 모든 필드를 초기화하세요
// 기억하세요: Motorcycle는 첫 번째 멤버로 Vehicle을 포함합니다
// TODO: boost를 호출하여 업캐스팅을 시연하세요
// boost 함수에 전달하기 위해 Motorcycle*를 Vehicle*로 캐스팅하세요
// TODO: 오토바이의 정보를 출력하세요
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러