-
[Swift] ๋จ๋ฝ ํ๊ฐ (Short-circuit Evaluation), Side EffectSwift 2022. 1. 20. 14:21
(๋ชจ๋ ์ฝ๋๋ Playground์์ ์์ฑ๋์์ต๋๋ค.)
์ด๋ฒ์ ๋จ๋ฝ ํ๊ฐ (Short-circuit Evaluation) ์ ๋ํด์ ๊ณต๋ถํด๋ณด๋ ค๊ณ ํ๋ค.
๋จ๋ฝ ํ๊ฐ (Short-circuit Evaluation) ๋?
๋จ๋ฝ ํ๊ฐ๋, ๋ ผ๋ฆฌ์์์ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ฐ ํ์ํ ์ต์ํ์ ์ฝ๋๋ง ์คํํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค๋ฉด,
Logical AND (&&) ์ฐ์ฐ์์ ์ฒซ๋ฒ์งธ ํผ์ฐ์ฐ์๊ฐ false์ธ ๊ฒฝ์ฐ, ๋๋ฒ์งธ ํผ์ฐ์ฐ์๋ ๋ณผ ํ์๋ ์์ด ๋ฌด์กฐ๊ฑด false์ด๋ค.
Logical OR (||) ์ฐ์ฐ์์ ์ฒซ๋ฒ์งธ ํผ์ฐ์ฐ์๊ฐ true์ธ ๊ฒฝ์ฐ, ๋๋ฒ์งธ ํผ์ฐ์ฐ์๋ ๋ณผ ํ์๋ ์์ด ๋ฌด์กฐ๊ฑด true์ด๋ค.
ํ์ง๋ง!
๋ง์ฝ Logical AND (&&) ์ฐ์ฐ์์ ์ฒซ๋ฒ์งธ ํผ์ฐ์ฐ์๊ฐ true๋ผ๋ฉด, ๋๋ฒ์งธ ํผ์ฐ์ฐ์์ ๊ฐ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ๋๋ฒ์งธ ํผ์ฐ์ฐ์๋ ์คํํด๋ณด์์ผํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก Logical OR (||) ์ฐ์ฐ์์ ์ฒซ๋ฒ์งธ ํผ์ฐ์ฐ์๊ฐ false๋ผ๋ฉด, ๋๋ฒ์งธ ํผ์ฐ์ฐ์์ ๊ฐ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ๋๋ฒ์งธ ํผ์ฐ์ฐ์๋ ์คํํด์ผํ๋ค.
์ด๋ ๊ฒ ๋ ผ๋ฆฌ์์์ ํ์ํ ์ต์ํ์ ์ฝ๋๋ง ์คํํ๋ ๊ฒ์ ๋จ๋ฝ ํ๊ฐ๋ผ๊ณ ํ๋ค!
์์๋ฅผ ํตํด ๋ ์์ธํ ์์๋ณด์.
var a = 1 var b = 1 func updateA() -> Bool { a += 1 return false } func updateB() -> Bool { b += 1 return true } if updateA() && updateB() { // a๊ฐ false์ด๋ฏ๋ก, updateB()๋ ํธ์ถ๋์ง ์๋๋ค. // ์ฆ, updateA()์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ์ updateB()๊ฐ ํธ์ถ๋ ์๋, ํธ์ถ๋์ง ์์ ์๋ ์๋ค. } a // 2 b // 1updateA, updateB์ 2๊ฐ์ง ํจ์๊ฐ ์กด์ฌํ๋ค.
updateA๋ a๋ฅผ 1 ์ฆ๊ฐ์ํค๋ ํจ์์ด๊ณ , updateB๋ b๋ฅผ 1 ์ฆ๊ฐ์ํค๋ ํจ์์ด๋ค.
if ๊ตฌ๋ฌธ์๋ Logical AND ์ฐ์ฐ์๊ฐ ์กด์ฌํ๋๋ฐ, updateA๋ ํญ์ false๋ฅผ ๋ฆฌํดํ๋ค.
๋ฐ๋ผ์ updateA๋ ํธ์ถ๋๊ณ , updateB๋ ํธ์ถ๋์ง ์๋๋ค.
์ค์ ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ฉด, a๋ ์๋ ๊ฐ์์ 1์ด ์ฆ๊ฐ๋ 2๊ฐ, b๋ ์๋ ๊ฐ์ธ 1์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฌ๊ธฐ์ ์ ๊น!
ํํ์์ ํ๊ฐํ์ ๋, ๊ฐ์ด ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ Side Effect๋ผ๊ณ ํ๋ค.
์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๋ฉด,
a b์์ ์ฝ๋์์ a, b๋ ๋จ์ํ ์ ์ฅ๋ ๊ฐ์ ์ถ๋ ฅํ๊ณ ์๋ค. ์ ์ฅ๋ ๊ฐ์ ๋จ์ํ ์ถ๋ ฅํ๊ณ , ๊ฐ์ ๋ณ๊ฒฝ์ ์๊ธฐ ๋๋ฌธ์ Side Effect๋ ๋ฐ์ํ์ง ์์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ์ฝ๋์์๋ Side Effect๊ฐ ๋ช ๋ฒ ๋ฐ์ํ์๊น?
a = 3 b์ด ๊ฒฝ์ฐ, a์ ๊ฐ์ด 1์์ 3์ผ๋ก ๋ณ๊ฒฝ๋์์ผ๋ 1๋ฒ์ Side Effect๊ฐ ๋ฐ์ํ๋ค๊ณ ๋งํ ์ ์๋ค!
Side Effect๋ ํญ์ ์์ธก ๊ฐ๋ฅํ ๋ฒ์ ๋ด์ ์์ด์ผํ๊ณ , ์๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํด์ผํ๋ค.
์ฆ, ์์ ์ฝ๋์ if ๊ตฌ๋ฌธ์์ updateA()๊ฐ ํธ์ถ๋๊ณ , ์ด๋ a ๊ฐ์ ๋ณ๊ฒฝ์ํค๋ ๊ฒ์ด๋ฏ๋ก Side Effect๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
ํ์ง๋ง ๋ ผ๋ฆฌ์์ Side Effect๋ฅผ ๋ฐ์์ํค๋ ์ฝ๋๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด ๋ ผ๋ฆฌ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์,
๊ฐ๋ฅํ๋ค๋ฉด ๋ ผ๋ฆฌ์์ ์์ฑํ ๋์๋ Side Effect๊ฐ ๋ฐ์ํ๋ ์ฝ๋๋ ์ฐ์ง ์๊ฑฐ๋, ์๋์ ๊ฐ์ด ์กฐ๊ฑด ํ๊ฐ ์ ์ ๋ฏธ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํด๋๋ ๊ฒ์ด ์ข๋ค.
var a = 1 var b = 1 func updateA() -> Bool { a += 1 return false } func updateB() -> Bool { b += 1 return true } // ๋ ผ๋ฆฌ ํํ์์ ๊ด๊ณ์์ด updateA(), updateB()๊ฐ ๋ชจ๋ ํธ์ถ๋๋ค. let resultA = updateA() // 2 let resultB = updateB() // 1 if resultA && resultB { // ๋จ์ํ ์์์ ์ ์ฅ๋ ๊ฐ์ ์ฝ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, Side Effect๋ ๋ฐ์ํ์ง ์๋๋ค. } a // 2 b // 1'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ํจ์ํ ํ๋ก๊ทธ๋๋ฐ (Functional Programming) (0) 2022.01.21 [Swift] ๊ณ ์ฐจํจ์ (map, filter, reduce) (0) 2022.01.20 [Swift] zip(_:_:) (0) 2022.01.14 [Swift] Objected Oriented Programming in Swift (raywenderlich ๋ฒ์ญ) (0) 2022.01.13 [Swift] ์ด๋ฆ ์ ์ ๊ท์น (Naming Convention) (0) 2022.01.13