Menu
Coddy logo textTech

스택 초기화

Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 14번째.

모든 객체가 힙에 존재해야 하는 것은 아닙니다. 구조체가 작고 수명이 짧다면 스택에 할당하는 것이 더 간단하고 빠릅니다. malloc도 필요 없고, free도 필요 없으며, 메모리 누수의 위험도 없습니다.

pointer를 반환하는 대신, factory function은 struct를 값으로 반환할 수 있습니다. 전체 struct가 호출자에게 복사됩니다:

typedef struct {
    int x;
    int y;
} Point;

Point create_point(int x, int y) {
    Point p;
    p.x = x;
    p.y = y;
    return p;
}

호출자는 완전히 초기화된 복사본을 받습니다:

Point origin = create_point(0, 0);
Point cursor = create_point(100, 50);
printf("Cursor: (%d, %d)\n", cursor.x, cursor.y);

포인터가 없으므로 정리할 필요도 없습니다. origincursor가 범위를 벗어나면 자동으로 소멸됩니다.

이 접근 방식은 동적으로 할당된 멤버가 없는 작은 구조체에 가장 적합합니다. 더 큰 객체나 힙 메모리에 대한 포인터를 포함하는 객체의 경우에는 malloc을 사용하는 생성자 패턴이 여전히 더 나은 선택입니다.

challenge icon

챌린지

쉬움

Temperature 모듈을 만들어 factory function을 사용하여 스택에 온도 판독값을 생성해 봅시다. 이전 레슨의 힙 기반 생성자와 달리, 이 방식은 struct를 값으로 반환합니다. malloc도, free도 필요 없이 간단하고 효율적인 스택 할당만 사용합니다.

다음 세 파일을 만듭니다:

  • temperature.h: 두 멤버인 double celsiuschar scale(섭씨를 나타내는 'C'를 저장)을 가진 Temperature struct를 선언합니다. 또한 두 function을 선언합니다:
    • create_temperature: double 값을 받아 값으로 Temperature struct를 반환합니다(포인터가 아님!)
    • temperature_to_fahrenheit: const Temperature *를 받아 Fahrenheit 기준의 해당 온도를 double로 반환합니다
    기호 TEMPERATURE_H를 사용하여 include guard를 적용합니다.
  • temperature.c: 두 function을 모두 Implement합니다. factory function은 local Temperature variable을 만들고, 해당 필드를 초기화한 다음(scale'C'로 설정), 이를 반환해야 합니다. 변환 formula는 다음과 같습니다: fahrenheit = celsius * 9.0 / 5.0 + 32.0
  • main.c: factory function을 사용하여 온도 판독값을 만들고 Celsius 및 Fahrenheit 값을 모두 표시합니다.

하나의 input을 받습니다: Celsius 기준 temperature(double).

main 파일에서 create_temperature을 사용하여 주어진 값으로 Temperature struct를 만듭니다. 그런 다음 원래 Celsius 값과 이에 해당하는 Fahrenheit 값을 print합니다.

다음 format으로 출력을 Print합니다:

Celsius: {celsius}
Fahrenheit: {fahrenheit}

두 값 모두에 %.2f를 사용하여 소수점 이하 두 자리까지 표시합니다.

예를 들어 input이 25.0이면 출력은 다음과 같습니다:

Celsius: 25.00
Fahrenheit: 77.00

이 방식이 얼마나 깔끔한지 확인해 보세요. 메모리 관리에 대해 걱정할 필요 없이 완전히 초기화된 struct를 받습니다. Temperature variable이 범위를 벗어나면 자동으로 정리됩니다.

직접 해보기

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

int main() {
    double celsius_input;
    scanf("%lf", &celsius_input);
    
    // TODO: create_temperature를 사용하여 Temperature 구조체를 생성하세요
    
    // TODO: %.2f 형식을 사용하여 섭씨 값을 출력하세요
    
    // TODO: temperature_to_fahrenheit를 사용하여 변환하고 화씨 값을 출력하세요
    
    return 0;
}
quiz icon실력 점검

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

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

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