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

Was this helpful?