Short-Circuit Evaluation
๐ซ Short-Circuit Evaluation
๋จ๋ฝ ๋ฐฉ์
์ฐธ๊ณ - ์ํคํผ๋์, ์ฐธ๊ณ - ์ ๋ก๋๋ชจ๋์ ๊ธ
๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋, ๋ถ ์ฐ์ฐ์ Short-Circuit Evaluation ์ด ์ ์ฉ๋๋ค.
์ ๊ทธ๋ฆผ์ฒ๋ผ,
์์๋๋ก ์ฐ์ฐํ๋ ๋์ค ์ด๋ฏธ ๊ฒฐ๊ณผ๊ฐ ๊ฒฐ์ ๋๋ ๊ฒฝ์ฐ,
๊ตณ์ด ๋จ์ ํผ์ฐ์ฐ์๋ค๊น์ง ๊ณ์ฐํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์, ๊ฒฐ๊ณผ๊ฐ ๊ฒฐ์ ๋ ์์ ์์ ๊ณ์ฐ์ ๋ง์น๋ค.
1
2
SomeObject a = null;
if (a != null && a.SomeFunc())
C# ์์ &&
์ Short-Circuit Evaluation ์ด ์ ์ฉ๋๊ธฐ ๋๋ฌธ์,
์ ์ฝ๋์์๋ a != null
์์ ๊ณ์ฐ์ด ๋๋๊ณ , a.SomeFunc()
๊ฐ ์คํ๋์ง ์์ ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
์ด๋ฐ์์ผ๋ก ํ์ฉํ ์ ์๋ค.
๋ง์ฝ Short-Circuit Evaluation ์ด ์ ์ฉ๋์ง ์์๋ค๋ฉด,
์ ์ฝ๋์์ a
๊ฐ null
์ธ์ฑ๋ก a.SomeFunc()
๊ฐ ์คํ๋์ด NullReferenceException
์ด ๋ฐ์ํ์ ๊ฒ์ด๋ค.
1
2
3
4
5
6
7
8
9
// 1 : ์ต์ 1ms
if (takes1ms() || takes1s())
// 2 : ์ต์ 1s
if (takes1s() || takes1ms())
// a : ์ต์ O(1)
if (boolVariable || take1s())
// b : ์ต์ 1s
if (takes1s() || boolVariable)
๋, ๋ง์ฝ ํจ์์ ๋ฐํ ๊ฐ์ ํผ์ฐ์ฐ์๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ,
์๋์ ์ผ๋ก ๋น์ฉ์ด ๋์ ํจ์๋ฅผ ๋ท์ชฝ์ ๋ฐฐ์นํ์ฌ ์๊ฐ ๋ณต์ก๋๋ฅผ ์ค์ผ ์๋ ์๋ค.
1
2
if (false & SomeFunc())
if (true | SomeFunc())
๋ฐ๋ฉด, ๊ฒฐ๊ณผ์ ์๊ด์์ด ํผ์ฐ์ฐ์๋ก ์กด์ฌํ๋ ๋ชจ๋ ํจ์๋ค์ ์คํ์ํค๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์๋ค.
(์์๊ฐ ๋ฑ ๋ ์ค๋ฅด์ง๋ ์์ง๋ง)
์ด ๊ฒฝ์ฐ, C# ์์๋ &
์ด๋ |
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
&
์ |
๋ ๋นํธ ์ฐ์ฐ์๋ก ์ฐ์ด๊ธฐ๋ ํ์ง๋ง, ๋ถ ์ฐ์ฐ ์์ ์ฌ์ฉ๋ ๊ฒฝ์ฐ, ๋ถ ๋
ผ๋ฆฌ ์ฐ์ฐ์๋ก์จ ์ฌ์ฉ๋๋ค.
&
์ด๋ |
๋ฅผ ๋ถ ๋
ผ๋ฆฌ ์ฐ์ฐ์๋ก์จ ์ฌ์ฉํ๋ฉด, ๊ฒฐ๊ณผ์ ์๊ด์์ด ๋ชจ๋ ํผ์ฐ์ฐ์๋ค์ ๊ณ์ฐํ๋ค.
๋๋ฌธ์ ์ ๋ ์ค์ ์ฝ๋๋, ์ฒซ ๋ฒ์งธ ํผ์ฐ์ฐ์์์ ์ด๋ฏธ ๊ฒฐ๊ณผ๊ฐ ๊ฒฐ์ ๋์ด๋ฒ๋ฆฌ์ง๋ง, ๊ณ์ฐ์ ๋๋ด์ง ์๊ณ SomeFunc() ํจ์๋ฅผ ์คํ์ํจ๋ค.
์ด๋, ์ด๋ฐ &
์ |
๋ฅผ &&
์ ||
์ ๊ตฌ๋ถ์ง์ด,
Eager Operators (&
, |
) ์ Short-Circuit Operators (&&
, ||
) ๋ก ๋ถ๋ฅผ ์ ์๋ค.
C# ํํ ๋น๊ต ์, Short-Circuit Evaluation ์ด ์ ์ฉ๋๋ค.