포슀트

πŸŒ’ 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 이 μ μš©λœλ‹€.

이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.