이 글은 유튜브 '자바의 정석 - 기초편'을 보고 정리한 글입니다.
📂content
1. Object클래스
- 모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다.
- notify(), wait() 등은 스레드와 관련된 메소드
Object클래스의 메서드 | 설명 |
protected Object clone() | 객체 자신의 복사본을 반환한다. |
public boolean equals(Object obj) | 객체 자신과 객체 obj가 같은 객체인지 알려준다. (같으면 true) |
protected void finalize() | 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다. 이 때 수행되어야하는 코드가 있을 때 오버라이딩한다. (거의 사용 안 함) |
public Class getClass() | 객체 자신의 클래스 정보를 담고 있는 Class인스턴스를 반환한다. => 설계도 객체를 준다. 1. 객체 생성 2. 객체 정보를 얻음 => Reflection API. 자바 기본 API에 포함됨 |
pulbic 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초) |
2. equals(Object obj)
- 객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false
- Object클래스의 equals()는 객체의 주소를 비교(참조변수 값 비교)
public boolean equals(Object obj) {
return (this == obj); //주소 비교
}
class Value {
int value;
Value(int value) {
this.value = value;
}
}
class Ex9_1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
System.out.println(v1.equals(v2));
} // main
}
서로 다른 두 객체는 항상 주소가 다르다.
⍟실습
더보기
class Ex9_1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if (v1.equals(v2))
System.out.println("v1과 v2는 같습니다.");
else
System.out.println("v1과 v2는 다릅니다.");
} // main
}
class Value {
int value;
Value(int value) {
this.value = value;
}
//"v1과 v2는 같습니다"를 출력값으로 나오게 할려면 equals() 오버라이딩
// Object의 equals()를 오버라이딩해서 주소가 아닌 value를 비교
public boolean equals(Object obj) {
//참조변수의 형변환 전에는 반드시 instanceof로 확인해야함.
if(!(obj instanceof Value)) return false; //이 코드는 바로 아래 있는 형변환을 위한 확인 코드
//Value 객체가 아니면 다른 객체이므로 비교할 필요도 없으니까 false를 바로 반환한다.
Value v = (Value)obj; //obj를 value로 형변환
return this.value == v.value;
//return this==obj; //주소 비교. 서로 다른 객체는 항상 거짓
}
}
- equals()에서 형변환을 하는데 그 이유는 Object로 들어온 매개변수에는 value라는 변수가 없기 때문이다. 그래서 형변환을 해주어야 한다.
3. equals(Object obj)의 오버라이딩
- 인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩해야 한다.
class Person {
long id;
public boolean equals(Object obj) {
if(obj instanceof Person)
return id == ((Person)obj).id;
//obj가 Object타입이므로 id값을 참조하기 위해서는 Person타입으로 형변환이 필요하다.
else
return false; // 타입이 Person이 아니면 값을 비교할 필요도 없다.
}
Person(long id) {
this.id = id;
}
}
cv = 클래스 변수 = static 변수 = 공유 변수
객체마다 공통(공유)
iv = 인스턴스 변수
객체마다 다름(개별)
1. System.out.println(p1==p2);
p1 == p2는 주소를 비교한다. 따라서 0x100 == 0x200이 되고, false라는 결과를 반환한다.
2. System.out.println(p1.equals(p2));
p1.equals(p2)는 오버라이딩했기 때문에 그에 따라서 id를 가지고 비교한다.
this.id == ((Person)obj).id가 되고, 8011081111222L == 8011081111222L이 되고, true라는 결과를 반환한다.
출처
'🎥Back > 자바의 정석' 카테고리의 다른 글
[JAVA의 정석]싱글 스레드와 멀티스레드, 스레드의 I/O 블락킹 (0) | 2024.02.29 |
---|---|
[JAVA의 정석]스레드 (0) | 2024.02.29 |
[JAVA의 정석]hashCode(), toString() (0) | 2024.02.28 |
[JAVA의 정석]사용자 정의 예외 만들기, 예외 되던지기 (0) | 2024.02.28 |
[JAVA의 정석]예외발생시키기 (0) | 2024.02.28 |