요약: 비밀 상자
Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 21번째.
챌린지
쉬움완전한 캡슐화를 보여주는 Box 모듈을 만들어 봅시다. 여러분의 상자는 너비(width), 높이(height), 깊이(depth)라는 세 가지 숨겨진 차원을 가지며, 이는 여러분이 제공하는 함수를 통해서만 접근할 수 있습니다. 이것이 바로 실제 동작하는 완전한 불투명 포인터(opaque pointer) 패턴입니다!
여러분은 세 개의 파일을 생성하게 됩니다:
box.h: 공개 인터페이스입니다. 전방 선언(forward declaration)만을 사용하여 불투명한Box타입을 선언하세요. 구조체 본체는 숨겨진 상태로 유지됩니다. 다음 함수들을 선언하세요:create_box— 세 개의 정수(width, height, depth)를 받아 Box 포인터를 반환합니다.destroy_box— 할당된 메모리를 해제합니다.get_volume—const Box *를 받아 부피(width × height × depth)를 반환합니다.set_dimensions— Box 포인터와 세 개의 새로운 차원 값을 받아int를 반환합니다 (성공 시 1, 차원 중 하나라도 음수이거나 0이면 0 반환).
BOX_H심볼을 사용하여 인클루드 가드(include guards)를 사용하세요.box.c: 세 개의 숨겨진 멤버int width,int height,int depth를 가진 실제struct Box를 정의하세요. 네 가지 함수를 모두 구현하세요. 생성자는 상자를 할당하고 초기화해야 합니다.set_dimensions함수는 변경 사항을 적용하기 전에 세 값 모두 양수(0보다 큼)인지 확인해야 합니다. 하나라도 유효성 검사에 실패하면 업데이트 전체를 거부하고 0을 반환하세요.main.c: 상자를 생성하고, 부피를 확인하고, 차원 변경을 시도(유효한 경우와 유효하지 않은 경우 모두)하고, 적절히 정리함으로써 캡슐화된 Box를 시연하세요.
여러분은 다섯 개의 입력을 받게 됩니다: 초기 너비, 초기 높이, 초기 깊이, 그리고 설정을 시도할 세 개의 새로운 차원(유효하지 않은 값이 포함될 수 있음)입니다.
메인 파일에서 초기 차원으로 Box를 생성하고 그 부피를 출력하세요. 그런 다음 새로운 차원 설정을 시도하고, 업데이트 성공 여부와 결과 부피를 출력하세요. 마지막으로 상자를 해제하고 정리를 확인하세요.
출력은 다음 형식으로 하세요:
Volume: {volume}
Set: {0 or 1}
Volume: {volume}
Destroyed예를 들어, 입력이 2, 3, 4, 5, 5, 5인 경우 출력은 다음과 같습니다:
Volume: 24
Set: 1
Volume: 125
Destroyed입력이 2, 3, 4, -1, 5, 5인 경우 출력은 다음과 같습니다:
Volume: 24
Set: 0
Volume: 24
Destroyedset_dimensions의 유효성 검사가 어떻게 상자를 유효하지 않은 상태로부터 보호하는지 확인하세요. 차원이 인터페이스 뒤에 완전히 숨겨져 있기 때문에 외부 코드에서는 여러분의 규칙을 우회할 수 없습니다.
직접 해보기
#include <stdio.h>
#include "box.h"
int main() {
// 초기 크기 읽기
int width, height, depth;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &depth);
// 시도할 새로운 크기 읽기
int new_w, new_h, new_d;
scanf("%d", &new_w);
scanf("%d", &new_h);
scanf("%d", &new_d);
// TODO: 초기 크기로 Box 생성
// TODO: 초기 부피를 "Volume: {volume}" 형식으로 출력
// TODO: 새로운 크기 설정을 시도하고 결과 저장
// TODO: 설정 성공 여부를 "Set: {0 or 1}" 형식으로 출력
// TODO: 결과 부피를 "Volume: {volume}" 형식으로 출력
// TODO: Box를 소멸시키고 "Destroyed" 출력
return 0;
}