sw사관학교정글

[week06] 헤더 파일을 사용하는 이유 feat(Private global, static)

D cron 2021. 12. 16. 19:57

malloc 과제를 진행하다가..

/* Private global variables */
static void *extend_heap(size_t words);

라는 주석과 코드를 만났는데, Private이 무슨 뜻인지 궁금해서 구글링 해봤더니 다음과 같은 설명을 찾을 수 있었다.

  • 키워드: 접근 제한, 접근 제어
  • public: 내부, 외부 접근 모두 허용
  • private: 내부접근만 허용

그런데 global은 전역변수로서 모든 함수에서 접근가능하고, private은 내부접근만 허용하는데
그럼 이 두개의 의미가 충돌하는 것이 아닐까?
하는 생각이 들었다.

결론부터 말하자면 그렇지 않다! 왜냐하면 뜻하는 범위가 다르기 때문이다.

이것을 이해하기 위해서는 header file을 사용하는 이유에 대해서 알아야 한다.

헤더 파일을 사용하는 이유

우리가 헤더 파일을 사용하는 이유는 현재 소스파일에서 정의한 함수를 다른 소스파일에서 사용하고 싶기 때문이다.

간단한 예를 들어보자.

// 현재 소스파일은 now.c 라고 가정. 
int add_one(int size){ printf(size+1) }

이 함수를 다른 소스파일에서 참조하고 싶다면 어떻게 해야 할까?

이럴 때 헤더파일을 사용한다.

// 현재 헤더파일은 now.h
extern int add_one(int size);

now.h 라는 헤더파일을 만들어서 그 안에 함수의 원형을 적어주고, 다른 파일에 가서 include 시켜주면 된다.

  • extern은 외부 모듈 어딘가에 함수나 변수가 선언되어 있다고 알려준다.
  • 함수는 변수와 달리 선언 시에 자동으로 extern이 붙는다 → extern을 붙여도, 안붙여도 같은 의미
// 현재 소스파일은 target.c 
#include "now.h" 
add_one(3) 
//4

target.c 라는 새로운 소스파일에서 now.h 헤더파일을 include 시켜주었더니, now.h에 선언되어 있는 함수를 사용할 수 있다!!

static의 의미

헤더파일을 쓰는 이유는 알았으니, 이제 static에 대해 알아보자.

왜 static이라고 선언하였을까?

static void *extend_heap(size_t words);

static은

이 함수는 현재 소스파일에서만 사용할 것이고, 다른 곳에서는 쓰지 않겠습니다!

 

라는 의미다.

그러니까 결국 나의 의문점이었던 Private global이라는 의미는

현재 소스파일 내에서만 사용할 전역변수를 선언한다는 의미였다!