스택 초기화
Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 14번째.
모든 객체가 힙(heap)에 위치할 필요는 없습니다. 구조체가 작고 수명이 짧을 때, 이를 스택(stack)에 할당하는 것이 더 간단하고 빠릅니다. malloc도, free도 필요 없으며, 메모리 누수의 위험도 없습니다.
포인터를 반환하는 대신, 팩토리 함수는 구조체를 값으로(by value) 반환할 수 있습니다. 구조체 전체가 호출자에게 복사됩니다:
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);
포인터도, 별도의 정리 작업도 필요 없습니다. origin과 cursor가 범위를 벗어나면 자동으로 소멸됩니다.
이 방식은 동적으로 할당된 멤버가 없는 작은 구조체에 가장 적합합니다. 더 큰 객체나 힙 메모리에 대한 포인터를 포함하는 객체의 경우, malloc을 사용하는 생성자 패턴이 여전히 더 나은 선택입니다.
챌린지
쉬움팩토리 함수를 사용하여 스택에 온도 측정값을 생성하는 Temperature 모듈을 만들어 보겠습니다. 이전 레슨의 힙 기반 생성자와 달리, 이 방식은 구조체를 값으로 반환합니다. malloc이나 free 없이 단순하고 효율적인 스택 할당을 사용합니다.
세 개의 파일을 생성하게 됩니다:
temperature.h: 두 개의 멤버를 가진Temperature구조체를 선언합니다:double celsius와char scale(섭씨를 나타내는 'C'를 저장). 또한 두 개의 함수를 선언합니다:create_temperature— double 값을 받아Temperature구조체를 값으로 반환합니다 (포인터가 아닙니다!).temperature_to_fahrenheit—const Temperature *를 받아 그에 해당하는 화씨 온도를 double로 반환합니다.
TEMPERATURE_H심볼을 사용하여 include guard를 적용하세요.temperature.c: 두 함수를 모두 구현합니다. 팩토리 함수는 지역Temperature변수를 생성하고, 필드를 초기화한 후(scale을'C'로 설정), 이를 반환해야 합니다. 변환 공식은 다음과 같습니다:fahrenheit = celsius * 9.0 / 5.0 + 32.0main.c: 팩토리 함수를 사용하여 온도 측정값을 생성하고 섭씨와 화씨 값을 모두 표시합니다.
하나의 입력을 받게 됩니다: 섭씨 온도 (double 형식).
메인 파일에서 create_temperature를 사용하여 주어진 값으로 Temperature 구조체를 생성하세요. 그런 다음 원래의 섭씨 값과 그에 해당하는 화씨 값을 출력하세요.
출력은 다음 형식을 따르세요:
Celsius: {celsius}
Fahrenheit: {fahrenheit}두 값 모두 소수점 둘째 자리까지 표시하도록 %.2f를 사용하세요.
예를 들어, 입력이 25.0인 경우 출력은 다음과 같습니다:
Celsius: 25.00
Fahrenheit: 77.00이 방식이 얼마나 깔끔한지 확인해 보세요. 메모리 관리 걱정 없이 완전히 초기화된 구조체를 받을 수 있습니다. Temperature 변수가 범위를 벗어나면 자동으로 정리됩니다.
치트 시트
팩토리 함수는 포인터 대신 구조체를 값에 의해(by value) 반환할 수 있습니다. 이는 구조체를 스택에 할당하므로 malloc이나 free가 필요 없으며 메모리 누수도 발생하지 않습니다.
값에 의해 반환하는 팩토리 함수의 예시:
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);
구조체는 호출자에게 복사되며, 범위를 벗어나면 자동으로 소멸됩니다. 이 방식은 동적으로 할당된 멤버가 없는 작은 구조체에 가장 적합합니다.
직접 해보기
#include <stdio.h>
#include "temperature.h"
int main() {
double celsius_input;
scanf("%lf", &celsius_input);
// TODO: create_temperature를 사용하여 Temperature struct를 생성하세요
// TODO: %.2f 형식을 사용하여 Celsius 값을 출력하세요
// TODO: temperature_to_fahrenheit를 사용하여 Fahrenheit 값으로 변환하고 출력하세요
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.