JAVA/μ•Œμ•„λ‘λ©΄ 쒋을 지식

[JAVA] '=='κ³Ό 'equals()'의 μ°¨μ΄λŠ” λ¬΄μ—‡μΌκΉŒ?

육볡 2020. 2. 27. 21:51

==? equals()?


기본적으둜 이 λ‘˜μ€ μ–‘μͺ½μ— μœ„μΉ˜ν•œ κ°’ ν˜Ήμ€ 객체λ₯Ό λΉ„κ΅ν•œ 값을 boolean type으둜 λ°˜ν™˜ν•œλ‹€λŠ” 곡톡점을 κ°€μ§‘λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ •μž‘ String μ°Έμ‘°λ³€μˆ˜μ— 같은 κ°’μœΌλ‘œ μ΄ˆκΈ°ν™” μ‹œμΌœ λ†“μ€μ±„λ‘œ, '==' μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜μ—¬ 비ꡐλ₯Ό 해보면 늘 falseλ₯Ό λ°˜ν™˜ν•˜κ²Œ λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ²°κ³Όλ₯Ό 봀을 λ•Œ == μ—°μ‚°μžμ™€ equals() λ©”μ„œλ“œ μ‚¬μ΄μ—λŠ” 큰 차이점이 μžˆλŠ” 것이 ν™•μ‹€ν•©λ‹ˆλ‹€. λ”°λΌμ„œ  성곡적인 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” 이 λ‘˜μ˜ 차이점을 μ•Œμ•„μ•Όλ§Œ ν•©λ‹ˆλ‹€.

 

 

Call By Reference, Call By Value


== μ—°μ‚°μžμ™€ equals() λ©”μ„œλ“œ μ‚¬μ΄μ˜ κ°€μž₯ μ€‘μš”ν•œ 차이점을 μ•ŒκΈ° μœ„ν•΄μ„œλŠ” Call By Reference(μ΄ν•˜ CBR), Call By Value(μ΄ν•˜ CBV) 에 λŒ€ν•΄ ν™•μ‹€ν•˜κ²Œ 이해λ₯Ό ν•˜κ³  μžˆμ–΄μ•Όλ§Œ ν•©λ‹ˆλ‹€. κ°„λ‹¨νžˆ μ„€λͺ…ν•˜μžλ©΄ CBR은 μ–΄λ– ν•œ λŒ€μƒμ„ λΆˆλ €μ„ λ•Œ μ°Έμ‘°κ°’, 즉 μ£Όμ†Œκ°’μ„ λΆˆλŸ¬μ˜¨λ‹€λŠ” 의미이며 CBVλŠ” μ£Όμ†Œκ°’μ΄ μ•„λ‹Œ λŒ€μƒμ΄ κ°€μ§€κ³  μžˆλŠ” κ°’ 자체λ₯Ό κ°€μ Έμ˜¨λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. 

 

이 CBRκ³Ό CBV의 λŒ€ν‘œμ μΈ μ˜ˆλ‘œλŠ” μ°Έμ‘° νƒ€μž… λ³€μˆ˜μ™€ κΈ°λ³Έ νƒ€μž… λ³€μˆ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. κΈ°λ³Έ νƒ€μž… λ³€μˆ˜λŠ” CBV이며 μ°Έμ‘° νƒ€μž… λ³€μˆ˜λŠ” CBRμž…λ‹ˆλ‹€. λ”°λΌμ„œ 보톡 λ©”μ„œλ“œμ— λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κ²¨μ£Όκ²Œ 되면, μ°Έμ‘° νƒ€μž… λ³€μˆ˜λŠ” μžμ‹ μ˜ μ£Όμ†Œκ°’μ„ λ„˜κ²¨μ£Όκ²Œ 되며 κΈ°λ³Έ νƒ€μž… λ³€μˆ˜λŠ” μžμ‹ μ΄ κ°€μ§€κ³  μžˆλŠ” κ°’ 자체λ₯Ό λ³΅μ‚¬ν•˜μ—¬ λ„˜κ²¨μ£Όκ²Œ λ©λ‹ˆλ‹€. 

 

μ΄λŸ¬ν•œ 이유둜 λ§Œμ•½ μ°Έμ‘° νƒ€μž… λ³€μˆ˜λ₯Ό 인자둜 λ°›μ•„ μ‚¬μš©ν•˜κ²Œ 되면, λ©”μ„œλ“œ μ§€μ—­ λ‚΄μ—μ„œλ§Œ 값이 λ°”λ€ŒλŠ” 것이 μ•„λ‹ˆλΌ λ„˜κ²¨μ€€ λ³€μˆ˜ κ·Έ μžμ²΄μ—μ„œλ„ 값이 λ°”λ€Œκ²Œ λ©λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ μ£Όμ†Œμ— μ ‘κ·Όν•˜μ—¬ 값을 λ°”κΏ¨κΈ° λ•Œλ¬Έμ΄μ£ . κ·Έ λ°˜λŒ€λ‘œ κΈ°λ³Έ νƒ€μž… λ³€μˆ˜λŠ” λ³΅μ‚¬ν•œ 데이터λ₯Ό λ°”κΎΌ 것이기 λ•Œλ¬Έμ— λ„˜κ²¨μ€€ λ³€μˆ˜ κ·Έ μžμ²΄λŠ” 값이 λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 

 

잘λͺ»λœ 정보λ₯Ό μž‘μ„±ν–ˆλ˜ 것 κ°™μŠ΅λ‹ˆλ‹€. Kotlin μͺ½μ„ κ³΅λΆ€ν•˜λ‹€κ°€ μ±…μ—μ„œ μ•Œκ²Œλœ 사싀인데, JavaλŠ” CBR이 μ•„λ‹Œ CBVκ°€ 일반적이라고 ν•©λ‹ˆλ‹€.Javaμ—μ„œ μΈμŠ€ν„΄μŠ€κ°€ 전달될 λ•Œ CBR처럼 λ³΄μ΄μ§€λ§Œ, λ„˜κ²¨μ§€λŠ” 값이 λ³΅μ‚¬λ˜μ–΄μ§„ μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†ŒμΌ λΏμž…λ‹ˆλ‹€. λ”°λΌμ„œ 객체 전달 λ˜ν•œ CBV μž…λ‹ˆλ‹€.

참고둜 Cμ–Έμ–΄μ—μ„œ μ‚¬μš©λ˜λŠ” 포인터 λ³€μˆ˜ λ˜ν•œ μ£Όμ†Œ 값이 λ³΅μ‚¬λ˜μ–΄μ„œ λ„˜μ–΄κ°€λŠ” Call by Value λ°©μ‹μž…λ‹ˆλ‹€. Cμ–Έμ–΄μ—μ„œ λ˜ν•œ Call by Reference 방식을 κ³΅μ‹μ μœΌλ‘œ μ§€μ›ν•˜μ§€λŠ” μ•Šμ£ . κ·ΈλŸ¬λ‚˜ 의미적, 결과적으둜 Call by Reference와 같이 μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— Call by Referenceλ‹€! 라고 μ„€λͺ…ν•˜λŠ” 곳도 λ§ŽμŠ΅λ‹ˆλ‹€.

==과 equals의 차이점


==κ³Ό equals의 비ꡐ λ°©μ‹μ˜ 차이점은 μœ„μ—μ„œ μ–ΈκΈ‰ν•œ CBRκ³Ό CBV에 κ°€μž₯ 큰 연관이 μžˆμŠ΅λ‹ˆλ‹€. equals λ©”μ†Œλ“œλŠ” λΉ„κ΅ν•˜κ³ μž ν•˜λŠ” λŒ€μƒμ˜ λ‚΄μš© 자체λ₯Ό λΉ„κ΅ν•˜μ§€λ§Œ == μ—°μ‚°μžλŠ” λΉ„κ΅ν•˜κ³ μž ν•˜λŠ” λŒ€μƒμ˜ μ£Όμ†Œκ°’μ„ λΉ„κ΅ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μœ„μ—μ„œ μ–ΈκΈ‰ν•œ String λ³€μˆ˜ κ°„μ˜ λΉ„κ΅μ—μ„œ ==을 μ‚¬μš©ν•˜κ²Œ 되면 μ£Όμ†Œκ°’μ΄ λ‹€λ₯΄λ‹ˆ 항상 falseλ₯Ό 리턴할 수 밖에 μ—†λŠ” 것이죠. ν•˜μ§€λ§Œ κ·Έ λ°˜λŒ€λ‘œ equals()λ₯Ό μ‚¬μš©ν•˜κ²Œ 되면 ν•΄λ‹Ή 객체가 κ°€μ§€κ³  μžˆλŠ” 값을 λΉ„κ΅ν•˜κΈ° λ•Œλ¬Έμ— μ£Όμ†Œκ°€ 달라도 같은 값을 κ°€μ§€κ³  μžˆλŠ” String λ³€μˆ˜ κ°„μ˜ λΉ„κ΅λŠ” 무쑰건 trueλ₯Ό λ¦¬ν„΄ν•˜κ²Œ λ©λ‹ˆλ‹€.