![]() |
|
||||||||
경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지 |
|
뭔가 이상하군요....
제 경험으로는 static이란 정적이다 개방되지 않았다는 의미로 C언어에서 사용됩니다. 함수안에서 static은 해당 변수가 고정된다는 의미입니다. 함수안에서는 변수가 대부분 다이나믹합니다. 무슨말이니가 하면 함수가 실행될때만 존재하다가 함수의 실행이 없으면 존재하지 않는다는겁니다. 개방되지 않았다는 의미는 메모리를 전역영역과 같은 열려진 공간에 할당하되 사용자가 제한되었다는 이야깁니다. 가령 class내에서 static은 해당 클래스의 멤버만 사용 할수 있거나 해당 클래스와 연관이 있는자만 사용이 가능하다는 것이고.. 파일에서 static은 해당 파일에 정의가 있는 함수만 접근이 가능하다는 이야깁니다. 즉 namespace와 비슷하지요... 함수내에서 static은 함수가 호출하는 함수나 또다른 자신의 인스턴스만 사용이 가능하다는 의미입니다. 따라서 님의 의견에는 좀 불란의 소지가 있군요... 그럼 제가 즐겨 쓰는 static 이네요 ㅋㅋ
전 cpp 안 만들고 h만 만들어서 쓰는 것을 매우 즐깁니다. 컴파일 시간이 엄청나게 단축되고 열어야 하는 파일 갯수도 줄어들고 하니까요. 본문에는 변수에 대한 언급만 있지만 함수에도 됩니다. 그러니까 a.h 에... int add( int a, int b ) { return a+b; } 이런 함수를 선언해 놓고 해당 *.h 파일을 여기저기서 include 해서 사용하면 링크할 때 add 함수가 중복되어 있다고 에러가 뜨는데요. static int add(int a, int b) { return a+b; } 이렇게 해놓으면 중복 에러가 뜨지 않습니다. 단점은 실행 파일 크기가 커진다는 점이예요.
10메가를 1초면 전송할 수 있는 근자의 인터넷 환경에서는 무시해도 될 사항이죠. 그 다음으로는 *.h 안에서 정의한 함수 내용을 수정하면 그 *.h 파일을 인클루드한 모든 모듈을 재컴파일해야 하는 점이 있기도 하지요. 하지만 전체적으로는 그렇게 컴파일 하는게 *.cpp까지 컴파일 하는 것보다 월등히 빠르기 때문에 (*.obj 안 생김) 시간에서는 이득이 있더군요. 사실 컴파일 시간을 뷰티풀하게 줄이려면 STL 안 쓰는게 답이죠. 그리고 제가 말한 것의 핵심은 add 함수를 *.h에 선언,정의하고 *.cpp는 아예 만들지 않는거죠. 헤더파일에 static 으로 선언하였다고 하여, 이를 포함시킨 여러 파일에서 하나의 메모리 영역을 지정하는것은 아닙니다.
가령 b.cpp에서 a.h 에서 포함된 static int a; 에 3을 대입하는 함수를 만들고, a.cpp 에서 static int a 에 대해 5를 세트 한 후 b의 갱신 함수를 부르면, 5가 3으로 갱신되지 않고 5 그대로의 값을 노출하게 됩니다. 즉, 헤더파일에 static으로 선언된 변수 a는, a.cpp모듈과 b.cpp모듈에 독립적으로 존재하게 됩니다. extern과는 완전히 다른 구실을 하죠. 예컨데, 이 지문의 설명은 잘못되었군요. 다른분들도 지적하신듯 하지만. 관련 글 리스트
|
Copyright © 1999-2015, borlandforum.com. All right reserved. |
고맙습니다. 많은 도움이 되었습니다.
그런데 함수를 위의 예와 같이 변수 선언하듯이 하려면 어떻게 해야 하나요?