Team Curio

비주얼 노벨 한국어 패치 팀 큐리오

프로그래밍

15.c 언어강좌 (12)

연이v 2009. 7. 10. 20:53
반응형
SMALL

=================================================================
C 프로그래밍 12회
=================================================================

이번 강좌 에서는 외부 프로그램과 연결하는 방법, 그리고 라이브러리에 대해 알 아보도록 하겠습니다.

1. 외부 프로그램?
만약 a.c라는 소스 파일과 b.c라는 소스 파일이 있다고 합시다.
이때 a.c에서 볼때는 b.c가 외부 프로그램이 되고
b.c에서 볼때는 a.c가 외부 프로 그램이 되는 것 입니다.
즉 외부프로그램이란 자신과 다른 소스 파일을 말하는 것이죠.

2. 외부 프로그램과 연결?
외부 프로그램에 있는 변수나 함수를 사용할수 있을까요?
C에서는 외부 프로그램에 있는 변수나 함수를 사용할수가 있습니다.
단 지역 변수의 경우 사용할수 없습니다.
그럼 외부 프로그램에 있는 변수, 함수를 사용하려면 어떻게 하면 될까요?
방법은 무지무지 간단한데, 각각의 소스 파일을 컴파일 한 후 링크시에
같이 링크를 해 주기만 하면 됨니다.

(1) 외부 프로그램에의 변수 사용
다음과 같은 프로그램이 있다고 합시다.

/* 파일 이름 : C12-1.C 프로그램 내용 : 외부 프로그램 연결 예제. */
int variable;
이 프로그램에는 variable라는 전역변수 한개가 정의되어 있습니다.
그럼 이 프로그램의 variable라는 전역변수를 외부 프로그램에서 사용하려면 어떻 게 해야 할까요?

/* 파일 이름 : C12-2.C 프로그램 내용 : 외부 프로그램 연결 예제. */
#include void main()
{
variable=3;
printf("Variable : %d\n",variable);
}

이렇게 그냥 사용하고 링크시에 C12-1.C와 같이 링크만 해 주면 될까요?
이렇게 하면 당연히 않되죠.
이유는 C12-2.C에는 variable라는 변수가 선언되어 있지 않기 때문에 컴파일시 에러가 나게 됨니다.
그럼 어떻게 하면 될까요?
variable라는 변수를 C12-2.C에도 선언하면 될까요?
그렇게 하면 링크시에 variable라는 이름의 전역 변수가 2개가 있다고 하며 에러가 나게 됨니다.
그럼 정말 어떻게 할까요?
이때는 variable라는 변수를 사용하는 곳
즉 C12-2.C 에 이 변수가 외부 프로그램에 있음을 알려주면 됨니다.
저번 전역 변수를 배울때 변수를 선언한 곳이 그 변수를 사용하는 곳보다 아래에 있으면
사용하는 곳 위에다가 그 변수가 있다는 것을 알려주어야 한다고 했는데,
이때와 똑같은 방법으로 변수가 있다는 것을 알려주면 됨니다.
그러니까..
extern 데이터형태 변수명;
이렇게 해 주면 되죠.
위의 소스를 제대로 고쳐서 C12-3.C를 만들면 다음과 같습니다.

/* 파일 이름 : C12-3.C 프로그램 내용 : 외부 프로그램 연결 예제. */
#include extern
int variable;
void main()
{
variable=3;
printf("Variable : %d\n",variable);
}

이렇게 해 주고 C12-1.C와 같이 링크를 해 주면 C12-1.C의 variable라는 변수를 사용하게 되는 것이죠.

(2) 외부 프로그램의 함수 사용
외부 프로그램의 함수를 사용하는 것은 변수 사용보다 훨씬 쉽습니다.
예를 들어 다음과 같은 소스가 있다고 합시다.

/* 파일 이름 : C12-4.C 프로그램 내용 : 외부 프로그램 연결 예제. */
#include void message()
{
printf("Example program.");
}

이 소스에는 message라는 함수가 있는데, 이 함수를 외부에서 사용하려면
다음 과 같이 그냥 사용하고 링크시에 같이 링크만 해 주면 됨니다.

/* 파일 이름 : C12-5.C 프로그램 내용 : 외부 프로그램 연결 예제. */
void main()
{
message();
}

그런데 이렇게 그냥 사용하면 에러를 방지할수 없으므로 프로토타입을 선언해 주 는 것이 좋습니다.
즉 다음과 같이 하면 더 좋다는 것이죠.

/* 파일 이름 : C12-6.C 프로그램 내용 : 외부 프로그램 연결 예제. */
void message();
void main()
{
message();
}

이렇게 하고 나서 아까 C12-4.C와 같이 링크를 해 주면
C12-4.C의 message함수 를 사용하게 되는 것 입니다.

(3) 외부 프로그램에서 사용 못하게 할수는 없나?
외부 프로그램에서 자신의 변수와 함수를 사용하지 못하게 해야 할 경우가 있습니다.
이럴땐 어떻게 하면 될까요?
언젠가 정적 전역 변수라는 것을 배운적이 있습니다.
그때 정적 전역 변수는 정적 지역 변수와는 달리
외부에서 엑세스 하지 못하게 하는 것이 목적이라고 했었습니다.
이걸 기억하신다면 외부 프로그램에서 자신의 변수를 사용 못하게 하는 방법은
이미 알아차리셨을 겁니다.
방법은 정적 전역 변수로 선언해 주면 되는 것이죠.
정적 전역 변수를 선언하는 방법은 이미 배웠지만 다시 한번 설명해 드리죠.
아주 간단한데, 그냥 변수 선언과 똑같지만 앞에 static키워드를 붙여 주기만 하면 됨니다.
예를 들어 아까 처음 나왔던 C12-1.C는

/* 파일 이름 : C12-7.C 프로그램 내용 : 외부 프로그램 연결 예제. */
static int variable;

이렇게 해 주면 이 소스의 variable라는 변수는 외부에서 사용할수 없게 됨니다.
그럼 함수는 외부에서 사용하지 못하게 하려면 어떻게 하면 될까요?
함수 역시 정적 함수라는 것으로 만들어 주면 됨니다.
방법은 정적 변수처럼 단지 앞에 static키워드만 붙여 주면 되죠.
예를 들어 아까 C12-4.C는

/* 파일 이름 : C12-8.C 프로그램 내용 : 외부 프로그램 연결 예제. */
#include static void message()
{
printf("Example program.");
}

이렇게 고쳐주면 됨니다.
이렇게 하면 외부 프로그램에서 이 함수를 사용할수 없 게 됨니다.

3. 라이브러리
라이브러리에 대해서는 2회때 간략히 말씀드린 바가 있습니다.
그때 라이브러리는 한개 이상의 목적 파일을 합쳐 둔 것이라고 했죠.
그럼 그 라이브러리에 대해 더욱 자세히 알아보죠.

(1) 라이브러리를 왜 쓸까요?
위에서 외부 프로그램의 변수와 함수를 사용하는 방법을 배웠습니다.
그런데 그걸 어디에 써먹을까요?
여러분이 자주 쓰는 유용한 함수들을 만들어 두 고 컴파일해 목적 파일로 만들어 둔 후
사용할때마다 같이 링크를 시켜주면 되겠죠?
이때 그 유용한 함수들이 들어있는 소스 파일에 10개의 함수가 들어 있다고 합시다.
그런데 이 함수 중에서 1개의 함수가 필요해서 이 목적 파일을 같이 링크 시켰다면 비록 1개의
함수만을 쓴다고 해도 이 목적 파일에는 10개의 함수가 들어 있으므로 모든 함수의 내용이
실행파일에 들어가 실행파일의 크기만 커지게 됨니다.
그럼 이걸 해결하려면 어떻게 할까요?
각각의 함수별로 소스 파일을 분할해 10개의 소스 파일을 만들어 컴파일해 목적 파일을 만들어 두면
되겠죠?
그리고 사용 할땐 필요한 함수가 들어있는 목적 파일만 같이 링크 시키면 되고요.
하지만 10 개의 함수를 모두 사용한다고 생각해 보세요.
그러면 10개의 목적 파일을 같이 링크시켜야 하므로 정말 귀찮겠죠?
이럴때 라이브러리를 사용하면 됨니다.
10개의 목적 파일을 묶어서 라이브러리 파일로 만들어 두고, 사용할땐 단지
이 라이브러리 파일만 같이 링크 시켜 주면 링커가 필요한 함수가 들어있는 목적파일만
라이브러리에서 찾아 끄집어 내서 같이 링크 시켜 주게 됨니다.
이렇게 라이브러리를 사용하면 정말 편리하게 되죠.
반응형

'프로그래밍' 카테고리의 다른 글

17.C언어-WinAPI-DirectX-C++-STL-Socket-MFC-Direct3D또는OpenGL  (0) 2009.07.10
16.DirectX 개론  (0) 2009.07.10
14.c 언어강좌 (11)  (0) 2009.07.10
13.c 언어강좌 (10)  (0) 2009.07.10
12.c 언어강좌 (9)  (0) 2009.07.10