본문 바로가기
카테고리 없음

(Swift, Objective-C) Preprocessor

by man_doo 2024. 7. 28.

회사에서 개발할 때 사용해야 하는 서버 주소와 배포된 제품이 사용해야 하는 서버 주소가 다릅니다. 매번 서버 주소를 수동으로 바꿔야 하므로, 실수로 개발 서버 주소가 입력된 상태로 배포되거나, 개발할 때 공인 서버 주소를 사용하는 문제가 발생할 수 있습니다. 또한, 매번 서버 주소를 바꾸는 작업은 귀찮기도 합니다.

이러한 문제를 해결하기 위해 Preprocessor(전처리기)를 사용해보았습니다.

Preprocessor 전처리기

Preprocessor는 소스 코드를 컴파일하기 전에 코드의 특정 부분을 처리하는 단계입니다. 주로 매크로 정의, 조건부 컴파일, 파일 포함 등과 같은 작업을 수행합니다. Preprocessor는 컴파일러의 일부로 작동하며, 컴파일 전에 코드를 전처리하여 컴파일러가 실제로 컴파일할 코드를 생성합니다.

많이 사용하는 import, define등이 여기 포함됩니다.
제가 사용한 전처리기는 #if #else #endif입니다.

사용 예시

swift와 objective-c에서 각각의 사용방법에 대해 알아보겠습니다.

Objective-C
#if DEBUG
    serverAddr = REQUEST_URL_DEBUG;
#else
    serverAddr = REQUEST_URL;
#endif

아래와 같이 else if로 사용 가능
#elif RELEASE
    serverAddr = REQUEST_URL;
Swift
#if DEBUG
    serverAddr = REQUEST_URL_DEBUG;
#else
    serverAddr = REQUEST_URL;
#endif

아래와 같이 else if로 사용 가능
#elseif RELEASE
    serverAddr = REQUEST_URL;

둘다 비슷하나 Objective-C는 #elif Swift #elseif로 사용한다는 차이점이 있습니다.

저렇게 코드를 작성한다면 빌드를 debug로 하는지 release로 하는지에 따라 서로 다른 서버 주소가 serverAddr변수에 할당됩니다.

다른 전처리기들

추가로 대표적인 Objective-C와 Swift의 전처리기를 소개하겠습니다.

Objective-C의 전처리기 (Preprocessor) 디렉티브

Objective-C는 C 언어에서 유래한 전통적인 Preprocessor 디렉티브를 사용합니다. 이러한 디렉티브는 컴파일러가 소스 코드를 컴파일하기 전에 처리해야 할 작업을 정의합니다.

  1. #define: 매크로 정의
    • 특정 텍스트 문자열을 다른 텍스트 문자열로 대체합니다.
    • #define PI 3.14159
    • #define SQUARE(x) ((x) * (x))
  2. #import / #include: 파일 포함
    • 다른 파일의 내용을 포함합니다. #import는 동일한 파일이 여러 번 포함되는 것을 방지합니다.
    • #import <Foundation/Foundation.h> #include "MyHeader.h"
  3. #undef: 매크로 정의 해제
    • 매크로 정의를 해제합니다.
    • #define TEMP 100 #undef TEMP
  4. #pragma: 컴파일러 지시문
    • 컴파일러에 특정 작업을 수행하도록 지시합니다.
    • #pragma mark - Section Name #pragma message("Compiling...")

Swift의 컴파일러 지시문

Swift는 전통적인 Preprocessor 대신 컴파일러 지시문을 사용하여 조건부 컴파일과 같은 작업을 수행합니다.

  1. #available: API 가용성 조건부 컴파일
    • 특정 플랫폼 버전에서만 실행될 코드를 정의합니다.
    • if #available(iOS 14, *) { // iOS 14 이상에서 실행되는 코드 } else { // 이전 버전에서 실행되는 코드 }
  2. #warning / #error: 경고 및 오류 생성
    • 컴파일 시 경고 또는 오류를 생성합니다.
    • #warning("This is a warning message") #error("This is an error message")