Const 정확성
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 8번째.
메서드로 동작하는 함수를 작성할 때는 일부 함수는 객체를 수정해야 하고(예: player_take_damage), 다른 함수는 아무것도 변경하지 않고 데이터만 읽어야 합니다. const 키워드를 사용하면 컴파일러 수준에서 이러한 구분을 적용할 수 있습니다.
포인터 매개변수를 const로 표시하면, 함수가 해당 포인터가 가리키는 데이터를 수정하지 않을 것이라고 약속하는 것입니다. 실수로 member를 변경하려고 하면 컴파일러가 오류를 발생시킵니다:
typedef struct {
int x;
int y;
} Point;
// 이 함수는 점을 읽기만 할 수 있습니다
void point_print(const Point *self) {
printf("(%d, %d)\n", self->x, self->y);
// self->x = 10; // ERROR: const 포인터를 통해 수정할 수 없음
}
// 이 함수는 점을 수정할 수 있습니다
void point_move(Point *self, int dx, int dy) {
self->x += dx;
self->y += dy;
}
const Point *self 매개변수는 point_print가 "getter" 또는 읽기 전용 연산임을 컴파일러와 다른 프로그래머 모두에게 알립니다. 이를 const 정확성이라고 합니다. 즉, 수정이 필요하지 않은 모든 곳에서 const를 사용하는 것입니다.
이 연습은 버그를 조기에 발견합니다. 표시 함수를 작성하다가 실수로 필드를 수정하면, 컴파일러가 버그가 프로그램에 스며들도록 두지 않고 즉시 중단시킵니다.
챌린지
쉬움Temperature 모듈을 만들어 온도 값을 저장하고 읽기 전용 및 modify 작업을 모두 제공해 봅시다. 이를 통해 데이터를 단순히 읽기만 하는 함수와 데이터를 변경하는 함수를 명확히 구분하기 위해 const 포인터를 사용하는 방법을 연습할 수 있습니다.
세 개의 파일을 만들 것입니다:
temperature.h: 하나의double celsius멤버를 가진Temperature구조체를 Declare합니다. 또한 다음 세 함수를 Declare합니다:temp_display: Temperature를 가리키는const포인터를 받아 현재 온도를 Print합니다(읽기 전용).temp_adjust: Temperature를 가리키는 일반 포인터와 double amount를 받아 amount를 celsius에 더합니다(modify).temp_to_fahrenheit: Temperature를 가리키는const포인터를 받아 Fahrenheit로 conversion된 값을 반환합니다(읽기 전용).
TEMPERATURE_H심볼을 사용해 include guards를 사용합니다.temperature.c: 세 함수를 모두 Implement합니다.temp_display함수는Current: {celsius}C형식으로 Print해야 합니다.temp_to_fahrenheit함수는celsius * 9.0 / 5.0 + 32.0을 반환해야 합니다.const포인터를 사용하는 함수는 구조체의 data를 modify할 수 없다는 점을 기억하세요.main.c: Temperature를 Create하고, 작업을 수행한 다음 결과를 표시합니다.
두 개의 입력을 받습니다. 첫 번째는 initial celsius value(double)이고, 두 번째는 adjustment amount(double)입니다.
main 파일에서 다음을 수행합니다:
- initial celsius value로
Temperature를 initialize합니다. temp_display를 Call하여 시작 온도를 표시합니다.temp_adjust를 Call하여 adjustment amount만큼 온도를 modify합니다.temp_display를 again Call하여 업데이트된 온도를 표시합니다.temp_to_fahrenheit를 사용해 Fahrenheit conversion을 Print합니다.
다음 형식으로 결과를 Print합니다:
Current: {celsius}C
Current: {celsius}C
Fahrenheit: {fahrenheit}F모든 온도 값에 %.1f를 사용하여 소수점 이하 한 자리로 표시합니다.
예를 들어 initial value가 20.0이고 adjustment가 5.0이면 출력은 다음과 같습니다:
Current: 20.0C
Current: 25.0C
Fahrenheit: 77.0F직접 해보기
#include <stdio.h>
#include "temperature.h"
int main() {
double initial_celsius, adjustment;
scanf("%lf", &initial_celsius);
scanf("%lf", &adjustment);
// TODO: Temperature 구조체를 생성하고 initial_celsius로 초기화하세요
// TODO: temp_display를 호출하여 시작 온도를 표시하세요
// TODO: temp_adjust를 호출하여 adjustment 양만큼 온도를 수정하세요
// TODO: temp_display를 다시 호출하여 업데이트된 온도를 표시하세요
// TODO: temp_to_fahrenheit를 사용하여 화씨 변환을 출력하세요
// 형식: "Fahrenheit: %.1fF\n"
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러