스택큐힙리스트

정적 상수 대 외부 상수 본문

카테고리 없음

정적 상수 대 외부 상수

스택큐힙리스트 2023. 11. 20. 15:26
반응형

저는 헤더 파일에서 정적 상수(static const)를 다음과 같이 사용해왔습니다:


static NSString * const myString = @foo;

하지만 이것이 '안전'하거나 올바른 방법인 것이 아니라고 알고 있습니다. 다른 클래스에서 상수 문자열에 접근하려면 .h에서 문자열을 다음과 같이 선언해야 한다고 읽었습니다:


extern NSString * const myString;

그런 다음 .m 파일에서 다음과 같이 작성합니다:


NSString * const myString = @foo;

이것이 옳은 방법인가요? 만약 그렇다면, 왜 .h 파일에서 바로 정적 상수로 선언하지 않는 것인가요? 제 경우에는 완벽하게 작동하며, 이에 관련해 어떤 '안전' 문제도 보이지 않습니다. 이것은 상수이므로 외부에서 변경될 수 없고, 클래스 외부에서 액세스하는 것이 의도된 기능입니다. 유일한 다른 것은 문자열의 값을 숨기기 위한 것이라고 생각할 수 있습니다.

답변 1

첫 번째 변형


static NSString * const myString = @foo; // 여러 .m 소스 파일에서 포함된 .h 파일 내에 있음

는 헤더 파일을 포함하는 각각의 번역 단위 (대략적으로 .m 소스 파일)별로 로컬로 myString 변수를 정의합니다.
모든 문자열 객체는 foo라는 동일한 내용을 가지고 있지만, 다른 객체일 수도 있으므로 myString (문자열 객체를 가리키는 포인터)의 값은 각각의 단위마다 다를 수 있습니다.


두 번째 변형


extern NSString * const myString; // 여러 .m 소스 파일에서 포함된 .h 파일 내에 있음
NSString * const myString = @foo; // 한 개의 .m 파일에서만 존재

전역적으로 볼 수 있는 하나의 변수 myString을 정의합니다.

예제: 한 클래스에서 myString을 사용자 객체로 하는 알림을 보냅니다.
다른 클래스에서는 이 알림을 받아 사용자 객체를 myString과 비교합니다.


첫 번째 변형에서는, isEqualToString:을 사용하여 비교를 수행해야 합니다.
왜냐하면 전송 및 수신 클래스가 서로 다른 포인터를 가질 수 있기 때문에 (NSString 객체를 가리킵니다).
따라서 ==로 비교하는 경우 실패할 수 있습니다.


두 번째 변형에서는, 하나의 myString 변수만 있으므로 ==로 비교할 수 있습니다.


따라서 두 번째 변형은 공유 문자열이 각 번역 단위에서 동일한 객체임을 고려하면 더 안전합니다.

답변 2

정적 상수 vs 외부 상수 (Static const vs extern const)
정적 상수와 외부 상수는 프로그래밍 언어에서 사용되는 개념으로, 변수 값을 일정하게 유지하기 위해 사용됩니다. 이번 글에서는 정적 상수와 외부 상수의 차이점과 각각의 사용 사례에 대해 알아보겠습니다.
정적 상수란, 프로그램 내에서 변하지 않는 값을 나타내기 위해 사용되는 변수입니다. 이러한 변수는 선언 시에 초기 값을 할당하며, 이후에는 변경할 수 없습니다. 이는 프로그램 실행 중에 값이 변하지 않는 경우 유용하게 사용됩니다. 예를 들어, 수학적인 상수나 특정한 값이 여러 번 사용되는 경우에는 정적 상수를 활용할 수 있습니다. 정적 상수는 해당 파일 내에서만 볼 수 있으며, 파일 외부에서의 접근은 제한됩니다.
반면 외부 상수는 다른 파일에서 선언된 변수로, 해당 파일 내부 외에도 다른 파일에서 접근할 수 있습니다. 이러한 변수는 선언 시에 extern 예약어를 사용하여 외부 변수임을 명시합니다. 외부 상수의 값을 사용하기 위해서는 먼저 외부 변수가 선언된 파일을 포함해야 합니다. 이런 특성은 여러 파일 간의 값 공유를 가능하게 합니다.
정적 상수와 외부 상수는 각자의 장단점을 가지고 있습니다. 정적 상수는 해당 파일 내에서만 유효하기 때문에, 높은 은닉성을 가지고 있습니다. 즉, 다른 파일에서 해당 상수에 직접 접근할 수 없어 코드의 안정성을 높일 수 있습니다. 또한, 정적 상수는 선언된 파일 내에서만 값을 변경할 수 있기 때문에, 의도하지 않은 값 변경을 방지할 수 있습니다.
반면 외부 상수는 여러 파일 간의 값 공유를 가능하게 하기 때문에, 프로그램의 모듈화와 재사용성을 높일 수 있습니다. 예를 들어, 여러 파일에서 동일한 상수 값이 사용되는 경우, 외부 상수를 선언하고 해당 값을 다른 파일에서 참조할 수 있습니다. 이를 통해 중복된 코드를 방지하고 유지 보수성을 개선할 수 있습니다.
마지막으로, 검색 엔진 최적화 (SEO) 측면에서 이야기해보면, 정적 상수와 외부 상수는 프로그램의 성능 및 구조에 영향을 미칩니다. 정적 상수는 파일 내에서 값의 변경이 없기 때문에, 프로그램 실행 시 속도가 빨라질 수 있습니다. 반면 외부 상수는 여러 파일 간의 값 공유로 인해 프로그램의 구조가 복잡해질 수 있지만, 재사용성과 유지 보수성을 향상시킬 수 있습니다.
결론적으로, 정적 상수와 외부 상수는 프로그래밍 언어에서 일정한 값을 유지하기 위해 사용되는 변수입니다. 정적 상수는 해당 파일 내에서만 유효하며, 외부 상수는 여러 파일 간에 값을 공유할 수 있습니다. 이러한 차이를 고려하여 프로그램의 요구사항에 맞는 상수 선언을 선택하는 것이 중요합니다. 상황에 따라 최적의 선택을 하면, 관련 프로젝트의 성능과 유지 보수성을 향상시킬 수 있습니다.

반응형
Comments