스택큐힙리스트

C에서 정적 함수와 변수를 사용하는 이유1. 정보 은닉: 정적 함수와 변수는 파일 범위(scope)에만 존재하므로 다른 파일에서 접근할 수 없습니다. 이를 통해 모듈 간의 데이터와 함수를 보호하여.. 본문

카테고리 없음

C에서 정적 함수와 변수를 사용하는 이유1. 정보 은닉: 정적 함수와 변수는 파일 범위(scope)에만 존재하므로 다른 파일에서 접근할 수 없습니다. 이를 통해 모듈 간의 데이터와 함수를 보호하여..

스택큐힙리스트 2023. 11. 17. 10:39
반응형

파일 내 변수의 범위 제한으로서의 static 키워드 사용에 대해 궁금합니다.


제 생각에 C 프로그램을 빌드하는 표준적인 방법은 다음과 같습니다:



  • 여러 개의 c 파일을 가지고 함수와 변수를 정의하되, 필요에 따라 static으로 범위를 제한합니다.

  • 각 c 파일에 해당하는 함수와 필요한 변수를 선언하는 여러 개의 h 파일을 가지며, h 파일을 통해 다른 c 파일에서 사용할 수 있습니다. 비공개 함수와 변수는 h 파일에 공개되지 않습니다.

  • 각 c 파일은 개별적으로 o 파일로 컴파일됩니다.

  • 모든 o 파일은 함께 링크되어 응용 프로그램 파일로 생성됩니다.


h 파일에 변수가 공개되지 않는다면, static으로 전역 변수를 선언하는 두 가지 이유를 보입니다:


  • 하나는 가독성을 위한 것입니다. 변수가 다른 파일에서 액세스되지 않는다는 것을 미래 독자 및 저 자신에게 알려줍니다.

  • 두 번째는 다른 c 파일에서 변수를 extern으로 다시 선언하는 것을 방지하기 위한 것입니다. 링커가 변수가 동시에 externstatic으로 되어있는 것을 싫어할 것 같습니다. (다른 사람의 변수를 파일이 extern으로 다시 선언하는 것은 제가 싫어하는데, 이것은 괜찮은 연습인가요?)


다른 이유는 있나요?


static 함수에도 동일한 이유가 있습니다. 프로토 타입이 h 파일에 공개되지 않으면 다른 파일에서 함수를 사용할 수 없으므로, 왜 static으로 정의해야 하나요?
같은 두 가지 이유만 볼 수 있습니다.

답변 1

다른 독자에게 정보를 전달할 때, 컴파일러 자체를 독자로 생각하세요. 변수가 static으로 선언되면 최적화가 얼마나 진행되는지에 영향을 미칠 수 있습니다.


static 변수를 extern으로 재정의하는 것은 불가능하지만, 컴파일러는 여러분이 자신 스스로 목을 매는 데 충분한 방법을 제공할 것입니다.


하나의 파일에서 static int foo;를 작성하고 다른 파일에서 int foo;를 작성하면, 이들은 다른 변수로 간주됩니다. 이름과 유형이 동일하더라도 컴파일러는 불만을 제기하지 않지만, 코드를 읽거나 디버깅하는 데 혼란스러워할 수 있습니다. (만약 두 번째 경우에 extern int foo;를 작성하면, 다른 곳에 비-정적인 int foo;를 선언하지 않는 한 링크에 실패할 것입니다.)

전역 변수는 헤더 파일에 거의 나타나지 않지만, 나타날 경우 extern으로 선언되어야 합니다. 그렇지 않으면 컴파일러에 따라 해당 헤더를 포함하는 모든 소스 파일이 변수의 자체 복사본을 선언할 수 있으므로, 최선의 경우 링크 실패(중복 정의된 기호)가 발생하며, 최악의 경우 혼동을 초래하는 여러 가지 경우가 발생할 수 있습니다.

답변 2

C 언어에서 정적(static) 함수와 변수를 사용하는 이유
C 언어는 절차적 프로그래밍 언어로 유명하며, 이는 모듈 방식으로 프로그램을 작성할 수 있는 장점을 가지고 있습니다. 프로그래머는 C 언어에서 정적 함수와 변수를 사용하여 특정한 상황에서 프로그램의 효율성을 높일 수 있습니다. 이번 글에서는 C 언어에서 정적 함수와 변수를 사용하는 이유에 대해 자세히 알아보겠습니다.
C 언어에서 정적 함수는 특정 파일에서만 사용되는 함수입니다. 이러한 함수는 다른 파일에서 접근할 수 없으며, 파일 범위 이외에서는 사용되지 않습니다. 정적 함수를 사용함으로써 코드를 모듈화하고 캡슐화할 수 있습니다. 이는 프로그램의 가독성과 유지보수가 더욱 쉬워질 수 있도록 도와줍니다. 또한, 실수로 함수 이름이 충돌하거나 다른 파일에서 잘못된 함수를 호출하는 경우를 방지할 수 있습니다.
정적 변수를 사용하면 해당 변수의 수명이 프로그램의 수명과 일치하도록 할 수 있습니다. 다른 전역 변수와는 달리, 정적 변수는 선언된 함수 내에서만 접근할 수 있습니다. 따라서 다른 함수에 의해 잘못된 값으로 덮어써지는 등의 오류를 방지할 수 있습니다. 또한, 정적 변수는 함수가 호출될 때마다 재생성되지 않으므로, 변수를 선언하는데 필요한 시간과 메모리를 절약할 수 있습니다.
정적 함수와 변수는 프로그래머에게 명시적으로 사용되어야 할 부분을 알려줍니다. 즉, 다른 파일이나 다른 함수에서 직접 접근할 수 없다는 점을 강조합니다. 이는 프로그램의 안전성과 보안성을 높여줍니다. 또한, 정적 함수와 변수는 컴파일러에 의해 최적화될 수 있으므로, 프로그램의 성능 향상에도 도움이 됩니다.
마지막으로, 정적 함수와 변수를 사용함으로써 코드의 가독성을 높일 수 있습니다. 프로그램의 어디서든지 접근할 수 있는 전역 함수와 변수는 코드의 흐름을 추적하기 어렵게 만들 수 있습니다. 반면, 정적 함수와 변수는 코드의 범위를 명확하게 제한하여, 코드 작성자와 다른 개발자들이 코드를 이해하기 쉽게 만들어줍니다.
C 언어에서 정적 함수와 변수의 사용은 프로그램의 효율성과 가독성을 높여줍니다. 이를 통해 프로그램의 유지보수 비용을 낮추고, 결함 발생 가능성을 줄일 수 있습니다. 따라서 C 언어 프로그래머들은 정적 함수와 변수를 적절히 활용하여 효율적이고 안전한 프로그램을 구현할 수 있습니다.

반응형
Comments