Skip to content

Latest commit

Β 

History

History
174 lines (138 loc) Β· 9.07 KB

File metadata and controls

174 lines (138 loc) Β· 9.07 KB

Object ν΄λž˜μŠ€μ— λŒ€ν•œ 정리

예, equals λ©”μ„œλ“œλŠ” java.lang.Object ν΄λž˜μŠ€μ— μ •μ˜λ˜μ–΄ μžˆλŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.

Object ν΄λž˜μŠ€λŠ” μžλ°”μ—μ„œ λͺ¨λ“  클래슀의 μ΅œμƒμœ„ λΆ€λͺ¨ 클래슀이며, λͺ¨λ“  κ°μ²΄λŠ” μ•”μ‹œμ μœΌλ‘œ Objectλ₯Ό μƒμ†λ°›μŠ΅λ‹ˆλ‹€. Object ν΄λž˜μŠ€λŠ” μžλ°” 객체듀이 κ³΅ν†΅μ μœΌλ‘œ κ°€μ Έμ•Ό ν•  κΈ°λ³Έ λ©”μ„œλ“œλ“€μ„ μ •μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.


Object 클래슀의 μ£Όμš” λ©”μ„œλ“œλ“€:

  1. public boolean equals(Object obj)
    • μ—­ν• : 두 객체의 동등성을 λΉ„κ΅ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
    • κΈ°λ³Έ κ΅¬ν˜„: 두 객체의 **μ°Έμ‘°(λ©”λͺ¨λ¦¬ μ£Όμ†Œ)**λ₯Ό λΉ„κ΅ν•˜μ—¬ λ™μΌν•œ 객체인지 ν™•μΈν•©λ‹ˆλ‹€.
    • μ˜€λ²„λΌμ΄λ“œ ν•„μš”μ„±: 객체의 **λ‚΄μš©(속성 κ°’)**을 κΈ°μ€€μœΌλ‘œ λΉ„κ΅ν•˜λ €λ©΄ 이 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•΄μ•Ό ν•©λ‹ˆλ‹€.
  2. public int hashCode()
    • μ—­ν• : 객체의 ν•΄μ‹œ μ½”λ“œλ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
    • μ‚¬μš© 이유: ν•΄μ‹œ 기반 μ»¬λ ‰μ…˜(HashMap, HashSet λ“±)μ—μ„œ 객체λ₯Ό 효율적으둜 κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.
    • μ˜€λ²„λΌμ΄λ“œ ν•„μš”μ„±: equalsλ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜λ©΄ hashCode도 ν•¨κ»˜ μ˜€λ²„λΌμ΄λ“œν•΄μ•Ό ν•©λ‹ˆλ‹€.
  3. public String toString()
    • μ—­ν• : 객체의 λ¬Έμžμ—΄ ν‘œν˜„μ„ λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
    • κΈ°λ³Έ κ΅¬ν˜„: 클래슀 이름과 ν•΄μ‹œ μ½”λ“œλ₯Ό ν¬ν•¨ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • μ˜€λ²„λΌμ΄λ“œ ν•„μš”μ„±: 객체의 μœ μš©ν•œ 정보λ₯Ό ν¬ν•¨ν•˜λ„λ‘ μ˜€λ²„λΌμ΄λ“œν•˜λŠ” 것이 μΌλ°˜μ μž…λ‹ˆλ‹€.
  4. protected Object clone() throws CloneNotSupportedException
    • μ—­ν• : 객체의 λ³΅μ œλ³Έμ„ λ§Œλ“œλŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
    • μ‚¬μš© 쑰건: Cloneable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.
    • μ£Όμ˜μ‚¬ν•­: κΉŠμ€ 볡사와 얕은 볡사λ₯Ό κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  5. public final void wait(), wait(long timeout), wait(long timeout, int nanos)
    • μ—­ν• : ν˜„μž¬ μŠ€λ ˆλ“œλ₯Ό μΌμ‹œ μ •μ§€ν•˜κ³  λ‹€λ₯Έ μŠ€λ ˆλ“œμ—μ„œ notify()λ‚˜ notifyAll()을 ν˜ΈμΆœν•  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•©λ‹ˆλ‹€.
    • μ‚¬μš© 쑰건: λ°˜λ“œμ‹œ λ™κΈ°ν™”λœ μ»¨ν…μŠ€νŠΈ(synchronized 블둝 λ˜λŠ” λ©”μ„œλ“œ) λ‚΄μ—μ„œ ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.
  6. public final void notify()
    • μ—­ν• : wait()에 μ˜ν•΄ λŒ€κΈ° 쀑인 μŠ€λ ˆλ“œ 쀑 ν•˜λ‚˜λ₯Ό κΉ¨μ›λ‹ˆλ‹€.
    • μ‚¬μš© 쑰건: λ™κΈ°ν™”λœ μ»¨ν…μŠ€νŠΈ λ‚΄μ—μ„œ ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.
  7. public final void notifyAll()
    • μ—­ν• : wait()에 μ˜ν•΄ λŒ€κΈ° 쀑인 λͺ¨λ“  μŠ€λ ˆλ“œλ₯Ό κΉ¨μ›λ‹ˆλ‹€.
    • μ‚¬μš© 쑰건: λ™κΈ°ν™”λœ μ»¨ν…μŠ€νŠΈ λ‚΄μ—μ„œ ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.
  8. protected void finalize() throws Throwable
    • μ—­ν• : 객체가 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜λ  λ•Œ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
    • μ£Όμ˜μ‚¬ν•­: μžλ°” 9λΆ€ν„°λŠ” 더 이상 μ‚¬μš©μ΄ ꢌμž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(deprecated).

Object 클래슀의 ꡬ쑰와 μ—­ν• :

  • νŒ¨ν‚€μ§€: java.lang
  • μ ‘κ·Ό μ œμ–΄μž: public class Object
  • 상속 관계: μžλ°”μ—μ„œ λͺ¨λ“  클래슀의 μ΅œμƒμœ„ λΆ€λͺ¨ 클래슀이며, λ‹€λ₯Έ 클래슀λ₯Ό 상속받지 μ•ŠμŠ΅λ‹ˆλ‹€.

μ—­ν• :

  • κΈ°λ³Έ λ©”μ„œλ“œ 제곡: λͺ¨λ“  객체가 κ°€μ Έμ•Ό ν•  κΈ°λ³Έ λ©”μ„œλ“œ(equals, hashCode, toString λ“±)λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • 동기화 λ©”μ»€λ‹ˆμ¦˜ 지원: μŠ€λ ˆλ“œ 동기화λ₯Ό μœ„ν•œ λ©”μ„œλ“œ(wait, notify, notifyAll)λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

equals λ©”μ„œλ“œμ˜ 상세 μ„€λͺ…:

  • λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜:

    public boolean equals(Object obj)
  • κΈ°λ³Έ κ΅¬ν˜„:

    • this == obj와 같이 μ°Έμ‘° 비ꡐλ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.
    • 즉, 두 객체가 λ™μΌν•œ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 가리킬 λ•Œλ§Œ trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μ˜€λ²„λΌμ΄λ“œ 이유:

    • 객체의 λ‚΄μš©μ„ λΉ„κ΅ν•˜μ—¬ λ…Όλ¦¬μ μœΌλ‘œ λ™λ“±ν•œμ§€λ₯Ό νŒλ‹¨ν•˜λ €λ©΄ equals λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • μ˜€λ²„λΌμ΄λ“œ μ‹œ μ§€μΌœμ•Ό ν•  계약:

    1. λ°˜μ‚¬μ„±(reflexive): x.equals(x)λŠ” 항상 trueμ—¬μ•Ό ν•©λ‹ˆλ‹€.
    2. λŒ€μΉ­μ„±(symmetric): x.equals(y)κ°€ true이면 y.equals(x)도 trueμ—¬μ•Ό ν•©λ‹ˆλ‹€.
    3. 좔이성(transitive): x.equals(y)와 y.equals(z)κ°€ true이면 x.equals(z)도 trueμ—¬μ•Ό ν•©λ‹ˆλ‹€.
    4. 일관성(consistent): 객체의 μƒνƒœκ°€ λ³€κ²½λ˜μ§€ μ•Šμ•˜λ‹€λ©΄, μ—¬λŸ¬ 번 ν˜ΈμΆœν•΄λ„ κ²°κ³ΌλŠ” 동일해야 ν•©λ‹ˆλ‹€.
    5. null과의 비ꡐ: x.equals(null)은 항상 falseμ—¬μ•Ό ν•©λ‹ˆλ‹€.
  • μ˜ˆμ‹œ:

    public class Person {
        private String name;
        private int age;
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null || getClass() != obj.getClass())
                return false;
            Person other = (Person) obj;
            return age == other.age && Objects.equals(name, other.name);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(name, age);
        }
    }
    • μœ„ μ˜ˆμ‹œμ—μ„œ nameκ³Ό ageκ°€ κ°™μœΌλ©΄ 같은 객체둜 νŒλ‹¨ν•˜λ„λ‘ equalsλ₯Ό μ˜€λ²„λΌμ΄λ“œν–ˆμŠ΅λ‹ˆλ‹€.
    • hashCode도 ν•¨κ»˜ μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ equalsμ™€μ˜ 계약을 μ§€μΌ°μŠ΅λ‹ˆλ‹€.

Object 클래슀의 λ‹€λ₯Έ λ©”μ„œλ“œλ“€μ˜ 상세 μ„€λͺ…:

  1. hashCode()
    • μ—­ν• : 객체의 ν•΄μ‹œ μ½”λ“œλ₯Ό λ°˜ν™˜ν•˜λ©°, ν•΄μ‹œ 기반 μ»¬λ ‰μ…˜μ—μ„œ 객체λ₯Ό μ €μž₯ν•˜κ±°λ‚˜ 검색할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
    • μ˜€λ²„λΌμ΄λ“œ μ‹œ μ£Όμ˜μ‚¬ν•­: equalsκ°€ 같은 두 κ°μ²΄λŠ” λ™μΌν•œ hashCodeλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  2. toString()
    • μ—­ν• : 객체의 λ¬Έμžμ—΄ ν‘œν˜„μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • μ˜€λ²„λΌμ΄λ“œ 이유: 객체의 μœ μš©ν•œ 정보λ₯Ό ν¬ν•¨ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜μ—¬ 디버깅 및 λ‘œκΉ…μ— ν™œμš©ν•©λ‹ˆλ‹€.

    • μ˜ˆμ‹œ:

      @Override
      public String toString() {
          return "Person{name='" + name + "', age=" + age + "}";
      }
  3. 동기화 κ΄€λ ¨ λ©”μ„œλ“œ
    • wait(), notify(), notifyAll()
      • μ—­ν• : μŠ€λ ˆλ“œ κ°„ 톡신을 μœ„ν•œ λ©”μ„œλ“œμž…λ‹ˆλ‹€.

      • μ‚¬μš© 방법:

        synchronized (lock) {
            while (쑰건) {
                lock.wait();
            }
            // μž‘μ—… μˆ˜ν–‰
        }
      • μ£Όμ˜μ‚¬ν•­: λ°˜λ“œμ‹œ synchronized 블둝 λ‚΄μ—μ„œ ν˜ΈμΆœν•΄μ•Ό ν•˜λ©°, κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ IllegalMonitorStateException이 λ°œμƒν•©λ‹ˆλ‹€.


μ€‘μš”ν•œ κ°œλ…λ“€:

  • equals와 hashCode의 관계:
    • 계약: 두 객체가 equals에 μ˜ν•΄ κ°™λ‹€λ©΄, λ™μΌν•œ hashCodeλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
    • 이유: ν•΄μ‹œ 기반 μ»¬λ ‰μ…˜(HashMap, HashSet λ“±)은 hashCodeλ₯Ό 기반으둜 객체λ₯Ό κ΄€λ¦¬ν•˜λ―€λ‘œ, 이 계약을 μ§€ν‚€μ§€ μ•ŠμœΌλ©΄ μ˜ˆμƒμΉ˜ λͺ»ν•œ λ™μž‘μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • toString λ©”μ„œλ“œμ˜ ν™œμš©:
    • 객체의 ν˜„μž¬ μƒνƒœλ₯Ό μ‚¬λžŒμ΄ μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ ν˜•νƒœλ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€.
    • 디버깅, λ‘œκΉ…, UI 좜λ ₯ λ“± λ‹€μ–‘ν•œ κ³³μ—μ„œ ν™œμš©λ©λ‹ˆλ‹€.
  • μŠ€λ ˆλ“œ 동기화와 Object 클래슀:
    • λͺ¨λ“  κ°μ²΄λŠ” κ³ μœ ν•œ λͺ¨λ‹ˆν„° 락(monitor lock)을 κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€.
    • synchronized ν‚€μ›Œλ“œλ₯Ό 톡해 객체의 λͺ¨λ‹ˆν„° 락을 νšλ“ν•˜μ—¬ λ™κΈ°ν™”λœ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • wait, notify, notifyAll λ©”μ„œλ“œλŠ” μ΄λŸ¬ν•œ λ™κΈ°ν™”λœ μ»¨ν…μŠ€νŠΈμ—μ„œ μŠ€λ ˆλ“œ κ°„μ˜ 톡신을 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.

κ²°λ‘ :

java.lang.Object ν΄λž˜μŠ€λŠ” μžλ°”μ—μ„œ λͺ¨λ“  클래슀의 μ΅œμƒμœ„ λΆ€λͺ¨λ‘œμ„œ, 객체가 기본적으둜 κ°€μ Έμ•Ό ν•  λ©”μ„œλ“œλ“€μ„ μ œκ³΅ν•©λ‹ˆλ‹€. equals λ©”μ„œλ“œλŠ” Object ν΄λž˜μŠ€μ— μ •μ˜λ˜μ–΄ 있으며, 기본적으둜 μ°Έμ‘° 비ꡐλ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λŒ€λΆ€λΆ„μ˜ 경우 객체의 λ‚΄μš© 비ꡐ가 ν•„μš”ν•˜λ―€λ‘œ, equals λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ μ›ν•˜λŠ” λ™μž‘μ„ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ˜ν•œ, hashCode, toString, μŠ€λ ˆλ“œ 동기화λ₯Ό μœ„ν•œ λ©”μ„œλ“œλ“€λ„ μ œκ³΅ν•˜μ—¬ 객체의 λ™μž‘μ„ μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•˜κ³  μŠ€λ ˆλ“œ μ•ˆμ „ν•œ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  수 있게 ν•©λ‹ˆλ‹€.


μΆ”κ°€ μ°Έκ³  자료:


μš”μ•½:

  • equalsλŠ” Object ν΄λž˜μŠ€μ— μ •μ˜λœ λ©”μ„œλ“œλ‘œ, 객체의 동등성을 λΉ„κ΅ν•©λ‹ˆλ‹€.
  • Object ν΄λž˜μŠ€λŠ” λͺ¨λ“  클래슀의 λΆ€λͺ¨μ΄λ©°, 곡톡 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • ν•„μš”μ— 따라 equals, hashCode, toString 등을 μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ 객체의 μ›ν•˜λŠ” λ™μž‘μ„ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μŠ€λ ˆλ“œ 동기화와 κ΄€λ ¨λœ λ©”μ„œλ“œλ“€λ„ μ œκ³΅ν•˜μ—¬ λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œμ˜ μ•ˆμ „ν•œ ν”„λ‘œκ·Έλž˜λ°μ„ μ§€μ›ν•©λ‹ˆλ‹€.