정적 함수
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 4번째.
코드를 여러 files로 나누면, 소스 파일에 정의된 모든 function은 기본적으로 다른 files에서 볼 수 있습니다. 하지만 때로는 내부적으로만 사용해야 하는 helper functions가 필요합니다. 즉, 다른 files에서 접근하거나 알 수조차 없어야 하는 functions입니다.
static 키워드를 함수에 적용하면 해당 함수의 가시성이 함수가 정의된 파일로 제한됩니다. 이렇게 하면 다른 소스 파일에서 누군가 해당 함수를 Declare하려고 하더라도 호출할 수 없는 비공개 함수가 생성됩니다.
// 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 function을 사용하면 구현 세부 정보를 숨길 수 있으므로, 내부에서 필요한 모든 helper 로직을 사용하면서도 public 인터페이스를 깔끔하게 유지할 수 있습니다.
챌린지
쉬움숫자의 제곱을 계산하기 위해 Private helper function을 사용하는 거리 계산기를 만들어 보겠습니다. 이 세부 구현은 프로그램의 나머지 부분에서 숨겨져 있어야 합니다.
다음 세 개의 파일을 만듭니다.
distance.h: 네 개의 정수(x1, y1, x2, y2)를 takes하여 두 점을 나타내고 integer를 returns하는 단일 Public functiondistance_squared를 Declare하는 헤더 파일입니다.DISTANCE_H기호를 using한 Include guards도 포함합니다.distance.c: 구현을 포함하는 소스 파일입니다. integer를 takes하고 제곱을 returns하는statichelper function calledsquare를 Create합니다. 이 helper는distance.cwithin에서만 visible해야 합니다. 그런 다음 static helper를 using하여 (x2-x1)² + (y2-y1)²를 계산하도록distance_squared를 Implement합니다.main.c: 헤더를 include하고 Public function을 사용하는 main 파일입니다.squarehelper는 여기에서 accessible하면 안 됩니다.distance_squaredonly 사용할 수 있습니다.
distance_squared function은 두 점 사이의 제곱된 유클리드 거리를 계산합니다. square function을 static으로 유지하면 distance.c 외부의 모든 코드에서 이 구현 세부 사항을 숨길 수 있습니다.
네 개의 integer 입력을 받습니다: x1, y1, x2, y2.
제곱된 거리를 다음 형식으로 print합니다.
Squared distance: {result}예를 들어 점 (0, 0)과 (3, 4)가 주어지면 출력은 다음과 같습니다.
Squared distance: 25직접 해보기
#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를 호출하세요
// and print the result in the format: "Squared distance: {result}"
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러