! ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ

Swift ์ฝ”๋“œ์—์„œ !๊ฐ€ ๋ณด์ด๋Š” ๊ฒฝ์šฐ๋Š” ๋‘๊ฐ€์ง€๋‹ค. ์—ฐ์‚ฐ์ž(!=, not, !==)์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•œ๋‹ค.

  1. ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘
  2. ์•”์‹œ์  ์˜ต์…”๋„ (IUO: Implicitly Unwrapped Optional)

๊ฐ•์ œ ์–ธ๋ž˜ํ•‘

์ด๊ฑด ๋ญ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋™์˜ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋งŽ์œผ๋ฏ€๋กœ ํŒจ์Šค.

Implicitly Unwrapped Optional

@IBOutlet weak var label: UILabel! // ์ด๊ฑฐ ์‹œ๋ 

์ด ๋ถ€๋ถ„์—์„œ 50%์˜ Crash๊ฐ€ ์—ฌ๊ธฐ์„œ ๋‚œ๋‹ค. ์˜ต์…”๋„์ด๊ธด ํ•˜์ง€๋งŒ ์•„๋‹Œ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •(100% ๊ฐ’์ด ์žˆ์„ ๊ฑฐ์•ผ!)ํ•˜๋Š” ๊ฒƒ.

๊ทธ๋Ÿฐ๋ฐ 100%๋ผ๋Š” ๊ฒƒ์€ ์—†๋‹ค. ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅด ์งœ๋ณด๋‹ˆ, ์—ฌ๋Ÿฌ๋ฒˆ ์ฝ”๋“œ๊ฐ€ ์ˆ˜์ •๋˜๋ฉด์„œ, ๊ธฐ์กด์— ์–ด๋–ค ๋กœ์ง์ด์—ˆ๋Š”์ง€ ์ œ๋Œ€๋กœ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ฒผ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ฐ›์€ ๋‹ด๋‹น์ž๋Š” ์™œ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋Š”์ง€ ์ฐพ์•„์•ผ ํ•˜์—ฌ ์‹œ๊ฐ„์ ์ธ ์†์‹ค์ด ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์•ฑ์ด ์ฃฝ๋Š”๋‹ค.

ํ•˜๋‚˜์˜ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž.

  • ViewController๊ฐ€ memory warning์„ ๋ฐ›์Œ
  • Memory๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด iOS๋Š” View๋ฅผ ๋‚ ๋ฆด ์ˆ˜ ์žˆ์Œ
  • Subview๋“ค ์—ญ์‹œ ๋‚ ์•„๊ฐ
  • ๊ทธ๋Ÿฐ๋ฐ ๋‹ค๋ฅธ VC์—์„œ ํ˜น์‹œ๋ผ๋„ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•œ๋‹ค๋ฉด? โ†’ Crash

Array bounds check

Objective C์˜ ๊ฒฝ์šฐ์—๋Š” ์ด๋Ÿฐ ๊ฒฝ์šฐ Exception์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ Error Catch๋ฅผ ํ•˜์—ฌ ์ฃฝ์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ Swift์˜ ๊ฒฝ์šฐ, ๋ฐ”๋กœ Crash๋‚œ๋‹ค. ์ฃฝ์ง€ ์•Š๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

Overflow

Int๋Š” OS์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง„๋‹ค. OS๊ฐ€ 32๋น„ํŠธ์ด๋ฉด Int32, 64๋น„ํŠธ๋ฉด Int64๊ฐ€ ๋œ๋‹ค.

64๋น„ํŠธ์—์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•œ๋Œ€๋กœ ์ž˜ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š” 32๋น„ํŠธ ๋””๋ฐ”์ด์Šค๋ผ๋ฉด? Crash๋‚œ๋‹ค. ์ฆ‰, 32๋น„ํŠธ ๊ธฐ๊ธฐ์—์„œ Int64๋ฅผ ๋„ฃ์–ด๋ฒ„๋ฆฌ๋ฉด, ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„ ์™ธ๋กœ ๋„˜์–ด๊ฐ€๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ฃฝ๋Š”๋‹ค.

๊ฐ’์ด ์ปค์„œ Int64๋กœ ์ฒ˜๋ฆฌํ–ˆ๋Š”๋ฐ, 32๋น„ํŠธ ๋””๋ฐ”์ด์Šค์—์„œ Crash๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

Objective C ๋•Œ๋ฌธ์— ๋ฐœ์ƒ

nullablility check

Objective C์—์„œ nullable, unnullable์„ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ชจ๋‘ force upwrapped ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ objective C ์ฝ”๋“œ์—์„œ nil์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Swift์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” Objective C์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜๋“œ์‹œ nullability๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

objective C์—์„œ exception ๋ฐœ์ƒ

Objective C ๋‚ด๋ถ€ ์ฝ”๋“œ๊ฐ€ exception์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด๋ฅผ Swift์—์„œ ๋ฐ›์„ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. Objective C์—์„œ์˜ Exception๊ณผ Swift์˜ Exception์€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฐœ๋…์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Swift์—์„œ Error Handling์„ ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

์ •๋ฆฌ

Crash๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์žˆ์–ด์„œ ๋งค์šฐ ์•ˆ์ข‹๋‹ค. ๋ช‡๋ฒˆ ์‹œ๋„ํ•˜๋‹ค๊ฐ€ ์•ˆ๋˜๋ฉด ๋ฐ”๋กœ ์•ฑ ์‚ญ์ œ๋กœ ์ด์–ด์ง„๋‹ค.

Reference