Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발자 도전기

[JAVA] Object 클래스 본문

개발공부/JAVA

[JAVA] Object 클래스

jnnjnn 2024. 3. 19. 19:24

자바의 모든 클래스는 Object의 자식이나 자손 클래스이다.

따라서 부모 클래스인 Object가 가진 메소드는 모든 객체에서 사용할 수 있다.

 

다음은 Object가 가진 주요 메소드이다

메소드 용도
boolean equals(Object obj) 객체의 번지를 비교하고 결과를 리턴
int hashCode() 객체의 해시코드를 리턴
String toString() 객체 문자 정보를 리턴

 

 

equals(Object obj)

Object의 equals() 메소드는 객체의 번지를 비교하고 boolean 값을 리턴한다.

equals() 메소드는 비교 연산자인 ==과 동일한 결과를 리턴한다. 두 객체가 동일한 객체라면 true를 리턴하고, 그렇지 않으면 false를 리턴한다.

 

일반적으로 Object의 equals() 메소드는 재정의해서 동등 비교용으로 사용된다. 동등 비교란 객체가 달라도 내부의 데이터가 같은지를 비교하는 것을 말한다. 예를 들어 String은 equals()의 메소드를 재정의해서 내부 문자열이 같은지를 비교한다.

 

다음 예제는 equals()를 오버라이딩하여 다른 객체라도 책의 제목이 같으면 true를 리턴한다.

public class C04Equals {
    public static void main(String[] args) {
        C04Book book1 = new C04Book("스프링 부트3");
        C04Book book2 = new C04Book("이것이 자바다");
        C04Book book3 = book2;
        C04Book book4 = new C04Book("이것이 자바다");
        System.out.println(book4.equals(book1)); // false
        System.out.println(book4.equals(book2)); // false -> true
        System.out.println(book3.equals(book2)); // true
    }

}

class C04Book {
    private String title;

    public C04Book(String title) {
        this.title = title;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof C04Book other){
       		return this.title.equals(other.title);
        }
        return false;
    }
}

 

 

객체가 같다면 hashCode도 같아야 하기 때문에 equals()를 재정의하려면 hashCode()도 함께 재정의 해주어야 한다.

 

 

hashCode()

해시코드는 객체를 분류하는 역할을 한다. Object의 hashCode() 메소드는 객체의 메모리 번지를 이용하여 해시코드를 생성하기 때문에 객체마다 다른 정수값을 리턴한다. equals() 메소드와 비슷하게 두 객체가 동등한지를 비교할 때 사용한다.

 

equals() 메소드와 마찬가지로 hashCode() 메소드 역시 객체의 데이터를 기준으로 재정의해서 새로운 정수값을 리턴하도록 하는 것이 일반적이다. 객체가 다르다 할지라도 내부 데이터가 동일하다면 같은 정수값을 리턴하기 위해서이다.

 

자바는 두 객체가 동등함을 비교할 때 먼저 hashCode()가 리턴하는 정수값이 같은지를 확인하고, 그 다음 equals() 메소드가 true를 리턴하는지 확인해서 동등 객체임을 판단한다.

 

해시코드를 재정의 할 때는 다음과 같은 규칙을 지키도록 권장된다

1. 같은 객체가 hashCode를 여러 번 호출해도 같은 값이 나와야 함

2. 두 객체가 equals로 같은 객체로 여겨지면 두 객체의 hashCode는 같아야 함

3. 두 객체가 equals로 같지 않더라도 두 객체의 hashCode는 같을 수도 있음

 

해시코드는 해시함수를 통해 나오는 해시값이기 때문에 참조값과는 다르다.

public class C07HashCode {
    public static void main(String[] args) {
        C07MyClass o1 = new C07MyClass("이것이 자바다");
        C07MyClass o2 = new C07MyClass("이것이 자바다");
        C07MyClass o3 = new C07MyClass("스프링 부트");

        System.out.println(o1 == o2); // false : 참조값 다름
        int i1 = o1.hashCode();
        int i2 = o2.hashCode();
        int i3 = o3.hashCode();

        System.out.println(o1 == o2); // true
        System.out.println(o1 == o3); // false

    }
}

class C07MyClass {

    private String title;

    public C07MyClass(String title) {
        this.title = title;
    }

    @Override
    public int hashCode() {
        return title != null ? title.hashCode() : 0;
    }
}

 

toString()

Object의 toString() 메소드는 객체의 문자 정보를 리턴한다. 기본적으로 Object의 toString() 메소드는 '클래스명@16진수해시코드'로 구성된 문자열을 리턴한다.

 

사용자가 원하는 대로 객체의 문자 정보(주로 필드값)을 리턴하기 위하여 toString() 메소드를 오버라이드하여 사용할 수 있다.

 

public class Member {
    private String id;
    private String name;

    public Member(String id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return id + ":" + name;
    }
}

public class MemberExample {
    public static void main(String[] args) {
        Member member = new Member("blue", "이파란");

        System.out.println(member); // blue : 이파란
    }
}

 

System.out.println()에 member.toString()이 아닌 member를 넣었는데도 오버라이딩된 toString()값이 출력되는 이유는 System.out.println()이 Object 타입을 매개변수로 받았을 때는 Object.toString() 값을 리턴하도록 되어 있기 때문이다.

 

 

'개발공부 > JAVA' 카테고리의 다른 글

[JAVA] 제네릭(Generic)  (0) 2024.03.19
[JAVA] 포장 클래스  (0) 2024.03.19
[JAVA] TreeSet  (0) 2024.03.19
[JAVA] Set 컬렉션  (0) 2024.03.19
[JAVA] List 컬렉션 - ArrayList, Vector, LinkedList  (0) 2024.03.18