Object클래스
모든 클래스의 최고 조상, 오직 11개의 메서드만을 가지고 있다.
Object클래스의 메서드 | 설명 |
protected Object clone() | 객체 자신의 복사본을 반환한다. |
public boolean equals(object obj) | 객체 자신과 객체 obj가 같은 객체인지 알려준다(반환값 boolean) |
protected void finalize() | 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다. 이 떄 수행되어야 하는 코드가 있을 때 오버라이딩한다.(사용 빈도 적음) |
public Class getClass() | 객체 자신의 클래스 정보를 담고 있는 Class인스턴스를 반환한다. |
public int hashCode() | 객체 자신의 해시코드를 반환한다. |
public String toString() | 객체 자신의 정보를 문자열로 반환한다. |
public void notify() | 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다. |
public void notifyAll() | 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다. |
public void wait() public void wait(long timeout) public void wait(long timeout, int nanos) |
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간(timeout, nanos)동안 기다리게 한다. (timeout은 천분의 1초, nanos는 10^9분의 1초) |
ReflectionAPI를 활용하여 실행중에 객체를 생성하거나 어떤 객체에 대한 정보를 가지고 할 수 있는 일이 많아진다.(책보기)
equals(Object obj)
객체 자신과 주어진 객체(obj)를 비교한다, 같으면 true 다르면 false반환.
- 기본적으로 객체의 주소를 비교(참조변수 값을 비교)한다.
public boolean equals(Object obj) {
return (this==obj);
}
class A{}
public class Main {
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
System.out.println(a1.equals(a2));
}
}
- 하지만 서로 다른 객체는 항상 주소가 다르기 때문에 인스턴스 변수의 값을 비교하도록 equals()를 오버라이딩해야 한다.
class Person{
long id;
public boolean equals(Object obj) {
if(!(obj instanceof Person))
return false; // 형변환이 불가능하면 값을 비교할 필요가 없다.
return this.id ==((Person)obj).id; // obj는 Object타입으로 id를 참조할수 없어 형변환이 필요하다.
}
Person(int id){
this.id = id;
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person(10);
Person p2 = new Person(10);
System.out.println(p1.equals(p2)); // 서로 다른 객체지만 iv를 비교하도록 오버라이딩하였다.
}
}
클래스를 새로 만들때 인스턴스 변수(iv)값을 비교하도록 오버라이딩하는 것이 바람직하다.
hashCode()
객체의 해시코드(hash code)를 반환하는 메서드, 해싱 알고리즘에서 사용하는 정수 값
Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
public native int hashCode();
native : 네이티브 메서드 : Os가 가지고 있는 메서드를 의마, 주로 C언어로 작성됨
내용이 없는 이유는 이미 작성되어 있는 네이티브 메서드를 호출해서 사용하기 때문, C언어로 작성된 메서드를 마치 자바에서 작성된 메서드 처럼 사용이 가능하다. JNI
OS에 작성된 메서드가 객체의 주소를 int로 변환해서 반환 한다. 객체의 지문이라고 한다.
equals()를 오버라이딩 하면, hashCode()도 오버라이딩 해야 한다.
import java.util.Objects;
class Person{
long id;
public boolean equals(Object obj) {
if(!(obj instanceof Person))
return false; // 형변환이 불가능하면 값을 비교할 필요가 없다.
return this.id ==((Person)obj).id; // obj는 Object타입으로 id를 참조할수 없어 형변환이 필요하다.
}
public int hashCode() {
return Objects.hash(id); // Objects클래스는 객체와 고나련도니 유용한 메서드를 제공하는 유틸 클래스
// int hash(Object...values){..} 매개변수가 가변인자로 호출시 지정하는 값의 개수가 정해져 있지 않다.
}
Person(int id){
this.id = id;
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person(10);
Person p2 = new Person(50);
System.out.println(p1.equals(p2)); // 서로 다른 객체지만 iv를 비교하도록 오버라이딩하였다.
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
}
}
true
41
41
equals()의 결과가 true일 경우 hascode()의 결과도 같은 결과가 나와야 한다.주소가 아닌 iv를 비교하도록 오버라이딩했을 경우 equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문이다.
System.identity.HashCode(Object obj)는 객체마다 다른 해시코드를 반환하는 Object 클래스의 hashCode()와 동일한 기능을 하기 때문에 오버라이딩을 한 뒤 기존의 hashCode()의 기능이 필요할 때 사용한다.
32bit JVM은 주소 값이 int, 64bit은 주소 값이 long이기 때문에 64bit JVM으로 바뀌면서 주소 값이 겹치는 경우가 발생할 수 있다.
toString()
객체를 문자열(String)으로 변환하기 위한 메서드
클래스 객체. 클래스 이름@(at, 위치를 의미)객체의 주소값을 int형으로 변환한 값을 16진수로 변경하여 반환
public String toString() {
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
객체는 iv의 집합이다, 따라서 iv 값들을 문자열로 변환하여 출력하도록 오버라이딩하는 것이 일반적
class Card{
String kind;
int number;
Card(String kind, int number){
this.kind = kind;
this.number = number;
}
public String toString() {
return "kind" + kind + ", number: "+number;
}
}
public class Main {
public static void main(String[] args) {
Card c1 = new Card("heart", 9);
Card c2 = new Card("SPADE", 1);
System.out.println(c1.toString());
System.out.println(c2.toString());
}
}
'Java' 카테고리의 다른 글
[JAVA] StringBuffer 클래스 (0) | 2023.11.02 |
---|---|
[JAVA] String 클래스 (0) | 2023.10.31 |
[JAVA] 자바의 에러(error)와 예외(exception) (0) | 2023.10.25 |
[JAVA] 내부 클래스(Inner Class) (0) | 2023.10.25 |
[JAVA] 인터페이스(Interface) (1) | 2023.09.19 |