๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming ๊ฐœ๋ฐœ/๐ŸŽ iOS ๊ฐœ๋ฐœ, Swift

[Swift] ์ปดํŒŒ์ผ๋Ÿฌ ์ œ์–ด๋ฌธ๊ณผ ์ „์ฒ˜๋ฆฌ๊ธฐ, ์ปค์Šคํ…€ ํ”Œ๋ž˜๊ทธ (#if DEBUG, #if os...)

by kimdee 2024. 11. 21.
๋ฐ˜์‘ํ˜•

 

 

์‹œ์ž‘ํ•˜๋ฉฐ

Swift ์—์„œ DEBUG, RELEASE์™€ ๊ฐ™์€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ „์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์ปค์Šคํ…€ํ•˜๊ฒŒ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์–ด ์•Œ์•„๋ณด๋‹ˆ Other Swift Flags์™€ Active Compilation Conditions ๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ, ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒธ ์ •๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 


์ „์ฒ˜๋ฆฌ๊ธฐ Preprocessor 

์ปดํŒŒ์ผ ์ „์— ์ฒ˜๋ฆฌ๋˜๋Š” ์ž‘์—…์„ ์ „์ฒ˜๋ฆฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

์ปดํŒŒ์ผ๋Ÿฌ ์ œ์–ด๋ฌธ Compiler Control Statements 

๊ทธ๋Ÿฌ๋‚˜ Swift์—์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ œ์–ด๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Swift์—๋Š” ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ๋ธ”๋ก, ๋ผ์ธ ์ œ์–ด ๋ฌธ, ์ปดํŒŒ์ผ ํƒ€์ž„ ์ง„๋‹จ ๋ฌธ ๋“ฑ ์„ธ ๊ฐ€์ง€ ์ปดํŒŒ์ผ๋Ÿฌ ์ œ์–ด๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

# if : ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ๋ธ”๋ก Conditional Compilation  Block

๊ทธ๋Ÿฌ๋‚˜ Swift ์—์„œ๋Š” ์ „์ฒ˜๋ฆฌ๋ผ๊ธฐ๋ณด๋‹ค๋Š” ์ •ํ™•ํžˆ๋Š” ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ๋ธ”๋ก์ด๋ผ๊ณ  ๋ช…์‹œ๋ฉ๋‹ˆ๋‹ค. 

 

์ปดํŒŒ์ผ ์กฐ๊ฑด์— ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ์ด ๋˜๋Š” ๊ฒƒ์œผ๋กœ, ์ปดํŒŒ์ผ ์กฐ๊ฑด์€ ํ•˜๋‚˜์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ด๋ ‡๊ฒŒ ํ•˜๋‚˜ ํ•˜๋‚˜์”ฉ ์กฐ๊ฑด์„ ๊ฑธ ์ˆ˜๋„ ์žˆ๊ณ  

#if compiler(>=5)
print("Swift 5 ์ปดํŒŒ์ผ๋Ÿฌ ์ด์ƒ์œผ๋กœ ์ปดํŒŒ์ผ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
#endif

#if canImport(ModuleA)
print("ModuleA๊ฐ€ import๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.")
#endif

#if os(macOS) && swift(>5)
print("OS๊ฐ€ macOS์ด๊ณ  Swift ๋ฒ„์ „์ด 5 ์ด์ƒ์ผ ๊ฒฝ์šฐ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค")
#endif

 

 

์—ฌ๋Ÿฌ๊ฐœ์˜ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜์—ฌ ๋ถ„๊ธฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

#if <#compilation condition 1#>
    // ์กฐ๊ฑด 1์ด ์ฐธ์ผ ๊ฒฝ์šฐ ์‹คํ–‰๋˜๋Š” ๋ฌธ์žฅ
#elseif <#compilation condition 2#>
    // ์กฐ๊ฑด 2๊ฐ€ ์ฐธ์ผ ๊ฒฝ์šฐ ์‹คํ–‰๋˜๋Š” ๋ฌธ์žฅ
#else
    // ์กฐ๊ฑด 1,2๊ฐ€ ๋ชจ๋‘ ๊ฑฐ์ง“์ผ ๊ฒฝ์šฐ ์‹คํ–‰๋˜๋Š” ๋ฌธ์žฅ
#endif

 

 

 

Active Compilation Conditions 

์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ํ‘œํ˜„์‹์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ปดํŒŒ์ผ ์กฐ๊ฑด ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. 

 

Setting์—์„œ ์ด๋ฆ„์€ SWIFT_ACTIVE_COMPILATION_CONDITIONS ๋กœ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. 

 

 

1) Build Settings ์—์„œ Custom Flags ๋˜๋Š” Active compilation์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ  Other Swift Flags์—์„œ ์ปค์Šคํ…€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

2) ํด๋ฆญํ•œ ๋‹ค์Œ +๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

3) ์ด์ œ ์ฝ”๋“œ ์ƒ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด #If ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

#if DEBUG 
print("DEBUG")
#elseif KIMDEE
print("ํ‚ด๋””์ž…๋‹ˆ๋‹ค.")
#endif

 

Other Swift Flags

Swift ์ปดํŒŒ์ผ๋Ÿฌ์— ์ „๋‹ฌ๋˜๋Š” ์ถ”๊ฐ€์ ์ธ ํ”Œ๋ž˜๊ทธ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. 

 

Setting์—์„œ ์ด๋ฆ„์€ OTHER_SWIFT_FLAGS ๋กœ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ถ”๊ฐ€์ ์ธ ํ”Œ๋ž˜๊ทธ ๋ชฉ๋ก์„ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ์ปค์Šคํ…€ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋” ์ž˜ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ACTIVE COMPILATION CONDITIONS์™€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

 

1) Build Settings ์—์„œ Custom Flags๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ  Other Swift Flags์—์„œ ์ปค์Šคํ…€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

2) ๋‹จ, Active Compilation Conditions์™€ ๋‹ค๋ฅด๊ฒŒ  ํ”Œ๋ž˜๊ทธ๋ฅผ ์“ธ ๋•Œ -D๋ฅผ ์•ž์— ๋ถ™์—ฌ์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. 

 

+ ๊ทธ ์™ธ์— ํ˜„์žฌ ๊ฐ’์„ ๋ฎ์–ด์“ฐ๊ธฐ๋ณด๋‹ค ์„ค์ •์„ ํ™•์žฅํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—, ์˜ˆ๋ฅผ ๋“ค์–ด  ๊ธฐ์กด ํ”Œ๋ž˜๊ทธ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, $(inherited) ํ‚ค์›Œ๋“œ๋ฅผ ์„ค์ • ๊ฐ’ ์•ž์— ๋ถ™์—ฌ์ค๋‹ˆ๋‹ค. 

OTHER_SWIFT_FLAGS = $(inherited) -v

 

๋งˆ๋ฌด๋ฆฌ

์ฒ˜์Œ iOS ๊ฐœ๋ฐœํ–ˆ์„ ๋•Œ, ๋‹จ์ˆœ os๋งŒ ์ „์ฒ˜๋ฆฌ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ๊ณ , DEBUG๋ชจ๋“œ์— ๋Œ€ํ•ด์„œ๋Š” ๊ทธ๊ฑธ ๋ชฐ๋ผ์„œ ์ผ์ผํžˆ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๋Š” ์‹์œผ๋กœ  ํ–ˆ๋Š”๋ฐ์š”. 

๊ทธ๋ ‡๊ฒŒ ์ฃผ์„์„ ๋„ฃ์—ˆ๋‹ค ๋บ๋‹ค ํ•˜๋‹ค๋ณด๋ฉด ์‹ค์ˆ˜๋„ ์™•์™•, ์–ด๋Š ์ˆœ๊ฐ„ ๋˜๊ฒŒ ํ—ท๊ฐˆ๋ฆฌ๊ณค ํ–ˆ๋Š”๋ฐ, ๋‹น์‹œ ์•Œ๊ฒŒ ๋œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ด์ œ์•ผ ์ •๋ฆฌํ•ด๋ด…๋‹ˆ๋‹ค. 

 

์ด์ œ Swift์— Macro๊ฐ€ ์†Œ๊ฐœ ๋œ ๊ฒƒ์ด ์ž‘๋…„ WWDC์˜€๋Š”๋ฐ์š”. ๋‹ค์Œ์—๋Š” Macro๋ฅผ ์ข€ ๋” ์ž˜ ํ™œ์šฉํ•˜๊ณ  ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์จ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

 


๋งˆ์น˜๋ฉฐ 

 

์˜ค๋Š˜๋„ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ, ๋„์›€์ด ๋˜์…จ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ํ˜น์‹œ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ”ผ๋“œ๋ฐฑํ•˜์‹ค  ๋‚ด์šฉ ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  ๋Œ“๊ธ€๋กœ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ”— ์ฐธ๊ณ ๋งํฌ

 

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/statements/#Compiler-Control-Statements  

 

Documentation

 

docs.swift.org

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€