Object class

java.lang νŒ¨ν‚€μ§€λŠ” μžλ°” ν”„λ‘œκ·Έλž˜λ°μ˜ κ°€μž₯ 기본이 λ˜λŠ” ν΄λž˜μŠ€λ“€μ„ ν¬ν•¨ν•œλ‹€.

  • import λ¬Έ 없이 μ‚¬μš© κ°€λŠ₯

  • λͺ¨λ“  클래슀의 졜고 μ‘°μƒμœΌλ‘œ, λͺ¨λ“  ν΄λž˜μŠ€λŠ” Object 클래슀의 멀버λ₯Ό μƒμ†λ°›μŒ

Object class method
description

protected Object clone()

객체 볡제

public boolean equals(Object obj)

객체의 λ‚΄μš©μ΄ 같은지 비ꡐ

protected void finalize()

객체 μ†Œλ©Έ 전에 호좜(κ°€λΉ„μ§€ 컬렉터에 μ˜ν•΄ 호좜)

public Class getClass()

객체의 클래슀 정보λ₯Ό λ‹΄κ³  μžˆλŠ” Class μΈμŠ€ν„΄μŠ€ λ°˜ν™˜

public int hashCode()

객체의 ν•΄μ‹œμ½”λ“œλ₯Ό λ°˜ν™˜

public String toString()

객체λ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜

public void notify()

객체 μžμ‹ μ„ μ‚¬μš©ν•˜λ €κ³  κΈ°λ‹€λ¦¬λŠ” μŠ€λ ˆλ“œλ₯Ό ν•˜λ‚˜λ§Œ 깨움

public void notifyAll()

객체 μžμ‹ μ„ μ‚¬μš©ν•˜λ €κ³  κΈ°λ‹€λ¦¬λŠ” μŠ€λ ˆλ“œλ₯Ό λͺ¨λ‘ 깨움

public void wait()

λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ notify() ν˜Ήμ€ notifyAll()을 ν˜ΈμΆœν•  λ•ŒκΉŒμ§€ μ§€μ •λœ μ‹œκ°„λ™μ•ˆ λŒ€κΈ° μ§€μ •

equals(Object obj)

Object ν΄λž˜μŠ€μ— μ •μ˜λœ 원본 equals() λ©”μ„œλ“œλŠ” == μ—°μ‚°μžμ™€ λ™μΌν•˜κ²Œ λ™μž‘ν•˜λŠ”λ°, μ΄λŠ” 두 μ°Έμ‘° λ³€μˆ˜κ°€ λ™μΌν•œ λ©”λͺ¨λ¦¬ μ£Όμ†Œμ˜ μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ”μ§€(동일성) λΉ„κ΅ν•œλ‹€.

class Point {

    int x;
    int y;

    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class EqualsTest {

    public static void main(String[] args) {
        Point a = new Point(2, 3);
        Point b = new Point(2, 3);
        Point c = a; // a와 cλŠ” 같은 객체λ₯Ό μ°Έμ‘°

        // 동일성 비ꡐ(비ꡐ λŒ€μƒμ΄ 같은 μΈμŠ€ν„΄μŠ€μΈμ§€)
        System.out.println(a == b); // false
        System.out.println(a == c); // true

        // 동등성 비ꡐ(비ꡐ λŒ€μƒμ΄ 같은 값을 κ°–λŠ”μ§€), ν•˜μ§€λ§Œ Point ν΄λž˜μŠ€λŠ” equals() λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— 동일성 비ꡐ와 κ°™λ‹€.
        System.out.println(a.equals(b)); // false
        System.out.println(a.equals(c)); // true
    }
}

두 객체의 멀버 λ³€μˆ˜ 값을 λΉ„κ΅ν•˜μ—¬ 논리적 λ‚΄μš©μ΄ 같은지(동등성) λΉ„κ΅ν•˜κ³  μ‹Άλ‹€λ©΄, equals() λ©”μ„œλ“œλ₯Ό λ‹€μŒκ³Ό 같은 κ·œμΉ™μ— 따라 μž¬μ •μ˜(μ˜€λ²„λΌμ΄λ”©)ν•΄μ•Ό ν•œλ‹€.

  • λ°˜μ‚¬μ„±(Reflexive): x.equals(x)λŠ” 항상 true

  • λŒ€μΉ­μ„±(Symmetric): x.equals(y)κ°€ trueλ©΄ y.equals(x)도 true

  • 좔이성(Transitive): x.equals(y)와 y.equals(z)κ°€ trueλ©΄ x.equals(z)도 true

  • 일관성(Consistent): x.equals(y)λŠ” μ—¬λŸ¬ 번 ν˜ΈμΆœν•΄λ„ 같은 값을 λ°˜ν™˜

  • null: x.equals(null)λŠ” 항상 false

hashCode()

hashCode()λŠ” 객체의 ν•΄μ‹œ μ½”λ“œλ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œλ‹€. ν•΄μ‹œ μ½”λ“œλŠ” 객체λ₯Ό μ‹λ³„ν•˜λŠ” μ •μˆ˜ κ°’μœΌλ‘œ, HashMap, HashSetκ³Ό 같이 ν•΄μ‹œ ν…Œμ΄λΈ”(Hash Table)을 μ‚¬μš©ν•˜λŠ” μžλ£Œκ΅¬μ‘°μ—μ„œ 객체λ₯Ό μ €μž₯ν•˜κ³  검색할 λ•Œ μ‚¬μš©λœλ‹€.

Object 클래슀의 원본 hashCode() λ©”μ„œλ“œλŠ” 객체의 λ©”λͺ¨λ¦¬ μ£Όμ†Œμ™€ μœ μ‚¬ν•œ 값을 기반으둜 ν•΄μ‹œ μ½”λ“œλ₯Ό λ°˜ν™˜ν•˜λ©°, String ν΄λž˜μŠ€λŠ” λ‚΄μš©μ„ 기반으둜 ν•΄μ‹œ μ½”λ“œλ₯Ό μƒμ„±ν•˜λ„λ‘ hashCode() κ°€ μž¬μ •μ˜λ˜μ–΄ μžˆλ‹€.

hashCode() & equals()

equals()와 hashCode()λŠ” ν•¨κ»˜ μ‚¬μš©λ  λ•Œ μΌκ΄€λœ λ™μž‘μ„ 보μž₯ν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같은 κ·œμΉ™μ„ 따라야 ν•œλ‹€.

  1. equals()λ₯Ό 톡해 trueλ₯Ό λ°˜ν™˜ν•˜λŠ” 두 κ°μ²΄λŠ” λ°˜λ“œμ‹œ λ™μΌν•œ hashCode() κ°’ λ°˜ν™˜

  2. hashCode()κ°€ λ™μΌν•œ 두 객체가 equals()λ₯Ό 톡해 trueλ₯Ό λ°˜ν™˜ν•  ν•„μš”λŠ” μ—†μŒ

λ§Œμ•½ equals()만 μž¬μ •μ˜ν•˜κ³  hashCode()λ₯Ό μž¬μ •μ˜ν•˜μ§€ μ•ŠμœΌλ©΄, 이 κ·œμ•½μ˜ 1번 ν•­λͺ©μ΄ κΉ¨μ§€κ²Œ λœλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ equals()의 비ꡐ κΈ°μ€€μœΌλ‘œ μ‚¬μš©λœ ν•„λ“œ(name)λ₯Ό hashCode() 생성에도 λ™μΌν•˜κ²Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

toString()

toString()은 객체λ₯Ό λŒ€ν‘œν•˜λŠ” λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ”λ°, Object의 원본 toString()은 "클래슀λͺ…@ν•΄μ‹œμ½”λ“œ" ν˜•μ‹μ˜ λ¬Έμžμ—΄(예: Animal@1ad9d)을 λ°˜ν™˜ν•œλ‹€.

λ””λ²„κΉ…μ΄λ‚˜ λ‘œκΉ…(logging) μ‹œ 객체의 ν˜„μž¬ μƒνƒœ(멀버 λ³€μˆ˜ κ°’)λ₯Ό μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆλ„λ‘ toString()을 μž¬μ •μ˜ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€.

clone()

clone()은 객체의 볡사본을 μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œλ‘œ, clone()을 μ˜¬λ°”λ₯΄κ²Œ μ‚¬μš©ν•˜λ €λ©΄ λ‹€μŒ 두 κ°€μ§€ 쑰건을 λ§Œμ‘±ν•΄μ•Ό ν•œλ‹€.

  1. λ³΅μ œν•  ν΄λž˜μŠ€λŠ” Cloneable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ ν•„μš”

    • Cloneable은 내뢀에 λ©”μ„œλ“œκ°€ μ—†λŠ” 마컀 μΈν„°νŽ˜μ΄μŠ€(Marker Interface)둜, JVM에 이 객체가 볡제 κ°€λŠ₯함을 μ•Œλ¦Ό

  2. Object의 clone() λ©”μ„œλ“œλŠ” protectedμ΄λ―€λ‘œ, μ™ΈλΆ€μ—μ„œ ν˜ΈμΆœν•  수 μžˆλ„λ‘ public으둜 μ˜€λ²„λΌμ΄λ”©ν•˜κ³  CloneNotSupportedException μ˜ˆμ™Έ 처리 ν•„μš”

λ˜ν•œ, Object의 clone() λ©”μ„œλ“œλŠ” '얕은 볡사(Shallow Copy)'λ₯Ό μˆ˜ν–‰ν•œλ‹€λŠ” 점에 μœ μ˜ν•΄μ•Ό ν•œλ‹€.

μ°Έμ‘°ν˜• 멀버 λ³€μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” 객체λ₯Ό λ³΅μ œν•  λ•ŒλŠ”, μ°Έμ‘°ν˜• λ³€μˆ˜κΉŒμ§€ λͺ¨λ‘ λ³΅μ œν•˜μ—¬ 원본과 μ™„μ „νžˆ λΆ„λ¦¬λœ 객체λ₯Ό λ§Œλ“œλŠ” 'κΉŠμ€ 볡사(Deep Copy)'λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

보톡 clone()을 μ‚¬μš©ν•˜λŠ” 것보닀, '볡사 μƒμ„±μž(Copy Constructor)'λ‚˜ '볡사 νŒ©ν„°λ¦¬ λ©”μ„œλ“œ'λ₯Ό μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•˜κ³  μžˆλ‹€.

getClass()

getClass()λŠ” 객체의 λŸ°νƒ€μž„ 클래슀 정보λ₯Ό λ‹΄κ³  μžˆλŠ” Class 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

ν•΄λ‹Ή 객체λ₯Ό μ΄μš©ν•΄ λ¦¬ν”Œλ ‰μ…˜μ„ 톡해 ν•΄λ‹Ή 클래슀의 λ©”μ„œλ“œ / ν•„λ“œ / μƒμ„±μž 정보에 μ ‘κ·Όν•˜λŠ” λ“± 동적인 ν”„λ‘œκ·Έλž˜λ°μ„ ν•  수 μžˆλ‹€.

참고자료

Last updated