-
[Swift] Conditional Statements (if, switch, guard) (์กฐ๊ฑด๋ฌธ)Swift 2022. 1. 10. 23:37
(๋ชจ๋ ์ฝ๋๋ Playground์์ ์์ฑ๋์์ต๋๋ค.)
Conditional Statements๋ ์กฐ๊ฑด๋ฌธ์ด๊ณ , ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์คํ๋๋ ์ฝ๋๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉํ๋ค.
์กฐ๊ฑด๋ฌธ์๋ if๋ฌธ, switch๋ฌธ, guard๋ฌธ์ด ์๋ค.
1. if ๋ฌธ
if ๋ฌธ์ ๋ฌธ๋ฒ์ ์๋์ ๊ฐ๋ค.

if ๋ฐ๋ก ๋ค์์ ์กฐ๊ฑด (condition) ์ด ์ค๋๋ฐ, ์ด ์กฐ๊ฑด์ Boolean ํํ์์ผ๋ก ์ด๋ค.
์กฐ๊ฑด์ด ์ฐธ์ธ์ง ๊ฑฐ์ง์ธ์ง๋ง ํ๋จํ ํ์, ์กฐ๊ฑด์ด ์ฐธ์ด๋ผ๋ฉด if ๋ธ๋ก ๋ด์ ์๋ ์ฝ๋๊ฐ ์คํ๋๋ค.
๋ฐ๋๋ก ์กฐ๊ฑด์ด ๊ฑฐ์ง์ด๋ผ๋ฉด, if ๋ธ๋ก ๋ด์ ์๋ ์ฝ๋๋ ์คํ๋์ง ์๋๋ค.
if ๋ฌธ์ 3๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ธ ์ ์๋ค.
์ ์ผ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ์์ ์ฌ์ง๊ณผ ๊ฐ์ด if๋ฌธ ํ๋๋ง ์ฐ๋ ๊ฒฝ์ฐ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์กฐ๊ฑด์ด ๋ฑ 2๊ฐ์ง๋ก ๋๋ ์ง๋ ๊ฒฝ์ฐ์๋ ์๋์ ๊ฐ์ด if - else ๋ฌธ์ ์ด์ฉํ์ฌ ์ด๋ค.

์ฌ๊ธฐ์ if ๋ฌธ์ ์กฐ๊ฑด์ด ์ฐธ์ด๋ผ๋ฉด if ๋ธ๋ก ๋ด์ ์ฝ๋๊ฐ ์คํ๋๊ณ , else ๋ธ๋ก ๋ด์ ์ฝ๋๋ ์คํ๋์ง ์๋๋ค.
๋ฐ๋ฉด, if ๋ฌธ์ ์กฐ๊ฑด์ด ๊ฑฐ์ง์ด๋ผ๋ฉด if ๋ธ๋ก ๋ด์ ์ฝ๋๋ ์คํ๋์ง ์๊ณ , else ๋ธ๋ก ๋ด์ ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒ์ด๋ค.
์๋ ์ฝ๋๋ score == 100 ๋ผ๋ ์กฐ๊ฑด์ด ์ฐธ์ด๊ธฐ ๋๋ฌธ์ if ๋ธ๋ก ๋ด์ ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒ์ด๋ค.

๊ทธ๋ ๋ค๋ฉด ์กฐ๊ฑด์ ์ฌ๋ฌ ๊ฐ๋ก ๋๋ ์ผํ ๋์๋ ์ด๋ป๊ฒ ํด์ผํ ๊น?
if - else if ๋ฌธ์ ์ฌ์ฉํ๋ฉด ๋๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด์.

์์ ๊ฐ์ด ์กฐ๊ฑด์ ์ฌ๋ฌ ๊ฐ๋ก ๋๋ ์ผํ ๊ฒฝ์ฐ, if - else if ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋๋ ์ ์๋ค.
์ด ๋, else ๋ธ๋ก์ ์ถ๊ฐํด๋ ๋๊ณ , ์ถ๊ฐํ์ง ์์๋ ๋๋ค. ํ์ง๋ง else ๋ฌธ์ ์ด๋ค๋ฉด, else ๋ฌธ์ ํ๋๋ง ์์ฑํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ๊ฐ์ ์กฐ๊ฑด ์ค ํ๋์ ์กฐ๊ฑด๋ง ๋ง์กฑ์ด ๋๋ค๋ฉด if ๋ฌธ์ด ์ข ๋ฃ๋๋ค.
์๋์ ์ฝ๋๋ ์ซ์๊ฐ 6์ ๋ฐฐ์์ธ์ง ํ์ธํ๋ ํ๋ก๊ทธ๋จ์ด๋ค.
ํ์ง๋ง ์ด ์ฝ๋๋ "6์ ๋ฐฐ์"๋ผ๋ ์ถ๋ ฅ์ ์ป์ ์ ์๋ค.
์๋ํ๋ฉด 6์ ๋ฐฐ์๋ ๊ณง 2์ ๋ฐฐ์์ด๊ธฐ ๋๋ฌธ์, ์ฒซ๋ฒ์งธ ์กฐ๊ฑด๋ฌธ์์ 2์ ๋ฐฐ์๋ฅผ ์ถ๋ ฅํ๊ณ ์ข ๋ฃ๋๊ธฐ ๋๋ฌธ์ด๋ค.

๋ฐ๋ผ์ if ๋ฌธ์ ์ธ ๋ ์กฐ๊ฑด์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด, ๊ฐ์ฅ ๊น๋ค๋ก์ด ์กฐ๊ฑด์ ์ ์ชฝ์ ์จ์ฃผ์ด์ผํ๋ค. ์ฆ, ๊ฒฝ์ฐ์ ์๊ฐ ์ ์ ๊ฒ์ ๋ ์์ชฝ์ ์จ์ฃผ์ด์ผํ๋ค.
์ฝ๋๋ฅผ ์์ ํ๋ฉด ์๋์ ๊ฐ๋ค.

2. switch ๋ฌธswitch ๋ฌธ์ ๋ฌธ๋ฒ์ ์๋์ ๊ฐ๋ค.

if ๋ฌธ์ if ๋ค์์ ์กฐ๊ฑด (boolean ํํ์)์ด ์์ง๋ง, switch ๋ฌธ์ switch ๋ค์์ value ํํ์์ด ์จ๋ค!
๋ฐ๋ผ์ value ํํ์์๋ ์ด๋ค ๊ฐ์ด๋ ์ฌ ์ ์๊ณ , case ๋ค์์ ์ค๋ pattern์๋ value์ ๊ฐ๊ณผ ๋น๊ตํ ๊ฐ์ด ์จ๋ค.
switch๋ฌธ์ ์์ ๊ฐ์ด ๊ฐ์ ์ผ์น ์ฌ๋ถ์ ๋ฐ๋ผ์ ์คํํ ์ฝ๋๋ฅผ ๊ฒฐ์ ํ๋ค.
๋ํ ํ๋์ ์ผ์ด์ค๋ง ๋งค์นญ๋๋ฉด ๋ฐ๋ก switch๋ฌธ์ด ์ข ๋ฃ๋๋ค.
๋ฐ๋ผ์ case ๋ธ๋ก์ ๋ฐ๋์ 1๊ฐ ์ด์ ์์ฑํด์ผํ๊ณ , ์ํ๋ ๋งํผ ์์ฑํ ์ ์๋ค.
default ๋ธ๋ก์ case ๋ธ๋ก์์ ์ฒ๋ฆฌ๋์ง ์๋ ๊ฒฝ์ฐ์ ๋ํด์ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒ์ธ๋ฐ, ๋ฐ๋์ 1๊ฐ๋ง ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
๋ง์ฝ case ๋ธ๋ก์์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๊ฐ ๋ค ์ฒ๋ฆฌ๋๋ค๋ฉด, default ๋ธ๋ก์ ์๋ต์ด ๊ฐ๋ฅํ๋ค.
๋ชจ๋ ๊ฒฝ์ฐ์ ์๊ฐ ๋ค ์ฒ๋ฆฌ๋์ง ์๋๋ฐ default ๋ธ๋ก์ ์๋ตํ๋ ๊ฒฝ์ฐ, ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ default ๋ธ๋ก์๋ ๋ฐ๋์ case ๋ธ๋ก์์ ์ฒ๋ฆฌ๋์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํด์ฃผ์ด์ผํ๋ค!

๋ํ, switch ๋ฌธ์ case ๋ธ๋ก, default ๋ธ๋ก์ ๋น์ด์๋ ์ํ๋ก ๋์ด์๋ ์๋๋ค.
๋ง์ฝ ์๋์ ๊ฐ์ด ๋น์ด์๋ ์ํ๋ก ๋๋ค๋ฉด, ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ๋ฌด์กฐ๊ฑด ํ ์ค ์ด์์ ์คํ๊ฐ๋ฅํ ๋ฌธ์ฅ์ด ํฌํจ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.

๋ฐ๋ผ์ switch ๋ฌธ์ ์ฌ๋ฐ๋ฅด๊ฒ ์์ฑํ๋ฉด ์๋์ ๊ฐ๋ค.

switch ๋ฌธ์ ์๋์ ๊ฐ์ด ๋ฒ์๋ฅผ ๋งค์นญ์ํค๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฐ, ์ด๋ฅผ Interval Matching ์ด๋ผ๊ณ ํ๋ค.

์์๋ก 12์ ~ 2์์ ๊ฒจ์ธ, 3์ ~ 5์์ ๋ด, 6์ ~ 8์์ ์ฌ๋ฆ, 9์ ~ 11์์ ๊ฐ์์ด๋ผ๊ณ ๋์๋ค.
ํ์ฌ month๋ 5์ด๊ธฐ ๋๋ฌธ์, 2๋ฒ์งธ case ๋ธ๋ก ๋ด์ "๋ด"์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์์ switch ๋ฌธ์ ํ๋์ case ๋ฌธ์ด ๋งค์นญ๋๋ฉด ๋ฐ๋ก switch ๋ฌธ์ด ์ข ๋ฃ๋๋ค๊ณ ๋งํ๋๋ฐ,
case ๋ฌธ์ด ๋งค์นญ๋์ด๋ ๊ณ์ํด์ ๊ฐ์ ๋งค์นญ๊ณผ ์๊ด์์ด ๊ทธ ๋ค์ case ๋ธ๋ก์ ์คํ์ํค๊ณ ์ถ์ ๋์๋ Fall Through๋ฅผ ์ฌ์ฉํ๋ค.
ํ์ง๋ง switch ๋ฌธ์ ๊ฐ์ ๋งค์นญ์ ๋ฐ๋ผ case ๋ธ๋ก์ ์คํํ๋ value matching ์ด๊ธฐ ๋๋ฌธ์, Fall Through๋ ๊ฐ๊ธ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
Fall through๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ ์ฝ๋์ ๊ฐ์ด case 2, case 3์ ๋ธ๋ก๋ง ์คํ๋๋ค.

3. guard ๋ฌธ
Swift์์ guard ๋ฌธ์ Early Exit๋ผ๋ ๊ฒ์ ์ง์ํ๋๋ฐ,
์ด๋ ์ํ๋ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์ผ๋ฉด, ๋ถํ์ํ ์ฝ๋๋ฅผ ์คํํ์ง ์๊ณ ์ผ์ฐ ์ข ๋ฃ์ํค๋ ๊ฒ์ ์๋ฏธํ๋ค.
guard ๋ฌธ์ ๋ฌธ๋ฒ์ ์๋์ ๊ฐ๋ค.

guard ๋ค์ boolean ํํ์์ธ ์กฐ๊ฑด (condition) ์ด ์ค๊ณ , else ๋ธ๋ก์ด ์กด์ฌํ๋ค.
์ฌ๊ธฐ์ condition์ด ์ฐธ์ด๋ผ๋ฉด else ๋ธ๋ก์ ์คํํ์ง ์๊ณ , condition์ด ๊ฑฐ์ง์ด๋ผ๋ฉด else ๋ธ๋ก์ด ์คํ๋๋ค.
์ถ๊ฐ๋ก guard ๋ฌธ์ Optional Binding๊ณผ๋ ํจ๊ป ์ฌ์ฉ๋๋๋ฐ, ์ฌ๊ธฐ์๋ ๊ฐ๋จํ ์์ ๋ง ์ดํด๋ณด๊ณ ๋ค์์ ์์ธํ ์์๋ณด๋๋ก ํ์!
guard ๋ฌธ์ Local scope์์ ์ฌ์ฉ๋๊ณ , else ๋ธ๋ก ๋ด์๋ ๋ฐ๋์ ์ฝ๋์ ์คํ์ ์ค์ง์ํค๋ ๋ฌธ์ฅ์ด ์์ผํ๋ค.
๋ค์ ๋งํด, else ๋ธ๋ก์ ํด๋นํ๋ Local scope์ ์คํ์ ์ข ๋ฃ์์ผ์ผํ๋ค.
๋ฐ๋ผ์ else ๋ธ๋ก์๋ return, throw, break, continue ์ค ํ๋๊ฐ ์ค๋ฉด ๋๋ค.
์๋ ์ฝ๋๋ guard ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ง์๋ฅผ ํ๋ณํ๋ ํจ์์ด๋ค.

num์ด 2์ผ ๊ฒฝ์ฐ, guard ๋ฌธ์ ์กฐ๊ฑด์ด ์ฐธ์ด๊ธฐ ๋๋ฌธ์ else ๋ธ๋ก ๋ด์ ์ฝ๋๋ ์คํ๋์ง ์๊ณ , ๊ทธ ๋ค์ ์ฝ๋๊ฐ ์คํ๋๋ค.
num์ด 3์ผ ๊ฒฝ์ฐ, guard ๋ฌธ์ ์กฐ๊ฑด์ด ๊ฑฐ์ง์ด๊ธฐ ๋๋ฌธ์ else ๋ธ๋ก ๋ด์ ์ฝ๋๊ฐ ์คํ๋๊ณ , ํจ์์ ์คํ์ด ์ข ๋ฃ๋๋ค.
guard ๋ฌธ์ if ๋ฌธ๊ณผ ๋น์ทํ์ง๋ง ๋ค๋ฅด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ guard ๋ฌธ์ if ๋ฌธ์ผ๋ก ๋ฐ๊ฟ ์ ์๊ณ , if ๋ฌธ ๋ํ guard ๋ฌธ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ธ์ if ๋ฌธ์ ์ฌ์ฉํ๊ณ , ์ธ์ guard ๋ฌธ์ ์ฌ์ฉํด์ผํ ๊น?
์์๋ฅผ ํตํด ์์ธํ ์์๋ณด๋๋ก ํ์.
์๋ ์ฝ๋๋ ๊ฐ๊ฐ if ์ guard ๋ฅผ ์ฌ์ฉํ์ฌ num์ ์ ์๊ฐ ์ ์ฅ๋์ด์๊ณ , ๊ทธ ๊ฐ์ด 5 ์ด์์ด๋ผ๋ฉด ๊ทธ ์ซ์๋ฅผ ์ถ๋ ฅํ๋ ํจ์์ด๋ค.


์ผ์ชฝ : if ๋ฌธ / ์ค๋ฅธ์ชฝ : guard ๋ฌธ ํ์ฌ ๋ ํจ์ ๋ชจ๋ num์ Optional Intํ์ด๊ณ , nil ๊ฐ์ด ์ ์ฅ๋ ์ํ์ด๋ค.
๋ ํจ์ ๋ชจ๋ ์ฒซ๋ฒ์งธ if / guard ๋ฌธ์์ num์ ๊ฐ์ด ์ ์ฅ๋์ด์๋์ง๋ฅผ ํ์ธํ๊ณ , ๋ง์ฝ ๊ฐ์ด ์ ์ฅ๋์ด์๋ค๋ฉด validNum์ num์ ๊ฐ์ ์ ์ฅํด์ค๋ค. ์ด๋ ๊ฒ ๊ฐ์ ์ ์ฅํด์ฃผ๋ ๊ฒ์ binding (๋ฐ์ธ๋ฉ) ์ด๋ผ๊ณ ํ๋ค.
if ๋ฌธ์ ๊ฒฝ์ฐ, ๋ฐ์ธ๋ฉ์ ์ฑ๊ณตํ๋ฉด ๊ทธ ๋ค์ if ๋ฌธ์ผ๋ก ๋ค์ด๊ฐ์ validNum์ ์ ์ฅ๋ ๊ฐ์ด 5 ์ด์์ด๋ผ๋ฉด ๊ทธ ์ซ์๋ฅผ ์ถ๋ ฅํ๋ค.
guard ๋ฌธ์ ๊ฒฝ์ฐ, ๋ฐ์ธ๋ฉ์ ์ฑ๊ณตํ๋ฉด else ๋ธ๋ก์ ์คํํ์ง ์๊ณ ๊ทธ ๋ค์ guard ๋ฌธ์ผ๋ก ๋์ด๊ฐ์ ์กฐ๊ฑด์ ํ๋ณํ๋ค.
์ด ๋, ์ฒซ๋ฒ์งธ guard ๋ฌธ์ else ๋ธ๋ก ๋ด์์๋ validNum์ ์ ๊ทผํ ์ ์๋ค. else ๋ธ๋ก์ validNum์ ๊ฐ ์ ์ฅํ๋ ๊ฒ์ ์คํจํ์ ๋ ์คํ๋๋ ๊ฒ์ด๋ฏ๋ก ๋น์ฐํ ๊ฒ์ด๋ค.
์ฒซ๋ฒ์งธ guard ๋ฌธ์ ์กฐ๊ฑด์ด ์ฐธ์ผ๋ก ํ๋จ๋๊ณ ๋๋ฉด, ๊ทธ ๋ค์๋ถํฐ๋ ์ด์ validNum์ ์ ๊ทผํ ์ ์๋ค.
์ ๋ฆฌ
if ๋ฌธ์ ์กฐ๊ฑด์ด ๋จ์ํ๊ฑฐ๋, ๋ฐ์ธ๋ฉํ ์์๋ฅผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ฒ๋ฆฌํ๋ ์์ ๊ฐ (์์์ validNum) ์ผ๋ก ์ฌ์ฉํ ๋ ์ด๋ค.
guard ๋ฌธ์ ์กฐ๊ฑด์ด ๋ณต์กํ๊ฑฐ๋, ๋ฐ์ธ๋ฉํ ์์ (์์์ validNum) ์ฒ๋ผ ๋์ผํ scope์์ ๊ณ์ ํด์ ์ฌ์ฉํด์ผํ ๊ฒฝ์ฐ์ ์ด๋ค.
๊ทธ๋ฆฌ๊ณ guard ๋ฌธ์ ์ฌ์ฉํ ๊ฒฝ์ฐ if ๋ฌธ์ ์ค์ฒฉ์ ํผํ ์ ์๊ณ , ์ฝ๋์ ๊ฐ๋ ์ฑ๋ ๋์ผ ์ ์์ผ๋ ์ ํ์ฉํด์ ์ธ ์ ์๋๋ก ํ์!
'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Control Transfer Statements (break, continue) (์ ์ด ์ ๋ฌ๋ฌธ) (0) 2022.01.12 [Swift] Loop Statements (for-in, while) (๋ฐ๋ณต๋ฌธ) (0) 2022.01.11 [Swift] CustomStringConvertible (0) 2022.01.10 [Swift] Range Operator (๋ฒ์ ์ฐ์ฐ์) (0) 2022.01.09 [Swift] ๋จ๋ฝ ํ๊ฐ (Short-circuit Evaluation) (0) 2022.01.07