Menu
Coddy logo textTech

헬퍼 메서드

Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 10번째.

지금까지 우리는 (player_take_damage와 같이) 구조체 데이터를 수정하는 함수와 단순히 데이터를 표시하는 함수들을 살펴보았습니다. 하지만 또 다른 중요한 범주가 있습니다. 바로 아무것도 변경하지 않고 구조체 멤버로부터 파생된 값을 계산하는 함수들입니다.

너비와 높이를 저장하는 Rectangle 구조체를 생각해 봅시다. 면적은 저장되지 않고 필요할 때 계산됩니다:

typedef struct {
    double width;
    double height;
} Rectangle;

double rectangle_area(const Rectangle *self) {
    return self->width * self->height;
}

double rectangle_perimeter(const Rectangle *self) {
    return 2 * (self->width + self->height);
}

이것들은 헬퍼 메서드(helper methods)입니다. 이 메서드들은 구조체의 기존 데이터를 가져와 새로운 값을 생성합니다. 읽기 작업만 수행하고 쓰기 작업은 하지 않으므로 const 포인터를 사용한다는 점에 유의하세요. 계산된 결과는 구조체에 저장되는 대신 반환됩니다.

Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box));       // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0

이 패턴은 structs를 가볍게 유지해 줍니다. 필수 데이터만 저장하고, 그 외의 모든 것은 필요할 때 계산하십시오. 또한 파생된 값들이 항상 현재 상태와 일치하도록 보장합니다.

challenge icon

챌린지

쉬움

저장된 데이터로부터 파생된 값을 계산하는 Circle 모듈을 만들어 보겠습니다. 구조체 멤버를 수정하지 않고 결과를 계산하는 함수인 헬퍼 메서드(helper methods)를 작성하는 연습을 하게 됩니다.

세 개의 파일을 생성해야 합니다:

  • circle.h: 단일 double radius 멤버를 가진 Circle 구조체를 선언합니다. 또한 두 개의 헬퍼 메서드를 선언합니다:
    • circle_area — Circle에 대한 const 포인터를 받아 면적을 반환합니다.
    • circle_circumference — Circle에 대한 const 포인터를 받아 둘레를 반환합니다.
    CIRCLE_H 심볼을 사용하여 인클루드 가드(include guards)를 적용하세요.
  • circle.c: 두 헬퍼 메서드를 구현합니다. 계산을 위해 파이(pi) 값으로 3.14159를 사용하세요. 면적 공식은 pi * radius * radius이고, 둘레 공식은 2 * pi * radius입니다. 두 함수 모두 반지름(radius)을 읽기만 해야 하며, 절대 수정해서는 안 됩니다.
  • main.c: Circle을 생성하고 헬퍼 메서드를 사용하여 속성을 계산하고 표시합니다.

하나의 입력을 받게 됩니다: 원의 반지름(double 타입).

메인 파일에서 주어진 반지름으로 Circle을 초기화한 다음, 헬퍼 메서드를 사용하여 면적과 둘레를 계산하고 출력하세요.

결과를 다음 형식으로 출력하세요:

Area: {area}
Circumference: {circumference}

두 값 모두 소수점 둘째 자리까지 표시하도록 %.2f를 사용하세요.

예를 들어, 반지름이 5.0인 경우 출력은 다음과 같습니다:

Area: 78.54
Circumference: 31.42

치트 시트

함수는 구조체를 수정하지 않고 구조체 멤버로부터 파생된 값을 계산할 수 있습니다. 이러한 함수들을 헬퍼 메서드(helper methods)라고 부릅니다.

헬퍼 메서드는 데이터를 읽기만 하고 쓰지는 않기 때문에 const 포인터를 사용합니다:

typedef struct {
    double width;
    double height;
} Rectangle;

double rectangle_area(const Rectangle *self) {
    return self->width * self->height;
}

double rectangle_perimeter(const Rectangle *self) {
    return 2 * (self->width + self->height);
}

헬퍼 메서드 사용하기:

Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box));       // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0

이 패턴은 필수 데이터만 저장하고 필요할 때 파생된 값을 계산함으로써 구조체를 가볍게 유지하며, 현재 상태와의 일관성을 보장합니다.

직접 해보기

#include <stdio.h>
#include "circle.h"

int main() {
    double radius;
    scanf("%lf", &radius);
    
    // TODO: 주어진 반지름으로 Circle 구조체 생성
    
    // TODO: circle_area와 circle_circumference 헬퍼 메서드를 사용하여
    // 결과 계산 및 출력
    
    // 출력 형식:
    // printf("Area: %.2f\n", ...);
    // printf("Circumference: %.2f\n", ...);
    
    return 0;
}
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨