Menu
Coddy logo textTech

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를 사용하는 것입니다.

이 연습은 버그를 조기에 발견합니다. 표시 함수를 작성하다가 실수로 필드를 수정하면, 컴파일러가 버그가 프로그램에 스며들도록 두지 않고 즉시 중단시킵니다.

challenge icon

챌린지

쉬움

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 파일에서 다음을 수행합니다:

  1. initial celsius value로 Temperature를 initialize합니다.
  2. temp_display를 Call하여 시작 온도를 표시합니다.
  3. temp_adjust를 Call하여 adjustment amount만큼 온도를 modify합니다.
  4. temp_display를 again Call하여 업데이트된 온도를 표시합니다.
  5. 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;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C 컴파일러