티스토리 뷰
외부로 노출되는 것과 그렇지 않은 것이 무엇인가?
답은 간단하다. C/C++에서는 static이 붙지 않은 모든 변수와 함수는 외부로 노출된다. 이 말은 늘 이름공간(Name space)을 더럽힌다라는 말과 같이 나오게되는데, 이 개념은 만병의 근원처럼 초보 프로그래머들에게는 쉽게 드러나지 않는 개념으로 생각된다. 그닥 중요하지 않게 취급될 수도 있고, 다른 말로도 설명이 되기 때문이다.
이름공간이라는 것이 무엇인가? 무엇에 대한 이름공간인가? 말 그대로 생각해보면, 이름이 놓여지는 공간을 말하고, 이름이란 서로 다른 두 개를 구별하기 위해 사용되는 일종의 약속이다.
모듈화 프로그램이라는 것은 하나의 프로그램을 수행하기 위해 여러 단위로 나누어 각각을 부분 컴파일한 뒤 링크할 때, 필요로 하는 모듈과 제공하는 모듈을 이어놓는 작업을 기반으로 하는 프로그램 방식을 말한다. 또는 각 실행 모듈 단위가 실행되면서 바로 필요한 모듈과 제공하는 모듈이 메모리 상에서 이어지는 개념을 말한다. 전자를 정적 링크 후자를 동적 링크라고 할 수 있는데, 이 때 중요한 것은 과연 그 연결이 어떻게 이루어지느냐이다.
그 연결 고리는 영문, 숫자 및 기호로 된 이름으로 또는 몇번째 엔트리인지 숫자로 나타내어진다. 영문, 숫자 및 기호라는 것은 기반을 함수나 변수 명으로 하되 컴파일러에 의해 프로그래머가 선택한 이름에 장식을 더하는 형태로 되어 있고, 그 이름이 유일한 키가 되어 파일 혹은 메모리상의 위치를 참조하는 방식이며, 숫자로 되어 있는 것은 함수 배열로 되어 있는 것에 몇번째 함수라는 방식으로 참조가 이루어진다. 주로 C++의 virtual 계열 함수가 그런 방식으로 구현된다.
이때 중요한 것은 사용자가 외부에서 사용될 함수는 이러이러하다 라고 지정해 놓은 것들은 (혹은 이러이러한 함수는 내부에서만 사용한다라고 지정한 것 외의 것들은) 링커에 의해 모두 관리가 되는데, 이들은 명백히 외부에서 사용할 수 있다고 되어 있으므로 유일성이 보장되어야 충돌이 일어나지 않는다. 따라서, 개발자들에게 요구되는 습관 중의 하나는 명백히 외부에서 사용할 용도로 개발하지 않은 것들은 앞에 static을 붙이는 것이다.
그리고, 외부로 드러나 있는 것들은 테스트 대상이 된다. 테스트 대상이라고 하여 너무 강박관념으로 대하여 모두 테스트를 해야하는 것은 아니다. 그것에 대한 기준은 외부 로직 최전방에 있는 것들 위주로 요구사항을 만족하는 테스트가 필요한 것들에 대해서만 그러하다.
만든 프로그램들을 유닉스 상의 nm이라는 툴이나 Windows상의 dumpbin 이라는 툴을 이용하면 어떤 것이 extern인지 아닌지를 알 수 있으니 참고하기 바란다.
답은 간단하다. C/C++에서는 static이 붙지 않은 모든 변수와 함수는 외부로 노출된다. 이 말은 늘 이름공간(Name space)을 더럽힌다라는 말과 같이 나오게되는데, 이 개념은 만병의 근원처럼 초보 프로그래머들에게는 쉽게 드러나지 않는 개념으로 생각된다. 그닥 중요하지 않게 취급될 수도 있고, 다른 말로도 설명이 되기 때문이다.
이름공간이라는 것이 무엇인가? 무엇에 대한 이름공간인가? 말 그대로 생각해보면, 이름이 놓여지는 공간을 말하고, 이름이란 서로 다른 두 개를 구별하기 위해 사용되는 일종의 약속이다.
모듈화 프로그램이라는 것은 하나의 프로그램을 수행하기 위해 여러 단위로 나누어 각각을 부분 컴파일한 뒤 링크할 때, 필요로 하는 모듈과 제공하는 모듈을 이어놓는 작업을 기반으로 하는 프로그램 방식을 말한다. 또는 각 실행 모듈 단위가 실행되면서 바로 필요한 모듈과 제공하는 모듈이 메모리 상에서 이어지는 개념을 말한다. 전자를 정적 링크 후자를 동적 링크라고 할 수 있는데, 이 때 중요한 것은 과연 그 연결이 어떻게 이루어지느냐이다.
그 연결 고리는 영문, 숫자 및 기호로 된 이름으로 또는 몇번째 엔트리인지 숫자로 나타내어진다. 영문, 숫자 및 기호라는 것은 기반을 함수나 변수 명으로 하되 컴파일러에 의해 프로그래머가 선택한 이름에 장식을 더하는 형태로 되어 있고, 그 이름이 유일한 키가 되어 파일 혹은 메모리상의 위치를 참조하는 방식이며, 숫자로 되어 있는 것은 함수 배열로 되어 있는 것에 몇번째 함수라는 방식으로 참조가 이루어진다. 주로 C++의 virtual 계열 함수가 그런 방식으로 구현된다.
이때 중요한 것은 사용자가 외부에서 사용될 함수는 이러이러하다 라고 지정해 놓은 것들은 (혹은 이러이러한 함수는 내부에서만 사용한다라고 지정한 것 외의 것들은) 링커에 의해 모두 관리가 되는데, 이들은 명백히 외부에서 사용할 수 있다고 되어 있으므로 유일성이 보장되어야 충돌이 일어나지 않는다. 따라서, 개발자들에게 요구되는 습관 중의 하나는 명백히 외부에서 사용할 용도로 개발하지 않은 것들은 앞에 static을 붙이는 것이다.
그리고, 외부로 드러나 있는 것들은 테스트 대상이 된다. 테스트 대상이라고 하여 너무 강박관념으로 대하여 모두 테스트를 해야하는 것은 아니다. 그것에 대한 기준은 외부 로직 최전방에 있는 것들 위주로 요구사항을 만족하는 테스트가 필요한 것들에 대해서만 그러하다.
만든 프로그램들을 유닉스 상의 nm이라는 툴이나 Windows상의 dumpbin 이라는 툴을 이용하면 어떤 것이 extern인지 아닌지를 알 수 있으니 참고하기 바란다.
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 벤자민
- 클레로덴드럼
- 구근
- tattertools
- Subversion
- JavaScript
- OpenID
- BlogAPI
- macosx
- 디버깅
- 킹벤자민
- perl
- 덴드롱
- 오픈소스
- Linux
- SSO
- 퀴즈
- ssh
- TCP/IP
- url
- 커피
- nodejs
- 대화
- MySQL
- Tattertools plugin
- writely
- SVN
- VIM
- 수선화
- 식물
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함