정적 함수
Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 4번째.
코드를 여러 파일로 분할할 때, 소스 파일에 정의된 모든 함수는 기본적으로 다른 파일에서 볼 수 있습니다. 하지만 때로는 내부적으로만 사용해야 하는 헬퍼 함수, 즉 다른 파일에서 액세스하거나 알 필요조차 없는 함수가 필요할 때가 있습니다.
static 키워드는 함수에 적용될 때, 해당 함수가 정의된 파일로 가시성을 제한합니다. 이는 다른 소스 파일에서 선언하려고 시도하더라도 호출할 수 없는 private 함수를 만듭니다.
// math_utils.c
#include "math_utils.h"
// 프라이빗 헬퍼 - 이 파일 내에서만 접근 가능
static int square(int x) {
return x * x;
}
// 퍼블릭 함수 - main.c에서 호출할 수 있음
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
이 예제에서 sum_of_squares는 헤더에 선언되어 어디에서나 사용할 수 있습니다. 하지만 square는 static으로 표시되어 math_utils.c 내에서만 존재합니다. 만약 main.c가 square()를 직접 호출하려고 하면, 링커는 오류를 발생시킵니다. 즉, 해당 함수는 파일 외부에서는 존재하지 않습니다.
이것은 파일 수준에서 캡슐화를 달성하는 C의 방식입니다. static 함수를 사용하면 구현 세부 사항을 숨길 수 있어, 내부적으로 필요한 도우미 로직을 사용하면서도 공개 인터페이스를 깔끔하게 유지할 수 있습니다.
챌린지
쉬움숫자의 제곱을 계산하는 비공개 헬퍼 함수를 사용하여 거리 계산기를 만들어 보겠습니다. 이 헬퍼 함수는 프로그램의 나머지 부분에서 숨겨져야 하는 세부 구현 사항입니다.
세 개의 파일을 생성하게 됩니다:
distance.h: 두 점을 나타내는 네 개의 정수(x1, y1, x2, y2)를 받아 정수를 반환하는 단일 공개 함수distance_squared를 선언하는 헤더 파일입니다.DISTANCE_H심볼을 사용하여 인클루드 가드(include guards)를 포함하세요.distance.c: 구현이 포함된 소스 파일입니다. 정수를 받아 그 제곱을 반환하는static헬퍼 함수square를 만드세요. 이 헬퍼 함수는distance.c내에서만 보여야 합니다. 그런 다음 이 static 헬퍼를 사용하여 (x2-x1)² + (y2-y1)²을 계산하는distance_squared를 구현하세요.main.c: 헤더를 포함하고 공개 함수를 사용하는 메인 파일입니다.square헬퍼 함수는 여기서 접근할 수 없어야 하며,distance_squared만 사용할 수 있어야 합니다.
distance_squared 함수는 두 점 사이의 유클리드 거리의 제곱을 계산합니다. square 함수를 static으로 유지함으로써, distance.c 외부의 코드로부터 이 구현 세부 사항을 숨길 수 있습니다.
네 개의 정수 입력 x1, y1, x2, y2를 받게 됩니다.
다음 형식으로 제곱된 거리를 출력하세요:
Squared distance: {result}예를 들어, 점 (0, 0)과 (3, 4)가 주어지면 출력은 다음과 같습니다:
Squared distance: 25치트 시트
static 키워드는 함수의 가시성을 해당 함수가 정의된 파일로 제한하여, 다른 소스 파일에서는 호출할 수 없는 프라이빗 함수를 생성합니다.
// 프라이빗 헬퍼 - 이 파일에서만 보임
static int square(int x) {
return x * x;
}
// 퍼블릭 함수 - 다른 파일에서 호출 가능
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
정적 함수는 파일 수준의 캡슐화를 제공하여, 퍼블릭 인터페이스를 깔끔하게 유지하면서 구현 세부 사항을 숨길 수 있게 해줍니다.
직접 해보기
#include <stdio.h>
#include "distance.h"
int main() {
int x1, y1, x2, y2;
scanf("%d", &x1);
scanf("%d", &y1);
scanf("%d", &x2);
scanf("%d", &y2);
// TODO: 입력 좌표로 distance_squared를 호출하세요
// 그리고 결과를 "Squared distance: {result}" 형식으로 출력하세요
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.