Object class
✔ Object class
: 모든 클래스의 최고 조상. 11개의 메서드만 가지고있음.
: iv, cv는 없음
: notify(), wait() 등은 쓰레드와 관련된 메서드
public void notifyAll() | 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다 |
public void wait() public void wait(long timeout) public void wait(long timeout, int nanos) |
다른 쓰레드가 notify()나 noftifyAll()을 호출할때까지 현재 쓰레드를 무한히 or 지정된시간(nanos)동안 기다리게 한다. |
* protected는 오버라이딩을 통해 public으로 변경되어야 사용 가능
protected Object clone() | 객체 자신의 복사본 반환 |
protected void finalize() | 객체가 소멸될 때 가비지 컬렉터에 의해 자동호출. 이때 수행되어야하는 코드가 있을때 오버라이딩. (생성자의 반대. 거의 사용안함) |
✔ boolean equals(Object obj)
: 객체 자신(this)과 주어진 객체(obj)를 비교.
: 같으면 true, 다르면 false
: Object class의 equals()는 객체의 주소를 비교 (참조변수 값 비교)
👉 public boolean equals(Object obj) { return (this == obj); }
class Value {
int value;
Value(int value){
this.value=value;}}
class Ex{
public static void main(String[] args){
value v1 = new Value(10);
value v2 = new Value(10);
System.out.println(v1.equals(v2)); } // 주소비교이므로 false반환.
// 각자 다른 객체라 참조변수에 들어가있는 주소값이 다름
--------------------------------------------------
class Value {
int value;
Value(int value){
this.value=value;
}
// Object 의 equals()를 오버라이딩해서 값을 비교함
public boolean equals(Object obj){
// 참조변수의 형변환 전에는 반드시 instanceof로 확인해야함
if(!(obj instnaceof Value)) return false;
Value v = (Value) obj; // obj를 value로 형변환
return this.value == v.value;
// this.value == obj.value 였는데 형변환 처리함
// 값을 비교해서 true값을 끌어내야 하는데 this(v1)은 value값이 있고 obj는 없어서 형변환으로 value와 연결해줌
}
✔ HashCode()
: 객체의 해시코드(hashcode)를 반환하는 메서드
: 해시코드란? 정수값으로 해싱알고리즘에서 사용하는 것.
: Object class의 hashCode()는 객체의 주소를 int로 변환해서 반환 = 객체마다 다른 값을 갖는다. (객체의 지문)
public class Object{
public native int hashCode(); // native method(): Os가 가지고 있는 메서드. 주로 c언어.
//해시코드가 이미 작성되어있는 native method를 가져오므로 구현부가 없음
: equals()를 오버라이딩하면( 주소값이 아니라 iv로 비교하도록 만들면) hashCode()도 오버라이딩 해야한다.
👉 equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문
String str1 = new String ("abc");
String str2 = new String ("abc");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.hashCode()); // 96354
System.out.println(str2.hashCode()); // 96354
: System.identityHashCode(Object obj) 는 Object class의 hashCode()와 동일. 원래 객체는 각자 다른 주소값을 가지므로 equals()를 오버라이딩 안한버전이나 다름없음.
✔ toString()
: 객체를 문자열로 변환하기 위한 메서드
public String toString(){ // Object class 의 toString()
return getClass().getName()+"@"+Integer.toHexString(hashCode()); }
설계도 객체.클래스이름+@(위치)+16진수(객체주소)
객체==iv 집합이므로 객체를 문자열로 변환한다는 것은 iv의 값을 문자열로 변환한다는 것과 같다
import java.util.Objects;
class Card {
String kind;
int number;
Card() {
this("SPADE", 1);
}
Card(String kind, int number) {
this.kind = kind;
this.number = number;
}
// equals를 오버라이딩하면 hashcode도 오버라이딩해야한다
public int hashCode() {
return Objects.hash(kind,number);
}
public boolean equals(Object obj) {
if(!(obj instanceof Card))
return false;
Card c=(Card)obj;
return this.kind==c.kind && this.number==c.number;
}
// Object class의 toString()을 오버라이딩해서 객체를 문자열로 바꿈
// 이 부분이 없다면 마지막 c1.toString()은 기본역할대로 주소값을 반환한다. Card@92282b5d
public String toString() {
return "kind:" + kind+", number:"+number;
}
}
class Ex9_4 {
public static void main(String[] args) {
Card c1 = new Card();
Card c2 = new Card();
System.out.println(c1.equals(c2));
System.out.println(c1.toString());
System.out.println(c2.toString());
}
}
'🔥 Vamos > Java' 카테고리의 다른 글
1027 | 자바의 정석 기초편 :: ch9-11 (0) | 2022.10.27 |
---|---|
1027 | 자바의 정석 기초편 :: ch9-7~9-10 (0) | 2022.10.27 |
1025 | 자바의 정석 기초편 :: ch8-18 (0) | 2022.10.25 |
1025 | 자바의 정석 기초편 :: ch8-15~8-17 (0) | 2022.10.25 |
1024 | 자바의 정석 기초편 :: ch8-11~8-14 (0) | 2022.10.24 |