스택 초기화
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);
포인터가 없으므로 정리할 필요도 없습니다. origin과 cursor가 범위를 벗어나면 자동으로 소멸됩니다.
이 접근 방식은 동적으로 할당된 멤버가 없는 작은 구조체에 가장 적합합니다. 더 큰 객체나 힙 메모리에 대한 포인터를 포함하는 객체의 경우에는 malloc을 사용하는 생성자 패턴이 여전히 더 나은 선택입니다.
챌린지
쉬움Temperature 모듈을 만들어 factory function을 사용하여 스택에 온도 판독값을 생성해 봅시다. 이전 레슨의 힙 기반 생성자와 달리, 이 방식은 struct를 값으로 반환합니다. malloc도, free도 필요 없이 간단하고 효율적인 스택 할당만 사용합니다.
다음 세 파일을 만듭니다:
temperature.h: 두 멤버인double celsius와char scale(섭씨를 나타내는'C'를 저장)을 가진Temperaturestruct를 선언합니다. 또한 두 function을 선언합니다:create_temperature: double 값을 받아 값으로Temperaturestruct를 반환합니다(포인터가 아님!)temperature_to_fahrenheit:const Temperature *를 받아 Fahrenheit 기준의 해당 온도를 double로 반환합니다
TEMPERATURE_H를 사용하여 include guard를 적용합니다.temperature.c: 두 function을 모두 Implement합니다. factory function은 localTemperaturevariable을 만들고, 해당 필드를 초기화한 다음(scale을'C'로 설정), 이를 반환해야 합니다. 변환 formula는 다음과 같습니다:fahrenheit = celsius * 9.0 / 5.0 + 32.0main.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;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러