C Academy · 강의

extern과 연결

파일 사이에서 기호를 공유해 보세요.

레슨 3/413개 단계

extern과 연결은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

링키지란 무엇인가요

링키지는 이름을 서로 다른 소스 파일 간에 공유할 수 있는지를 나타냅니다.

외부 링키지가 있는 이름은 프로그램 전체에서 같은 개체를 가리킵니다. 내부 링키지가 있는 이름은 해당 파일에서만 사용할 수 있습니다. 여러 파일로 구성된 프로그램을 이해하려면 링키지를 아는 것이 중요합니다.

변수 공유

두 개의 파일에서 하나의 전역 카운터에 접근해야 한다고 가정해 보겠습니다. 두 파일에 단순히 이를 정의할 수는 없습니다. 그렇게 하면 서로 별개인 변수 두 개가 만들어지고 중복 심볼 링크 오류가 발생합니다.

대신 한 곳에서만 정의하고, 나머지 모든 곳에서는 extern으로 선언합니다.

/* config.c */
int g_count = 0;   /* the one definition */

extern 키워드

extern은 변수를 이곳에 저장 공간을 만들지 않고 프로그램의 다른 곳에 존재한다고 컴파일러에 알립니다.

이는 순수한 선언입니다. 나중에 링커가 이를 다른 파일에 있는 단일 정의와 연결합니다.

/* other.c */
extern int g_count;   /* declared, not defined */

void bump(void) {
    g_count++;
}

헤더에서 선언하기

깔끔한 방식은 extern 선언을 헤더에 넣고, 이에 대응하는 정의를 정확히 하나의 소스 파일에 넣는 것입니다.

그러면 헤더를 포함하는 모든 파일에서 공유 변수를 사용할 수 있습니다.

/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
extern int g_count;
#endif

하나의 정의, 여러 선언

이는 전역 변수에 적용되는 단일 정의 규칙입니다. 변수는 여러 파일에서 extern으로 선언할 수 있지만, 정의는 하나의 파일에서만 할 수 있습니다.

단일 정의(extern이 없는 정의)가 저장 공간을 할당합니다. 모든 extern 선언은 그 저장 공간을 가리킬 뿐입니다.

/* config.h */ extern int g_count;  /* declaration */
/* config.c */ int g_count = 0;     /* definition  */

함수에도 외부 연결이 적용됩니다

함수도 기본적으로 외부 연결을 가지므로, 헤더에 프로토타입을 작성하면 다른 파일에서 해당 함수를 호출할 수 있습니다.

프로토타입 앞에 extern을 작성할 수도 있지만 중복입니다. 달리 지정하지 않는 한 함수는 외부 연결을 가집니다.

/* both forms mean the same */
int add(int a, int b);
extern int add(int a, int b);

static을 사용한 내부 연결

파일 범위에서 static 키워드를 사용하면 이름에 내부 연결이 부여되어 자체 소스 파일 안에서만 보이게 됩니다.

모듈 내부에서만 사용해야 하는 helper와 전역 변수에 사용하십시오. 다른 파일에서는 이를 볼 수도 없고 이름이 충돌할 수도 없습니다.

/* parser.c */
static int line_no = 0;   /* private to parser.c */

static void advance(void) {  /* private helper */
    line_no++;
}

extern과 static 비교

이 두 키워드는 연결의 서로 반대되는 끝에 있습니다.

extern은 외부 연결을 요청하여 이 이름을 여러 파일에서 공유합니다. 파일 범위의 static은 내부 연결을 강제하여 이 이름을 비공개로 유지합니다. 적절한 선택을 통해 모듈이 외부에 제공하는 내용을 제어할 수 있습니다.

extern int shared_total;   /* visible everywhere */
static int local_cache;    /* only this file */

흔한 실수

초보자는 때때로 int g_count;와 같은 일반 정의를 헤더에 넣습니다.

헤더가 여러 파일에 포함되므로 각 파일에 자체 정의가 생기고, 링커는 중복 심볼을 보고합니다. 헤더에서는 항상 extern으로 선언하고, 하나의 .c 파일에서 한 번만 정의하십시오.

/* WRONG in a header included twice */
int g_count;          /* multiple definition */
/* RIGHT */
extern int g_count;   /* declaration only */

전체 구조 살펴보기

이 세 파일 구조가 상태를 공유하는 표준적인 방법입니다.

헤더에서 선언하고, 하나의 소스 파일에서 정의하며, 나머지 파일에서는 헤더를 포함한 뒤 사용합니다. 링커가 모든 참조를 하나의 정의에 연결합니다.

/* config.h */ extern int g_count;
/* config.c */ #include "config.h"
               int g_count = 0;
/* main.c   */ #include "config.h"
               /* uses g_count */

초기화 참고 사항

실제 정의에서만 초기값을 지정해야 합니다. 예를 들면 int g_count = 0;과 같습니다.

extern 선언은 저장 공간을 할당하지 않으므로 초기화해서는 안 됩니다. extern int g_count = 0;처럼 작성하면 정의로 바뀌어 본래 목적에 어긋납니다.

extern int g_count;       /* ok: declaration */
extern int g_count = 0;   /* becomes a definition */

빠른 확인

extern과 연결에 대한 이해도를 확인해 보십시오.

복습

연결이 파일 간 가시성을 제어한다는 것을 배웠습니다. extern은 다른 곳에서 정의된 이름을 선언하고, 파일 범위의 static은 이름을 비공개로 유지합니다.

하나의 정의와 extern 선언을 조합하여 전역 변수를 공유하십시오. 다음에는 이 파일들을 컴파일하고 연결하여 프로그램으로 만들어 보겠습니다.

무료로 시작

AI 튜터와 함께 C을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
39
레슨
144

자주 묻는 질문

“extern과 연결” 강의는 무료인가요?

네 — “extern과 연결” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“extern과 연결”에서 뭘 배우나요?

파일 사이에서 기호를 공유해 보세요. 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“extern과 연결” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 헤더와 소스 파일
  2. 포함 방지 장치
  3. extern과 연결
  4. 여러 파일 컴파일하기
← C Academy(으)로 돌아가기