C언어 학습 노트 : 10. 함수 이론#

1. 기본 용어#

  • Caller (호출자) : 다른 함수를 호출하는 함수.
  • Callee (피호출자) : 호출되는 함수.
  • 파라미터(매개변수) : 호출자와 피호출자 사이에서 데이터를 전달하는 매개체.
  • 임시 결과 : 별도의 저장 공간에 보관하지 않으면 사라지는 계산 결과 값. 즉시 사용하지 않으면 소멸한다.
  • 반환 자료형 : 함수가 반환하는 결과 값의 형식.

2. 프로그램의 시작점#

  • C 프로그램의 진입점(entry point)은 항상 main() 함수이다.
  • 운영체제 및 런타임 환경이 초기화를 수행한 뒤 main() 함수를 호출한다.
  • main()에서 다른 함수를 호출함으로써 프로그램이 전개된다.

3. 함수 설계 원칙#

(1) 무엇을 함수로 만들어야 하는가?#

  • UI와 기능을 분리할 것. (관심사의 분리 원칙)
  • 하나의 단위 기능으로 규정할 수 있는 대상은 함수로 만들 것.
  • 불연속적으로 반복되는 코드, 재사용 가능성이 높은 코드를 함수로 분리할 것.

(2) 코드 분할 시 고려할 요소#

  • 함수 이름은 수행 기능을 직관적으로 알 수 있어야 한다.
  • 피호출 함수에 반드시 전달해야 할 정보는 매개변수(parameter) 로 확정한다.
  • 호출자가 반드시 받아야 하는 정보는 반환 자료형(return type) 으로 확정한다.

4. DRY 원칙 (Don’t Repeat Yourself)#

  • 같은 기능을 수행하는 코드를 여러 곳에 중복해서 두지 않는다.
  • 중복 코드를 함수로 추출하여 재사용하면 유지보수성과 확장성이 향상된다.

5. 함수 원형 선언과 컴파일#

(1) 함수 원형 (Function Prototype)#

  • 함수의 시그니처(signature)를 의미한다.
  • 원형 선언은 컴파일러에게 함수의 존재와 인터페이스(반환형, 매개변수)를 알리는 역할을 한다.
  • 보통 코드 상단이나 헤더 파일에 작성한다.

(2) 분할 컴파일#

  • 코드가 여러 파일로 나뉘어 있을 경우, 각 파일을 별도로 컴파일한 뒤 링커(linker)가 이를 결합하여 실행 파일을 생성한다.
  • 원형 선언이 없으면 컴파일러는 함수를 알 수 없어 오류를 발생시킨다.

(3) 헤더 파일#

  • 여러 함수 원형 선언을 모아 둔 파일이다.
  • #include를 통해 다른 소스 파일에서 공유한다.
  • 코드 재사용성과 유지보수성을 높인다.

6. 변수와 저장 영역#

(1) 전역 변수 (Global Variable)#

  • 모든 함수에서 접근 가능한 변수.
  • 정적 영역(static storage) 에 저장된다.
  • 가급적 사용하지 않는 것이 바람직하다.
  • 식별을 위해 이름 앞에 g_ 접두사를 붙이는 것이 일반적이다.

(2) 지역 변수 (Local Variable)#

  • 특정 함수 블록 내에서 선언되어 해당 블록에서만 유효하다.
  • 스택(stack) 영역에 저장된다.
  • 블록이 끝나면 자동으로 소멸되므로 자동 변수(auto variable) 라고도 부른다.

7. 외부 참조 (extern)#

  • 다른 소스 파일에 정의된 변수나 함수를 사용하기 위해 extern 키워드를 붙인다.
  • externexternal linkage를 명시하며, 링커가 다른 파일의 정의를 연결한다.
// file1.c
int g_value = 10;

// file2.c
extern int g_value;  
printf("%d\n", g_value); // 다른 파일에 정의된 변수 사용

학습 포인트 정리#

  • Caller / Callee 개념은 함수 호출 관계를 명확히 구분한다.
  • 함수는 매개변수(입력) → 처리 → 반환 값(출력) 구조를 가진다.
  • main()은 프로그램의 진입점이며, 운영체제에 의해 호출된다.
  • 함수 설계는 UI와 기능 분리, 단일 기능 분리, DRY 원칙을 따라야 한다.
  • 원형 선언과 헤더 파일은 분할 컴파일과 코드 관리에 필수적이다.
  • 전역 변수는 정적 영역에, 지역 변수는 스택 영역에 저장된다.
  • extern을 통해 외부 파일의 정의를 가져올 수 있다.