πŸ’» Programming/Java

[Java] 단좕 평가(Short-circuit Evaluation)

dev-ong 2024. 6. 27. 16:44

단좕 평가(Short-circuit Evaluation)λž€?

단좕 ν‰κ°€λŠ” ν‘œν˜„μ‹μ˜ κ²°κ³Όλ₯Ό κ²°μ •ν•˜λŠ”λ°μ— ν•„μš”ν•œ μ΅œμ†Œν•œμ˜ μ—°μ‚°λ§Œ μˆ˜ν–‰ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

λ‹€λ₯΄κ²Œ λ§ν•˜λ©΄, ν‘œν˜„μ‹μ˜ κ²°κ³Όλ₯Ό κ²°μ •ν•˜λŠ” 도쀑에 κ²°κ³Όκ°€ ν™•μ •λœ 경우, λ‚˜λ¨Έμ§€ 연산을 μˆ˜ν–‰ν•˜μ§€ μ•Šκ³  μƒλž΅ν•˜λŠ” 것을 λ§ν•œλ‹€.

그리고 단좕 ν‰κ°€λŠ” 논리 μ—°μ‚°μ—μ„œ νš¨μœ¨μ„±μ„ λ†’μ΄λŠ” μ€‘μš”ν•œ κ°œλ…μ΄λ‹€.

 

πŸ’‘ ν‘œν˜„μ‹(Expression)

ν‘œν˜„μ‹μ€ 값을 κ³„μ‚°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ½”λ“œμ˜ ν•œ 쑰각으둜, 결과적으둜 ν•˜λ‚˜μ˜ 값을 λ§Œλ“€μ–΄λ‚Έλ‹€.

예λ₯Ό λ“€μ–΄ 10 + 3 은 13μ΄λΌλŠ” 값을 λ§Œλ“€μ–΄λ‚΄λŠ” ν‘œν˜„μ‹μ΄λ‹€.

 

단좕 ν‰κ°€μ˜ 적용

논리 μ—°μ‚°μžμΈ AND(&&)와 OR(||) 연산은 단좕 평가λ₯Ό μˆ˜ν–‰ν•œλ‹€.

논리곱(&&) μ—°μ‚°

논리곱(&&) μ—°μ‚°μžλŠ” 두 ν”Όμ—°μ‚°μžκ°€ λͺ¨λ‘ true 일 λ•Œ, trueλ₯Ό λ°˜ν™˜ν•œλ‹€.

그리고 μ’Œν•­μ—μ„œ μš°ν•­μœΌλ‘œ 평가가 μ§„ν–‰λœλ‹€. 

 

(ν”Όμ—°μ‚°μž 1) && (ν”Όμ—°μ‚°μž 2) κ°€ 있으면 ν”Όμ—°μ‚°μž 1이 λ¨Όμ € ν‰κ°€λ˜κ³ , ν”Όμ—°μ‚°μž 2κ°€ ν‰κ°€λ˜λŠ” 것이닀.

ν”Όμ—°μ‚°μž 1이 true라고 ν•΄μ„œ ν‘œν˜„μ‹ 전체λ₯Ό true둜 평가할 μˆ˜λŠ” μ—†κ³ , ν”Όμ—°μ‚°μž 2κΉŒμ§€ 평가λ₯Ό ν•΄λ³΄μ•„μ•Όν•œλ‹€.

즉, λ‘λ²ˆμ§Έ ν”Όμ—°μ‚°μžμΈ ν”Όμ—°μ‚°μž 2κ°€ 논리곱 μ—°μ‚°μ˜ κ²°κ³Όλ₯Ό κ²°μ •ν•œλ‹€κ³  λ³Ό 수 μžˆλ‹€. 

 

그런데 μ΄λ•Œ ν”Όμ—°μ‚°μž 1이 false 라면, ν”Όμ—°μ‚°μž 2의 κ²°κ³Όμ™€λŠ” 관계없이 논리곱 μ—°μ‚°μ˜ κ²°κ³Όκ°€ falseκ°€ λœλ‹€.

논리곱(&&) 연산은 두 ν”Όμ—°μ‚°μžκ°€ λͺ¨λ‘ trueμ΄μ—¬μ•Όν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

논리합(||) μ—°μ‚°

논리합(||) μ—°μ‚°μžλŠ” 두 ν”Όμ—°μ‚°μž 쀑 ν•˜λ‚˜λΌλ„ true 일 λ•Œ, trueλ₯Ό λ°˜ν™˜ν•œλ‹€.

논리곱 μ—°μ‚°μžμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μ’Œν•­μ—μ„œ μš°ν•­μœΌλ‘œ ν‰κ°€λœλ‹€.

 

(ν”Όμ—°μ‚°μž 1) || (ν”Όμ—°μ‚°μž 2) κ°€ μžˆλ‹€κ³  ν•  λ•Œ, ν”Όμ—°μ‚°μž 1이 true라면 λ‘λ²ˆμ§Έ ν”Όμ—°μ‚°μžμΈ ν”Όμ—°μ‚°μž 2λ₯Ό ν‰κ°€ν•˜μ§€ μ•Šμ•„λ„ 이 ν‘œν˜„μ‹μ΄ true라고 평가할 수 μžˆλ‹€.

그런데 μ΄λ•Œ ν”Όμ—°μ‚°μž 1이 false 라면, ν”Όμ—°μ‚°μž 2λ₯Ό ν‰κ°€ν•΄μ•Όμ§€λ§Œ 이 ν‘œν˜„μ‹μ˜ κ²°κ³Όλ₯Ό ν™•μ •ν•  수 μžˆλ‹€. 

논리합 μ—°μ‚°μžλŠ” λ‘˜ 쀑 ν•˜λ‚˜λΌλ„ trueλ©΄ trueλ₯Ό λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

논리곱(&&) μ—°μ‚°μžμ™€ 논리합(||) μ—°μ‚°μžμ˜ 단좕 평가

그럼 논리곱, 논리합 μ—°μ‚°μžμ˜ 단좕 평가가 μ–΄λ–»κ²Œ μ΄λ€„μ§€λŠ”μ§€ μ•Œμ•„λ³΄μž.

 

결둠을 λ§ν•˜μžλ©΄,

논리곱(&&) μ—°μ‚°μžλŠ” 첫번째 ν”Όμ—°μ‚°μžκ°€ false λ©΄, 이후 ν”Όμ—°μ‚°μžμ— λŒ€ν•΄μ„œλŠ” 평가λ₯Ό ν•˜μ§€ μ•Šκ³ ,

논리합(||) μ—°μ‚°μžλŠ” 첫번째 ν”Όμ—°μ‚°μžκ°€ true λ©΄, 이후 ν”Όμ—°μ‚°μžμ— λŒ€ν•΄μ„œλŠ” 평가λ₯Ό ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

λ‹€μŒ 예제둜 μžμ„Ένžˆ μ•Œμ•„λ³΄μž.

1 == 0 : false
1 / 0 == 0 : Error

 

쑰건이 μœ„μ™€ 같이 μžˆλ‹€ν• λ•Œ, 각 κ²°κ³ΌλŠ” 1 == 0 은 false, 1 / 0 == 0 은 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

그럼 λ‘κ°œμ˜ ν”Όμ—°μ‚°μžλ‘œ ν‘œν˜„μ‹μ„ κ΅¬μ„±ν•΄μ„œ 논리곱 연산을 ν•˜λ©΄ μ–΄λ–»κ²Œ 될까?

1 == 0 && 1 / 0 == 0

μœ„ ν‘œν˜„μ‹μ—μ„œ λ‘λ²ˆμ§Έ ν”Όμ—°μ‚°μžμ— 1 / 0 은 μ—λŸ¬κ°€ λ°œμƒν•˜λ―€λ‘œ, μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šμ„κΉŒν•˜μ§€λ§Œ, κ²°κ³ΌλŠ” false 이닀!

논리곱(&&) μ—°μ‚°μžλŠ” μ’Œν•­λΆ€ν„° 연산을 ν•˜κ³ , 단좕 평가λ₯Ό ν•˜κΈ° λ•Œλ¬Έμ— 첫번째 ν”Όμ—°μ‚°μžκ°€ false 라면, λ‘λ²ˆμ§Έ ν”Όμ—°μ‚°μžμ— λŒ€ν•΄μ„œλŠ” 평가λ₯Ό ν•˜μ§€ μ•Šκ³  (κ²°κ³Όκ°€ ν™•μ •λ˜μ—ˆκΈ° λ•Œλ¬Έ) false λ₯Ό λ°˜ν™˜ν•œλ‹€. 

λ‘λ²ˆμ§Έ ν”Όμ—°μ‚°μžμ— κ΄€λ ¨λœ μ½”λ“œλŠ” μ‹€ν–‰ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ Dead Codeκ°€ λœλ‹€.

*Dead Code: μ‹€ν–‰λ˜μ§€ μ•ŠλŠ” μ½”λ“œ

 

논리합(||) μ—°μ‚°μžλ„ λ§ˆμ°¬κ°€μ§€λ‘œ λ‹€μŒ 예제둜 μ‚΄νŽ΄λ³΄μž.

1 == 0 || 1 / 0 == 0

μ΄λ•ŒλŠ” 첫번째 ν”Όμ—°μ‚°μžκ°€ false 이고, κ²°κ³Όκ°€ ν™•μ •λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ 1 / 0 == 0 κΉŒμ§€ 연산을 μˆ˜ν–‰ν•˜κ²Œ λ˜μ–΄μ„œ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

1 == 1 || 1 / 0 == 0

λ§Œμ•½ 첫번째 ν”Όμ—°μ‚°μžκ°€ 1 == 1둜, κ²°κ³Όκ°€ true 라면, λ‘λ²ˆμ§Έ ν”Όμ—°μ‚°μžλ₯Ό ν‰κ°€ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 결과둜 trueκ°€ λ°˜ν™˜λœλ‹€.

논리합(||) μ—°μ‚°μžλ„ μ’Œν•­λΆ€ν„° 연산을 μˆ˜ν–‰ν•˜κ³  단좕 평가λ₯Ό ν•˜κΈ° λ•Œλ¬Έμ— μ•žμ„  연산이 true 라면 κ²°κ³Όκ°€ ν™•μ •λ˜μ–΄ 이후 연산을 μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€.

λ§ˆμ°¬κ°€μ§€λ‘œ λ‘λ²ˆμ§Έ ν”Όμ—°μ‚°μžμ— κ΄€λ ¨λœ μ½”λ“œλŠ” μ‹€ν–‰ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ Dead Codeκ°€ λœλ‹€.

 

단좕 평가 κ·œμΉ™

단좕 ν‰κ°€μ˜ κ·œμΉ™μ€ μ•„λž˜ ν‘œμ™€ κ°™λ‹€.

단좕 평가 ν‘œν˜„μ‹ κ²°κ³Ό
true && anything anything
false && anything false
true || anything true
false || anything anything

 

단좕 ν‰κ°€μ˜ 이점

단좕 ν‰κ°€μ˜ 이점은 νš¨μœ¨μ„± ν–₯상에 λ”°λ₯Έ μ„±λŠ₯ ν–₯상에 μžˆλ‹€.

논리 μ—°μ‚° μˆ˜ν–‰μ‹œ κ²°κ³Όκ°€ 이미 κ²°μ •λœ 경우 λ‚˜λ¨Έμ§€ 뢀뢄을 μˆ˜ν–‰ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λΆˆν•„μš”ν•œ 계산을 μƒλž΅ν•˜μ—¬ νš¨μœ¨μ„±μ„ 높인닀. μ΄λŠ” 특히 연산을 많이 μˆ˜ν–‰ν•˜λŠ” λ©”μ„œλ“œλ‚˜ I/O μž‘μ—…μ΄ ν¬ν•¨λœ κ²½μš°μ— 이점이 컀진닀.

boolean result = (condition1 && condition2); // condition1이 false라면 condition2λŠ” ν‰κ°€λ˜μ§€ μ•ŠμŒ

 

그리고 λ‹¨μΆ• ν‰κ°€λŠ” νŠΉμ • μ‘°κ±΄μ—μ„œλ§Œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ±°λ‚˜ 연산을 μˆ˜ν–‰ν•˜κ³ μž ν•  λ•Œ μœ μš©ν•˜κ²Œ 쓰인닀.

if (obj != null && obj.someMethod()) {
	// objκ°€ null이 μ•„λ‹Œ κ²½μš°μ—λ§Œ obj.someMethod()κ°€ 호좜	
}

 

λ˜ν•œ νŠΉμ • 연산을 μ‹€μ œλ‘œ ν•„μš”ν•œ κ²½μš°μ—λ§Œ μˆ˜ν–‰ν•˜κ²Œλ” ν•œλ‹€.

if (condition && someMethod()) {
	// someMethod()λŠ” condition이 true인 κ²½μš°μ—λ§Œ 호좜
}

 

μ΄λŠ” λ°°μ—΄μ΄λ‚˜ 리슀트 같은 자료 ꡬ쑰λ₯Ό μ ‘κ·Όν•  λ•Œ λ²”μœ„ μ²΄ν¬μ‹œμ—λ„ μœ μš©ν•˜λ‹€.

if (idx < array.length && array[idx] == target) {
	// array[idx]에 μ•ˆμ „ν•œ μ ‘κ·Ό κ°€λŠ₯
}

마치며,

단좕 평가λ₯Ό λͺ¨λ₯Έλ‹€λ©΄ μ½”λ“œ κ΅¬ν˜„μ‹œ μ˜λ„ν•œλŒ€λ‘œ κ²°κ³Όκ°€ λ‚˜μ˜€μ§€ μ•Šκ±°λ‚˜, λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” λ“±μ˜ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆκ² λ‹€.

이번 기회λ₯Ό 톡해 단좕 평가λ₯Ό 잘 μ •λ¦¬ν•œ 것 κ°™λ‹€.

그리고 Java μΉ΄ν…Œκ³ λ¦¬λ‘œ λΆ„λ₯˜ν•˜κΈ΄ ν–ˆμ§€λ§Œ, 단좕 ν‰κ°€λŠ” λŒ€λΆ€λΆ„μ˜ μ£Όμš” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ§€μ›ν•œλ‹€κ³  ν•œλ‹€.

 

μ°Έκ³  ν¬μŠ€νŒ…

 

[JavaScript] 단좕 평가

μ˜€λŠ˜μ€ 단좕 평가에 λŒ€ν•΄ μ•Œμ•„λ³΄μž [ 논리 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œ 단좕 평가 ] 논리 ν•© (| |) λ˜λŠ” 논리 κ³± (&&) μ—°μ‚°μž ν‘œν˜„μ‹μ€ μ–Έμ œλ‚˜ 2개의 ν”Όμ—°μ‚°μž 쀑 μ–΄λŠ ν•œμͺ½μœΌλ‘œ ν‰κ°€λœλ‹€. λ‹€μŒ 예제λ₯Ό μ‚΄νŽ΄λ³΄μž

despiteallthat.tistory.com