Object 클래스는 무엇이며, 어떤 메서드를 제공할까?
Object 클래스
--
Object 클래스는
모든 java 클래스의 최상위 부모 클래스로
상속을 정의하지 않은 모든 클래스는 자동으로 Object 클래스를 상속받도록 설계되어 있다.
(다른 클래스를 상속받더라도 계속 해당 부모 클래스로 올라가 보면 Object 클래스를 상속받고 있다.)
그래서 모든 클래스(객체)는 Object 클래스에서 제공하는 메서드를 사용할 수 있다.
Object 클래스에는 멤버변수는 없고 오직 11개의 메서드만 가지고 있다.
메서드 종류
--
equals(Object obj)
--
두 객체가 같은지 비교하는 메서드로, 같은 참조를 하고 있는지 비교한다.
(두 객체가 같은 곳을 가리키고 있는가?)
기본 형식
객체A.equals(객체B)
예시 코드
Test t1 = new Test(10);
Test t2 = new Test(10);
boolean result = t1.equals(t2);
// false (t1, t2는 서로 다른 주소값을 참조하고 있다.)
t1 = t2
boolean result = t1.equals(t2);
// true (t1에 t2의 참조 주소를 넣어 같은 참조값(주소)를 가지고 있다.)
--
hashCode()
--
해싱 기법에 사용되는 해시함수를 구현한 것으로,
해당 객체의 해시 코드를 반환한다.
- 해싱(hashing) : 데이터 관리 기법 중 하나로, 대량의 데이터를 저장하고 검색하는데 유용
- 해시함수(hash Function) : 찾고자하는 값을 입력하면, 해당 값의 위치를 알려주는 해시코드 반환
일반적으로 해시코드가 같은 두 객체가 존재하는 것은 가능하다.
다만, 서로 다른 두 객체는 결코 같은 해시 코드를 가질 수 없다.
Object 클래스에서 정의된 hashCode() 메서드는 객체의 주소값을 이용해서 해시코드를 만들어 반환하기 때문이다.
기본 형식
객체.hashCode()
예시 코드
String str1 = new String("aaa");
String str2 = new String("aaa");
int hashCode1 = str1.hashCode(); // 93949
int hashCode2 = str2.hashCode(); // 93949 (동일)
// String 객체같은 경우 같은 값을 할당하면 재활용하여 같은 곳을 참조하게 된다.
// 즉, str2는 str1과 같은 참조 주소를 같게 되므로 같은 해시코드를 같게 된다.
// ( str1과 str2는 "aaa"문자열을 가지고 있는 주소를 같이 참조하고 있다.)
int hashCode1 = System.identityHashCode(str1); // 28193283
int hashCode2 = System.identityHashCode(str2); // 18493028 (다름)
// System.identityHashCode() 메서드는 객체의 고유한 해시코드를 반환해준다.
// 즉, 일반 hashCode()메서드와 달리 해당 객체의 실제 메모리 주소를 기반으로 해시코드를 반환한다.
--
toString()
--
객체에 대한 정보를 문자열(String)으로 표현하여 반환한다.
기본적으로 해당 객체의 클래스 이름과 해시 코드를 포함한 문자열을 반환한다.
기본 형식
객체.toString()
Object 클래스에 정의된 toString() 메서드의 형태 (이러한 느낌으로 정의되어 있다.)
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
} // 클래스 이름 + @ + 16진수의 해시코드
물론 toString()을 오버라이딩으로 원하는 문자열을 출력하도록 재정의 할 수도 있다.
예시 코드
Person pp = new Person("Alice");
String str = pp.toString(); // Person@1d938af3
--
clone()
--
객체 자신을 복제하여 새로운 객체를 생성하고 이를 반환한다.
다만, clone() 메서드를 통한 복제는 값만 복사하는 "얕은 복사"를 수행하여 완전한 복제는 아니다.
예시로
A배열은 값으로 주소를 가지고 있다.
여기서 clone()을 통해 복사 되는 것은 해당 주소값이기 때문에
결국 A배열과 복사된 배열은 모두 같은 주소를 가리키고 있어 서로 영향을 주게 된다.
이를 "얕은 복사"라고 부른다.
- 얕은 복사 : 값을 복사하는 것으로 해당 값이 주소값이면 같은 곳을 공유하게 된다.
- 깊은 복사 : 참조하고 있는 객체까지 복사는 것으로 원본의 값을 복사하여 서로 다른 값이 된다.
기본 형식
객체.clone()
예시 코드
class Person implements Cloneable {
String name;
Person(String name) {
this.name = name;
}
@Override
public object clone() { //기존 protected에서 public으로 변경
Object obj = null;
try {
obj = super.clone();
} catch (CloneNotSupportedException e) { // 필수로 처리해야하는 예외
//Cloneable인터페이스를 구현하지 않으면 발생하는 예외
}
return obj;
}
}
Person pp1 = new Person("Alice");
Person pp2 = (Person)pp1.clone(); // 복사
clone() 메서드를 사용하기 위해서는
복제할 클래스가 Cloneable 인터페이스를 구현하고
clone() 메서드를 오버라이딩하여 해당 접근 제어자를 protected -> public으로 변경해야 한다.
그래야만 상속 관계가 없는 다른 클래스에서 clone() 메서드를 호출할 수 있게 된다.
--
getClass()
--
해당 객체의 클래스 정보를 담은 class 객체를 반환한다.
반환된 class 객체를 통해 클래스 이름, 메서드, 필드 등의 메타데이터에 접근할 수 있다.
기본 형식
객체.getClass()
// 특정 메타데이터를 반환하기
객체.getClass().getName(); // 해당 클래스의 이름 반환
예시 코드
String str = "Hello";
System.out.println(str.getClass().getName()); // java.lang.String
--
'Language > Java' 카테고리의 다른 글
[java.lang] StringBuffer 클래스, StringBuilder 클래스 (가변 문자열 관련 클래스) (0) | 2024.11.03 |
---|---|
[java.lang] String 클래스 (불변 문자열 관련 클래스) (0) | 2024.10.31 |
java.lang 패키지 (1) | 2024.10.29 |
예외처리 (try-catch, finally, throw) (0) | 2024.10.24 |
내부 클래스 (+ 익명 클래스) (0) | 2024.10.23 |