equals()

equals()λŠ” 객체의 동등성을 νŒλ‹¨ν•œλ‹€.

두 객체가 κ°™μ€μ§€λŠ” μ–΄λ–»κ²Œ 확인할것인가? μ‚¬λžŒλ§ˆλ‹€ 기쀀이 λ‹€λ₯Όκ²ƒμ΄λ‹€.

μ–΄λ–€ μ‚¬λžŒμ€ 볼의 numberκ°€ κ°™μœΌλ©΄ 같은 객체둜 λ³Έλ‹€κ³  ν•œλ‹€. 그럼 이 μΈμŠ€ν„΄μŠ€κ°€ κ°€μ§€κ³  μžˆλŠ” κ°’(value)을 κ°€μ§€λŠ”μ§€λ₯Ό λ³Έλ‹€λŠ” μ–˜κΈ°μ΄λ‹€. 즉, eqauls() λ©”μ†Œλ“œλŠ” 같은 μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜λŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” 것이 μ•„λ‹ˆλΌ 같은 값인지λ₯Ό λΉ„κ΅ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©ν•œλ‹€. ν•˜μ§€λ§Œ 값이 같은지에 λŒ€ν•œ 기쀀이 ν•„μš”ν•  것이닀.

  • λ”°λΌμ„œ 기쀀을 μ •ν•˜κΈ° μœ„ν•΄μ„œ equals() λ©”μ†Œλ“œλŠ” λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ”© ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

동등성 : 객체의 μ£Όμ†Œκ°’μ΄ λ‹€λ₯΄λ”라도 κ°’(ν•„λ“œ κ°’)이 κ°™λ‹€λ©΄ κ°™λ‹€κ³  νŒλ‹¨ν•˜λŠ” 것

예제

public class Ball {
    private int number;

    public Ball(String number) {
        this.number = Integer.parseInt(number);
		}
}

@Test
@DisplayName("같은 객체λ₯Ό equals 비ꡐ")
void equals() {
    Ball ball = new Ball("1");
    Ball ball2 = new Ball("1");

    Assertions.assertThat(ball).isEqualTo(ball2);
}

// fail
Expected :Ball@25a65b77
Actual   :Ball@240237d2

μœ„ μ½”λ“œμ—μ„œ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄ ν…ŒμŠ€νŠΈλŠ” μ‹€νŒ¨ν•œλ‹€. κ·Έ μ΄μœ λŠ” 두 객체의 μ£Όμ†Œκ°’μ΄ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€.

κ²°λ‘ λΆ€ν„° μ–˜κΈ°ν•˜λ©΄, μ˜€λ²„λΌμ΄λ”© λ˜μ§€ μ•Šμ€ equals() λ©”μ†Œλ“œλŠ” μ£Όμ†Œκ°’μ΄ λ‹€λ₯Έ κ°μ²΄λŠ” μ„œλ‘œ λ‹€λ₯Έ 객체둜 νŒλ‹¨ν•˜κ³  μžˆλ‹€.

μ›λž˜ equals() λ©”μ†Œλ“œλŠ” μ£Όμ†Œκ°’μ„ λΉ„κ΅ν•˜λŠ” κΈ°λŠ₯이닀 (==와 λ™μΌν•˜λ‹€.)

μžλ°”μ—μ„œ μ΅œμƒμœ„ 클래슀인 였브젝트 클래슀의 equals()λŠ” 비ꡐ μ—°μ‚°μžμΈ ==κ³Ό λ™μΌν•œ κ²°κ³Όλ₯Ό λ¦¬ν„΄ν•œλ‹€. μ°Έμ‘°(μ£Όμ†Œ)값이 같은지λ₯Ό λ³Έλ‹€λŠ” 것이닀.

그럼 λ‹€μ‹œ μœ„μ˜ μ½”λ“œλ₯Ό 봀을 λ•Œ, 두 Ball의 객체가 κ°€μ§€κ³  μžˆλŠ” ν•„λ“œ 값은 1이닀. 두 객체가 κ°™κ²Œ ν•˜λ €λ©΄ equals()λ₯Ό μ˜€λ²„λΌμ΄λ”© ν•œλ‹€.

equals()λŠ” 그럼 μ–Έμ œ μ˜€λ²„λΌμ΄λ”© ν• κΉŒ?

  • 동등성 체크λ₯Ό ν•΄μ•Όν•˜λŠ”λ° μ˜€λ²„λΌμ΄λ”© λ˜μ–΄μžˆμ§€ μ•Šμ„ λ•Œ

  • 두 객체의 ν•„λ“œκ°’μ„ λΉ„κ΅ν•˜κ³  싢을 λ•Œ

  • equalsκ°€ 논리적 λ™μΉ˜μ„±μ„ ν™•μΈν•˜λ„λ‘ μž¬μ •μ˜ 해두면, κ·Έ μΈμŠ€ν„΄μŠ€ κ°’μ˜ 비ꡐ가 κ°€λŠ₯ν•˜κ³  Map의 key와 Set의 μ›μ†Œλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

    • Set μžλ£Œκ΅¬μ‘°λŠ” 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€. 즉, equals()λ₯Ό μž¬μ •μ˜ν•˜λ©΄ 쀑볡 없이 μ›μ†Œλ‘œ μ‚½μž… 될 것이닀.

μ˜€λ²„λΌμ΄λ”© ν•˜μ§€ μ•ŠλŠ” 경우

  • μΈμŠ€ν„΄μŠ€κ°€ λ‘˜ 이상 λ§Œλ“€μ§€μ§€ μ•ŠμŒμ„ 보μž₯ν•  λ•Œ

  • ex) Enum클래슀 같은 경우

    • 였직 ν•˜λ‚˜μ΄κΈ° λ•Œλ¬Έμ— 식별에 μ˜λ―Έκ°€ μ—†λ‹€.

equals() μ˜€λ²„λΌμ΄λ”© 방법

  1. == μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄ μž…λ ₯이 자기 μžμ‹ μ˜ 참쑰인지 ν™•μΈν•œλ‹€.

  2. instanceof μ—°μ‚°μžλ‘œ μž…λ ₯이 μ˜¬λ°”λ₯Έ νƒ€μž…μΈμ§€ ν™•μΈν•œλ‹€.

  3. μž…λ ₯을 μ˜¬λ°”λ₯Έ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ν•œλ‹€.(2λ²ˆμ—μ„œ instanceof 검사λ₯Ό ν–ˆμœΌλ‹ˆ 100% μ„±κ³΅ν•œλ‹€.)

  4. μž…λ ₯ 객체와 자기 μžμ‹ μ˜ λŒ€μ‘λ˜λŠ” '핡심' ν•„λ“œλ“€μ΄ λͺ¨λ‘ μΌμΉ˜ν•˜λŠ”μ§€ ν•˜λ‚˜μ”© κ²€μ‚¬ν•œλ‹€.

  5. equalsλ₯Ό μž¬μ •μ˜ν•  땐 hashCode도 λ°˜λ“œμ‹œ μž¬μ •μ˜ν•œλ‹€.

결둠은 equals()λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ°˜λ“œμ‹œ μž¬μ •μ˜ν•΄μ„œ μ‚¬μš©ν•΄μ•Όν•œλ‹€.

Last updated