Loadingโ€ฆ

Objective-C ํฌ๋งทํ„ฐ ์ •๋ณด Objective-C ์ฝ”๋“œ ํฌ๋งทํ„ฐ

์•„์ง๋„ iOS๋‚˜ macOS์šฉ Objective-C ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ž‘์—… ์ค‘์ด์‹ ๊ฐ€์š”? ์ด ํฌ๋งทํ„ฐ๋Š” ๋ณด์•ˆ๋œ ๋ฐฑ์—”๋“œ์—์„œ clang-format์„ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ผ๊ด€๋œ ๋“ค์—ฌ์“ฐ๊ธฐ, ๊ฐ„๊ฒฉ, ์ค‘๊ด„ํ˜ธ๋กœ ์ •๋ฆฌ๋œ .m / .mm ์ถœ๋ ฅ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ ํŒŒ์ผ ์ •๋ฆฌ, diff ์•ˆ์ •ํ™”, ๋กœ์ปฌ ํˆด์ฒด์ธ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ํŒ€ ์ „์ฒด ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋Š” ๋ฐ ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • Objective-C ๋ฐ Objective-C++ ์†Œ์Šค ํŒŒ์ผ(`.m`, `.mm`)์„ ํ•œ ๋ฒˆ์˜ ํด๋ฆญ์œผ๋กœ ํฌ๋งท
  • LLVM์˜ clang-format์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์—…๊ณ„ ํ‘œ์ค€ ํฌ๋งทํŒ… ์ œ๊ณต
  • ์—ฐ์‚ฐ์ž, ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜, ๋ฉ”์‹œ์ง€ ์ „์†ก ์ฃผ๋ณ€์˜ ๊ณต๋ฐฑ์„ ์ •๊ทœํ™”
  • ์ธํ„ฐํŽ˜์ด์Šค, ๊ตฌํ˜„์ฒด, ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ์ผ๊ด€๋œ ์ค‘๊ด„ํ˜ธ ์Šคํƒ€์ผ ์ ์šฉ
  • ๊ฐ€๋…์„ฑ ๋†’์€ ํ—ค๋”์™€ ์†Œ์Šค๋ฅผ ์œ„ํ•ด ์ž„ํฌํŠธ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌ ๋ฐ ๊ทธ๋ฃนํ™”
  • ๋ ˆ๊ฑฐ์‹œ Objective-C ํ”„๋กœ์ ํŠธ, Swift/ObjC ํ˜ผํ•ฉ ์•ฑ, PR ์ „ ๋น ๋ฅธ ์ •๋ฆฌ์— ์ ํ•ฉ
  • UI ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํƒ€์ž„์•„์›ƒ ๋ฐ ํฌ๊ธฐ ์ œํ•œ์ด ์žˆ๋Š” ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์‹คํ–‰

๐Ÿ› ๏ธ Objective-C ์ฝ”๋“œ ํฌ๋งทํŒ… ๋ฐฉ๋ฒ• for objectivec-formatter

1

1. ์ฝ”๋“œ ๋ถ™์—ฌ๋„ฃ๊ธฐ ๋˜๋Š” ์—…๋กœ๋“œ

Objective-C / Objective-C++ ์†Œ์Šค๋ฅผ ํŽธ์ง‘๊ธฐ์— ๋ถ™์—ฌ๋„ฃ๊ฑฐ๋‚˜ `.m` / `.mm` ํŒŒ์ผ์„ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญํ•˜์„ธ์š”. ํ—ค๋” ์ฝ”๋“œ ์กฐ๊ฐ์„ ๋ถ™์—ฌ๋„ฃ์–ด ๋น ๋ฅด๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

2

2. ํฌ๋งทํ„ฐ ์‹คํ–‰

**ํฌ๋งท** ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์„ธ์š”. ์ฝ”๋“œ๋Š” ๋ณด์•ˆ ์—”๋“œํฌ์ธํŠธ๋กœ ์ „์†ก๋˜์–ด clang-format์ด Objective-C ์Šคํƒ€์ผ ํ”„๋กœํ•„๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํฌ๋งท๋œ ๊ฒฐ๊ณผ๊ฐ€ ๋ช‡ ์ดˆ ๋‚ด์— ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

3

3. ๊ฒ€ํ† , ๋ณต์‚ฌ ๋ฐ ์ปค๋ฐ‹

์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€ํ† ํ•œ ํ›„ Xcode๋‚˜ ํŽธ์ง‘๊ธฐ๋กœ ๋‹ค์‹œ ๋ณต์‚ฌํ•˜์„ธ์š”. ๊นจ๋—ํ•œ ํŒŒ์ผ์„ ์ปค๋ฐ‹ํ•˜์—ฌ diff๊ฐ€ ๊ณต๋ฐฑ ๋Œ€์‹  ๋กœ์ง์— ์ง‘์ค‘๋˜๋„๋ก ์œ ์ง€ํ•˜์„ธ์š”.

๊ธฐ์ˆ  ์‚ฌ์–‘

์ง€์› ์ž…๋ ฅ ํ˜•์‹

์ผ์ƒ์ ์ธ Objective-C / Objective-C++ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์œ ํ˜•์˜ˆ์‹œ์ฐธ๊ณ 
.m ์†Œ์Šค ํŒŒ์ผ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ, ๋ชจ๋ธ, ๋งค๋‹ˆ์ €์—…๋กœ๋“œ ๋ฐ ๋ถ™์—ฌ๋„ฃ๊ธฐ ์™„์ „ ์ง€์›.
.mm Objective-C++ ํŒŒ์ผC++๊ณผ Cocoa API ์—ฐ๊ฒฐclang-format์˜ Objective-C++ ์ง€์›์œผ๋กœ ํฌ๋งทํŒ…๋ฉ๋‹ˆ๋‹ค.
ํ—ค๋” ์ฝ”๋“œ ์กฐ๊ฐ@interface ๋ธ”๋ก, ํ”„๋กœํ† ์ฝœ, ์นดํ…Œ๊ณ ๋ฆฌํ—ค๋” ์ฝ”๋“œ๋ฅผ ํŽธ์ง‘๊ธฐ์— ์ง์ ‘ ๋ถ™์—ฌ๋„ฃ์–ด ์ •๋ฆฌํ•˜์„ธ์š”(ํŒŒ์ผ ์—…๋กœ๋“œ๋Š” `.m` / `.mm` ๊ธฐ๋Œ€).

ํฌ๋งทํ„ฐ ์—”์ง„

ํฌ๋งทํ„ฐ๋Š” ๋ณด์•ˆ ๋ฐฑ์—”๋“œ์—์„œ clang-format์— ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ์„ธ๋ถ€์‚ฌํ•ญ
์—”์ง„LLVM clang-format (Objective-C / Objective-C++)
์‹คํ–‰ ๋ชจ๋ธ์ „์šฉ `/api/objectivec-formatter` ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„ ์ง€์›
ํƒ€์ž„์•„์›ƒ์š”์ฒญ๋‹น ์•ฝ 25์ดˆ ์•ˆ์ „ ํƒ€์ž„์•„์›ƒ
์žฌํฌ๋งท ๋ฒ”์œ„๊ณต๋ฐฑ, ๋“ค์—ฌ์“ฐ๊ธฐ, ์ค‘๊ด„ํ˜ธ, ์ผ๋ถ€ ์ž„ํฌํŠธ ๋ ˆ์ด์•„์›ƒ
์˜๋ฏธ๋ก ์ฝ”๋“œ ๋™์ž‘์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋ ˆ์ด์•„์›ƒ๋งŒ ์กฐ์ •๋ฉ๋‹ˆ๋‹ค
๋งค์šฐ ๋ฏผ๊ฐํ•˜๊ฑฐ๋‚˜ ๋…์ ์ ์ธ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ ์˜จ๋ผ์ธ ๋„๊ตฌ๋ณด๋‹ค CI์—์„œ ๋˜๋Š” ์ž์ฒด ๋จธ์‹ ์—์„œ clang-format์„ ๋กœ์ปฌ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์Šคํƒ€์ผ & ๋ ˆ์ด์•„์›ƒ

์ฝ”๋“œ๋Š” ์•ˆ์ •์ ์ธ clang-format ์Šคํƒ€์ผ ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๋ฒ”์ฃผ์ •๊ทœํ™” ๋Œ€์ƒ์ค‘์š”์„ฑ
๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜`-` ์ฃผ๋ณ€ ๊ณต๋ฐฑ, ๋ฐ˜ํ™˜ ํƒ€์ž…, ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ํฌ์ธํ„ฐํ—ค๋”์™€ ๊ตฌํ˜„์—์„œ ๋ฉ”์„œ๋“œ ์„ ์–ธ์„ ์‰ฝ๊ฒŒ ์Šค์บ”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
๋ฉ”์‹œ์ง€ ์ „์†ก์‰ผํ‘œ ๋’ค ๊ณต๋ฐฑ, ์ฝœ๋ก  ์ฃผ๋ณ€, ์ค‘์ฒฉ ํ˜ธ์ถœ ๋‚ด ๊ณต๋ฐฑ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ `-[obj doSomething:withOption:]` ํ˜ธ์ถœ์˜ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
์ค‘๊ด„ํ˜ธ & ์ œ์–ด ํ๋ฆ„`@interface`, `@implementation`, `if`, `for`, `while`์— ๋Œ€ํ•œ ์ค‘๊ด„ํ˜ธ ๋ฐฐ์น˜ํŒŒ์ผ๊ณผ ๊ธฐ์—ฌ์ž ๊ฐ„์˜ ์Šคํƒ€์ผ ๋“œ๋ฆฌํ”„ํŠธ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
์ž„ํฌํŠธ`#import` ๋ฐ `#include`์— ๋Œ€ํ•œ ๊ทธ๋ฃนํ™”์™€ ๊ฐ„๊ฒฉํŒŒ์ผ ์ƒ๋‹จ ์„น์…˜์„ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ค„์ž…๋‹ˆ๋‹ค.
๋“ค์—ฌ์“ฐ๊ธฐ & ์ •๋ ฌ๋ธ”๋ก, ์Šค์œ„์น˜, ์ค‘์ฒฉ ๋ฒ”์œ„์— ๋Œ€ํ•œ ๊ท ์ผํ•œ ๋“ค์—ฌ์“ฐ๊ธฐ๋น ๋ฅธ ์ˆ˜๋™ ํŽธ์ง‘์œผ๋กœ ์ธํ•œ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ธ”๋ก์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ œํ•œ & ์„ฑ๋Šฅ

๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ •์ง€์‹œํ‚ค์ง€ ์•Š๊ณ  ์‹ค์ œ Objective-C ์•ฑ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋งž์ถฐ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž…๋ ฅ ์œ ํ˜•๋Œ€๋žต์  ์ œํ•œ์ฐธ๊ณ ์‚ฌํ•ญ
๋ถ™์—ฌ๋„ฃ์€ ์†Œ์Šค์•ฝ 2MB ํ…์ŠคํŠธ๋ฐฑ์—”๋“œ๋กœ ์ „์†กํ•˜๊ธฐ ์ „์— ์ ์šฉ๋˜๋Š” ํ•˜๋“œ ์ œํ•œ.
์—…๋กœ๋“œ๋œ ํŒŒ์ผ~5 MB๋„๊ตฌ์— ๊ตฌ์„ฑ๋œ `maxFileSizeBytes`์— ์˜ํ•ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ ์ง€์—ฐ ์‹œ๊ฐ„< 1โ€“2์ดˆํŒŒ์ผ ํฌ๊ธฐ, ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ๋ฐ ์„œ๋ฒ„ ๋ถ€ํ•˜์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
์‹คํŒจ ๋ชจ๋“œ์‹œ๊ฐ„ ์ดˆ๊ณผ / ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€UI๊ฐ€ ๋ฉˆ์ถ”๋Š” ๋Œ€์‹  ์˜ค๋ฅ˜๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ชจ๋ธ

์„œ๋ฒ„ ๊ธฐ๋ฐ˜, ํฌ๋งทํŒ…๋งŒ์„ ์œ„ํ•œ ์ž„์‹œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ธก๋ฉด๋™์ž‘
์ „์†ก์ฝ”๋“œ๋Š” HTTPS๋ฅผ ํ†ตํ•ด ๋ณด์•ˆ๋œ ํฌ๋งทํŒ… ์—”๋“œํฌ์ธํŠธ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
์ €์žฅ์ž„์‹œ ์ฒ˜๋ฆฌ ๋ชฉ์ : ์ž…๋ ฅ์€ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์—์„œ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ์žฅ๊ธฐ๊ฐ„ ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋น„๋ฐ€ ์ •๋ณดAPI ํ‚ค, ํ† ํฐ ๋˜๋Š” ํ”„๋กœ๋•์…˜ ์ž๊ฒฉ ์ฆ๋ช…์„ ์˜จ๋ผ์ธ ๋„๊ตฌ์— ๋ถ™์—ฌ๋„ฃ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๋ชจ๋ฒ” ์‚ฌ๋ก€๋น„๋ฏผ๊ฐ ํŒŒ์ผ๊ณผ ๋น ๋ฅธ ์ •๋ฆฌ์— ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , CI ๋ฐ ์ค‘์š”ํ•œ ํฌ๋งทํŒ…์€ ์ž์ฒด ์ธํ”„๋ผ ๋‚ด์—์„œ ์œ ์ง€ํ•˜์„ธ์š”.

Objective-C์šฉ ๋ช…๋ น์ค„ clang-format

์ผ์ƒ์ ์ธ ๊ฐœ๋ฐœ๊ณผ CI๋ฅผ ์œ„ํ•ด ๋กœ์ปฌ ํˆด์ฒด์ธ์˜ clang-format์€ Objective-C ์ฝ”๋“œ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์œ ์ง€ํ•˜๋Š” ํ‘œ์ค€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

macOS / ๐Ÿง Linux

๋‹จ์ผ `.m` ํŒŒ์ผ์„ ์ œ์ž๋ฆฌ์—์„œ ํฌ๋งท

clang-format -i MyViewController.m

๊ตฌ์„ฑ๋œ ์Šคํƒ€์ผ(์˜ˆ: `.clang-format`์—์„œ)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋””์Šคํฌ์˜ ํŒŒ์ผ์„ ๋‹ค์‹œ ์”๋‹ˆ๋‹ค.

ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํฌ๋งท๋œ ์ถœ๋ ฅ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

clang-format MyViewController.m

ํฌ๋งท๋œ ์ฝ”๋“œ๋ฅผ stdout์œผ๋กœ ์ถœ๋ ฅํ•˜์—ฌ ๋จผ์ € diff๋ฅผ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๋‚ด ๋ชจ๋“  Objective-C ์†Œ์Šค ํฌ๋งท

find . -name "*.m" -o -name "*.mm" | xargs clang-format -i

์ „์ฒด Objective-C / Objective-C++ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๊ฑธ์ณ ์ผ๊ด€๋œ ํฌ๋งทํŒ…์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Windows

ํ—ค๋” ๋˜๋Š” ๊ตฌํ˜„ ํŒŒ์ผ ํฌ๋งท

clang-format.exe -i MyClass.h

์„ ํƒํ•œ clang-format ์Šคํƒ€์ผ๋กœ ํ—ค๋” ํŒŒ์ผ์„ ์ œ์ž๋ฆฌ์—์„œ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ์˜ ์ผ๋ถ€๋กœ ์‹คํ–‰

forfiles /S /M *.m /C "cmd /c clang-format.exe -i @file"

์ €์žฅ์†Œ ๋‚ด Objective-C ์†Œ์Šค์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๋ฐฐ์น˜ ํฌ๋งทํŒ…์ž…๋‹ˆ๋‹ค.

ํŒ€์˜ ์Šคํƒ€์ผ์„ ์ €์žฅ์†Œ ๋ฃจํŠธ์— ์žˆ๋Š” `.clang-format` ํŒŒ์ผ์— ์ €์žฅํ•œ ๋‹ค์Œ, ์ด ์›น ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅธ ์ผํšŒ์„ฑ ์ˆ˜์ •์„ ํ•˜๊ณ  ๋กœ์ปฌ clang-format์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ํ™”๋œ ์ €์žฅ์†Œ ์ „์ฒด ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜์„ธ์š”.

์‹ค์šฉ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€

iOS / macOS ์•ฑ ๊ฐœ๋ฐœ

์˜ค๋ž˜๋œ Objective-C ์•ฑ์„ ์ƒˆ๋กœ์šด Swift ๋ชจ๋“ˆ๊ณผ ํ•จ๊ป˜ ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”.

  • ์ฃผ์š” ๋ฆฌํŒฉํ† ๋ง ์ „์— ๋ ˆ๊ฑฐ์‹œ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์ •๋ฆฌํ•˜์„ธ์š”.
  • ์‹œ๋‹ˆ์–ด์™€ ์ฃผ๋‹ˆ์–ด Objective-C ๊ฐœ๋ฐœ์ž๋กœ ๊ตฌ์„ฑ๋œ ํ˜ผํ•ฉ ํŒ€ ์ „์ฒด์— ์ผ๊ด€๋œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜์„ธ์š”.
  • ์ปค๋ฐ‹ ์ „์— ํฌ๋งทํŒ…์„ ์‹คํ–‰ํ•˜์—ฌ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์—์„œ ์ง€์ €๋ถ„ํ•œ diff๋ฅผ ์ค„์ด์„ธ์š”.
@interface MyViewController : UIViewController
@property(nonatomic, strong) NSString *titleText;
@end

@implementation MyViewController
- (void)viewDidLoad {
[super viewDidLoad];NSLog(@"Loaded: %@",_titleText);}
@end

์ฝ”๋“œ ๋ฆฌ๋ทฐ & ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ์ค€๋น„

๋ฆฌ๋ทฐ ๋…ผ์˜๋ฅผ ๋…ผ๋ฆฌ์— ์ง‘์ค‘์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํฌ๋งทํŒ…์„ ์‚ฌ์ „ ๋‹จ๊ณ„๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • PR์„ ์—ด๊ธฐ ์ „์— ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์— ํฌ๋งทํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ณต๋ฐฑ ๋…ธ์ด์ฆˆ๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”.
  • ์ค‘๊ด„ํ˜ธ ์Šคํƒ€์ผ๊ณผ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ์•ˆ์ •ํ™”ํ•˜์—ฌ diff๋ฅผ ๋” ์ž‘๊ณ  ๊ฒ€ํ† ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“œ์„ธ์š”.
  • ๋‹จ์ผ clang-format ํ”„๋กœํ•„์— ์œ„์ž„ํ•˜์—ฌ ์Šคํƒ€์ผ ๋…ผ์Ÿ์„ ์ค„์ด์„ธ์š”.
// ๋ฆฌ๋ทฐ ์ „: ์ผ๊ด€์„ฑ ์—†๋Š” ๊ฐ„๊ฒฉ
if(showAlert){[self showAlertWithMessage:message];}

// ํฌ๋งทํŒ… ํ›„
if (showAlert) {
  [self showAlertWithMessage:message];
}

โ“ Frequently Asked Questions

๐Ÿ› ๏ธ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ํฌ๋งทํ„ฐ ์—”์ง„์ด ์‚ฌ์šฉ๋˜๋‚˜์š”?

์ด ๋„๊ตฌ๋Š” C, C++, Objective-C, Objective-C++ ๋ฐ ๊ด€๋ จ ์–ธ์–ด์˜ ํ‘œ์ค€ ํฌ๋งทํ„ฐ์ธ LLVM์˜ `clang-format`์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์•ˆ์ •์ ์ธ Objective-C ์Šคํƒ€์ผ ํ”„๋กœํ•„์— ๋”ฐ๋ผ ํŒŒ์‹ฑ๋˜๊ณ  ์žฌ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“„์–ด๋–ค ํŒŒ์ผ ์œ ํ˜•์ด ์ง€์›๋˜๋‚˜์š”?

์—…๋กœ๋”๋Š” `.m` ๋ฐ `.mm` ๊ตฌํ˜„ ํŒŒ์ผ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ค๋” ๋‚ด์šฉ(`.h`)์„ ํŽธ์ง‘๊ธฐ์— ์ง์ ‘ ๋ถ™์—ฌ๋„ฃ์–ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŒŒ์ผ ์—…๋กœ๋“œ๋Š” ํ˜„์žฌ `.m` / `.mm`์— ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“UI์—์„œ ๋“ค์—ฌ์“ฐ๊ธฐ๋‚˜ ์ตœ๋Œ€ ์ค„ ๋„ˆ๋น„๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

์›น ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ Objective-C ์Šคํƒ€์ผ ํ”„๋กœํ•„๋กœ clang-format์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. `IndentWidth`๋‚˜ `ColumnLimit` ๊ฐ™์€ ์˜ต์…˜์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•ด์•ผ ํ•œ๋‹ค๋ฉด, `.clang-format` ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋‚˜ CI์—์„œ ๋กœ์ปฌ๋กœ clang-format์„ ์‹คํ–‰ํ•˜์„ธ์š”.

๐Ÿ”๋‚ด ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋˜๊ฑฐ๋‚˜ ๊ธฐ๋ก๋˜๋‚˜์š”?

์ฝ”๋“œ๋Š” HTTPS๋ฅผ ํ†ตํ•ด ๋ณด์•ˆ ํฌ๋งทํŒ… ์—”๋“œํฌ์ธํŠธ๋กœ ์ „์†ก๋˜๊ณ  ์ผ์‹œ์ ์ธ ์ž…๋ ฅ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์žฅ๊ธฐ ์ €์žฅ์„ ๋ชฉ์ ์œผ๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ์„œ ๋ชจ๋“  ์˜จ๋ผ์ธ ๋„๊ตฌ์— ๋น„๋ฐ€, ์ž๊ฒฉ ์ฆ๋ช… ๋˜๋Š” ๋งค์šฐ ๋ฏผ๊ฐํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ๋ฅผ ํฌํ•จํ•˜์ง€ ๋งˆ์„ธ์š”.

โš ๏ธํฌ๋งทํŒ…์ด ๋‚ด ์ฝ”๋“œ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

clang-format์€ ๊ณต๋ฐฑ๊ณผ ๋ ˆ์ด์•„์›ƒ์— ์ดˆ์ ์„ ๋งž์ถ”๋ฉฐ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ๊ฐ€ ๋น„์ •์ƒ์ ์ธ ๋งคํฌ๋กœ ํŠธ๋ฆญ์ด๋‚˜ ํฌ๋งทํŒ…์— ๋ฏผ๊ฐํ•œ ๋„๊ตฌ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ญ์ƒ ๋ณ„๋„์˜ ๋ธŒ๋žœ์น˜๋‚˜ ๋ฐฑ์—…์—์„œ ํฌ๋งทํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋™์ž‘์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์ธํ•˜์„ธ์š”.

๐Ÿš€์ด ์›น ๋„๊ตฌ์™€ ๋กœ์ปฌ clang-format ์ค‘ ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜์š”?

๋น ๋ฅธ ์ •๋ฆฌ, ์ผํšŒ์„ฑ ํŒŒ์ผ ๋˜๋Š” clang-format์ด ์„ค์น˜๋˜์ง€ ์•Š์€ ๋จธ์‹ ์— ์žˆ์„ ๋•Œ ์ด ์›น ํฌ๋งทํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ „์ฒด ํ”„๋กœ์ ํŠธ, ์ž๋™ํ™”๋œ ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ์Šคํƒ€์ผ ๊ฐ•์ œ๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊ณต์œ  `.clang-format` ๊ตฌ์„ฑ์œผ๋กœ ํŽธ์ง‘๊ธฐ์™€ CI์— clang-format์„ ์œ ์ง€ํ•˜์„ธ์š”.

Pro Tips

Best Practice

์ปค๋ฐ‹ ์ „์— ํฌ๋งคํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ diff๊ฐ€ ์ค‘๊ด„ํ˜ธ ๋ฐฐ์น˜ ๋Œ€์‹  ๋™์ž‘์— ์ง‘์ค‘๋˜๋„๋ก ์œ ์ง€ํ•˜์„ธ์š”.

Best Practice

CI(๋˜๋Š” pre-commit ํ›…)์— `clang-format` ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์Šคํƒ€์ผ ๋ฌธ์ œ๊ฐ€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์— ๋„๋‹ฌํ•˜์ง€ ์•Š๋„๋ก ํ•˜์„ธ์š”.

Best Practice

์ž„ํฌํŠธ๋ฅผ ์ •๋ ฌํ•˜๊ณ  ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ์œ ์ง€ํ•˜์„ธ์š”. ์—ฌ๋Ÿฌ ํŒ€์›์ด ๋™์ผํ•œ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ๋•Œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.

Best Practice

ํ”„๋กœ๋•์…˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ํ† ํฐ์„ ์–ด๋–ค ์˜จ๋ผ์ธ ํฌ๋งคํ„ฐ์—๋„ ๋ถ™์—ฌ๋„ฃ์ง€ ๋งˆ์„ธ์š”. ๋ฏผ๊ฐํ•œ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ ์ž์ฒด ์ธํ”„๋ผ ๋‚ด์—์„œ ๋กœ์ปฌ๋กœ clang-format์„ ์‹คํ–‰ํ•˜์„ธ์š”.

Additional Resources

Other Tools