Java

[Java] 기본 API 클래스⑨ Object

망고고래 2024. 4. 7. 15:57

what?

모든 클래스의 조상 클래스

why?

모든 클래스가 Object 클래스의 멤버를 사용할 수 있음

how?

멤버 변수는 없고 메서드 11개가 있음

제어자 및 반환 타입 메서드 설명
protected Object clone() 객체의 복사본 반환
boolean equals(Object obj) obj와 같은 객체인지 아닌지 반환
protected void finalize() 객체가 소멸할 때 호출됨
Class<?> getClass() 클래스의 정보를 담고 있는 Class 객체 반환
int hashCode() 해시 코드 반환
void notify() 대기 중인 하나의 스레드 깨움
void notifyAll() 대기 중인 모드 스레드 깨움
String toString() 객체 정보를 문자열로 반환
void wait() 현재 스레드를 멈추고 대기
void wait(long timeout) timeout만큼 스레드를 멈추고 대기
void wait(long timeout, int nanos) 실제로 일어난 시간만큼 스레드를 멈추고 대기

 

 

1)clone()

객체 생성 명령어 new와의 차이점

(1)메모리 사용량

new: 메모리에 새로운 인스턴스 할당

clone(): 이미 존재하는 객체 복제->추가적 메모리 할당 없이 객체 생성 가능

(2)상태 보존

clone(): 원본 객체의 상태를 그대로 유지하면서 새로운 객체를 만들 수 있음

객체의 상태가 변경될 수 있고 그 상태를 보존해야 할 필요가 있을 경우 사용

(3)속도와 성능

clone(): 객체 복제 과정에서 필드를 하나씩 복사->객체 크기가 클 경우 성능 저하

얕은 복사(shallow copy)->객체가 포함하는 다른 객체도 복사할 때는 별도로 깊은 복사(deep copy) 필요

얕은 복사
객체 복제시 복제 대상 객체의 필드들을 하나씩 복사한다. 필드가 참조 타입인 경우 해당 참조를 복사하며, 원본 객체와 복제된 객체가 같은 참조를 가지게 된다. 따라서 내부 객체의 변경이 원본 객체와 복제 객체에 영향을 줄 수 있다.

깊은 복사
객체 복제시 객체 내의 참조된 객체들도 새롭게 복제해 독립된 객체를 만든다. 필드가 참조 타입일 경우에도 참조된 객체를 재귀적으로 복제해 새로운 객체를 생성한다. 따라서 원본 객체와 복제 객체가 완전히 독립적인 객체가 된다. 내부 객체의 변경이 원본 객체와 복제 객체에 영향을 주지 않는다.

 

 

2)getClass()

Class 객체에는 해당 객체의 클래스가 담겨있음: 객체가 어떤 클래스의 인스턴스인지에 대한 정보 제공. 자바의 리플렉션 기능에서 주요한 부분

Reflection: 실행 중에 클래스나 메서드 등의 구조에 대한 정보를 검사하고 수정하는 기능

//객체의 클래스명을 가져오는 예제
String str = "Hello";
Class<?> clazz = str.getClass();
System.out.println("클래스명: " + clazz.getName());

 

 

3)hashCode()

what?

객체의 해시코드 반환

해시코드: 해시 테이블 같은 자료 구조에서 객체를 저장하거나 검색하기 위해 사용됨

해시 테이블: 객체의 해시 코드를 기반으로 객체를 저장하고 검색하여 빠르게 접근할 수 있는 자료구조

why?

해시코드

1)빠른 검색

해시 테이블과 같은 자료 구조에서 객체를 검색할 때 해시 코드를 기반으로 빠르게 접근할 수 있도록 함

2)해시 기반 자료 구조에서의 객체 식별

해시 테이블과 같은 자료 구조에서 객체를 식별하기 위해 사용

how?

hashCode() 메서드 오버라이딩시 equals() 메서드도 함께 재정의해야 한다. hashCode()와 equals() 메서드는 서로 일관성을 유지해야 하며, 동일한 객체가 동일한 해시 코드를 반환하도록 해야 한다. 두 메서드가 일치하지 않으면 해시 테이블 등의 자료 구조를 사용할 때 문제가 발생할 수 있다.

 

재정의 예제

public class MyClass {
    private int value;

    public MyClass(int value) {
        this.value = value;
    }

    @Override
    public int hashCode() {
        return Objects.hash(value);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        MyClass myClass = (MyClass) obj;
        return value == myClass.value;
    }
}

hashCode() 메서드가 객체의 value 필드를 기반으로 해시 코드 생성, equals() 메서드는 두 객체의 value 필드가 동일한지를 비교해서 두 객체가 동등한지 확인하는 코드