① Object클래스
: 모든 클래스의 최고 조상.
모든 클래스의 최고조상이기 때문에 Object클래스의 멤버들은 모든 클래스에서 바로 사용 가능하다.
- Object클래스의 메서드
Object클래스의 메서드 | 설명 |
protected Object clone() | 객체 자신의 복사본을 반환한다. |
public boolean equals(Object obj) | 객체 자신과 obj가 같은 객체인지 알려준다. (같으면 true) |
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 timout) public void wait(long timeout, int nons) |
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간동안 기다리게 한다. |
→ protected로 선언된 메서드들은 오버라이딩을 해서 public으로 변경시켜야 한다.
- Object클래스의 메서드 equals()
: 객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false를 반환한다.
Object클래스의 equals()는 객체의 주소를 비교한다. (참조변수 값 비교)
class JavaJungsuk_javalangPackage_Ex9_1 {
public void 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는 다릅니다.");
}
}
class Value {
int value;
Value(int value) {
this.value=value;
}
}
결과
v1과 v2는 다릅니다.
→ equals()메서드는 객체의 주소를 비교하여 같으면 true, 다르면 false를 반환하기 때문에
서로 다른 두 객체는 항상 주소가 다르므로 'v1과 v2는 다릅니다.'를 반환한다.
- euqlas()의 오버라이딩
: 만약 주소값이 같은지를 판단하는 기능이 아닌 서로의 인스턴스가 가지고 있는 값을 비교하도록 하고 싶다면 equals()를 오버라이딩 하면 된다.
class Person {
long id;
public boolean equals(Object obj) {
if(obj instanceof Person)
//obj가 Object타입이므로 id값을 참조하기 위해서는 Person타입으로 형변환이 필요하다.
return id == ((Person)obj).id;
else
return false;
}
Person(long id) {
this.id=id;
}
}
class JavaJungsuk_javalangPackage_Ex9_2 {
public static void main(String[] args) {
Person p1=new Person(12122122121L);
Person p2=new Person(12122122121L);
if(p1.equals(p2))
System.out.println("p1과 p2는 같은 사람입니다.");
else
System.out.println("p1과 p2는 다른 사람입니다.");
}
}
결과
p1과 p2는 같은 사람입니다.
→ if문에서 instanceof를 사용하여 형변환 여부를 확인하고 true이면 id==((Person)obj).id를 반환한다. 그리고 형변환이 되지 않는다면 flase를 반환하게 한다. 위 예제에서는 p1이 id이고 p2가 형변환된 id이다.
- Object클래스의 메서드 hashCode()
: 객체의 해시코드(hash code)를 반환하는 메서드
Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환. (정수값)
class JavaJungsuk_javalangPackage_Ex9_3 {
public static void main(String[] args) {
String str1=new String("abc");
String str2=new String("abc");
System.out.println(str1.equals(str2));
System.out.println(str1.hashCode());
System.out.println(str2.hashCode()); //같은 해시코드 반환.
System.out.println(System.identityHashCode(str1));
System.out.println(System.identityHashCode(str2)); //객체마다 다른 해시코드 반환.
}
}
결과
true
96354
96354
27134973
1284693
→ equals()를 오버라이딩 하면 hashCode()도 오버라이딩 해야한다.
왜냐하면 equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문이다.
- Object클래스의 메서드 toString()
: 객체를 문자열로 변환하기 위한 메서드이다.
class Card {
String kind;
int number;
Card() {
this("SPADE", 1);
}
Card(String kind, int number) {
this.kind=kind;
this.number=number;
}
}
class JavaJungsuk_javalangPackage_Ex9_4 {
public static void main(String args[]) {
Card c1=new Card();
Card c2=new Card();
System.out.println(c1.toString());
System.out.println(c2.toString());
}
}
결과
Card@19e0bfd
Card@139a55
→ Card클래스에서 Object클래스로부터 상속받은 toString()을 오버라이딩 하지 않았기 때문에 Card인스턴스에 toString()을 호출하면, Object클래스의 toString()이 호출된다.
- toString()의 오버라이딩
class Card2 {
String kind;
int number;
Card2() {
this("SPADE", 1);
}
Card2(String kind, int number) {
this.kind=kind;
this.number=number;
}
public String toString() {
return "kind : "+kind+", number: "+number;
}
}
class JavaJungsuk_javalangPackage_Ex9_5 {
public static void main(String[] args) {
Card2 c1=new Card2();
Card2 c2=new Card2("HEART", 10);
System.out.println(c1.toString());
System.out.println(c2.toString("HEART", 10);
}
}
결과
kind : SPADE, number : 1
kind : HEART, number : 10
→ 위 예제처럼 toString()을 오버라이딩하여 Card2인스턴스의 kind와 number를 문자열로 반환한다.
'프로그래밍 > Java' 카테고리의 다른 글
Java_java.lang패키지와 유용한 클래스(3)_StringBuffer클래스 (0) | 2022.12.10 |
---|---|
Java_java.lang패키지와 유용한 클래스(2)_String클래스 (0) | 2022.12.07 |
Java_예외처리(2)_멀티 catch블럭, 예외 발생시키기, 체크드예외와 언체크드예외, 메서드에 예외 선언하기, finally블럭 (0) | 2022.11.30 |
Java_예외처리(1)_try-catch문 (0) | 2022.11.27 |
Java_객체지향언어(9)_인터페이스 (0) | 2022.11.27 |