11월 13일
모든클래스의 최고 조상이며, 오직 11개의 메서드만 가지고 있다.
참고로, Object클래스의 11개 메서드안에 public Class getClass()메서드가 있는데 클래스 정보를 담고 있다. 즉, 객체 자신의 클래스정보를 담고 있는 Class인스턴스를 반환한다.
Class인스턴스는 설계도 객체이기도 한대 이러한 객체를 통해 (1)객체생성이 가능하고(2)객체 정보를 알수 있다. 이렇게 객체생성도 가능하며 객체정보도 알수 있게끔 해 놓은걸 'Reflection API'라고 한다.
객체자신(this)과 주어진 객체(obj)를 비교한다. 기본적으로 객체의 주소를 비교하며 같으면 true, 다르면 false 반환함.
public boolean equals(Object obj){
return (this==obj);
}
아래는 오버라이딩하지 않고 사용한 equals()
class Value{
int value;
Value(int value){
this.value=value;
}
}
public class Ex9_1 {
public static void main(String[]args) {
Value v1= new Value(10);
Value v2= new Value(10);
//객체를 새로 만들때에는 비어있는곳에 객체를 만들가 때문에 v1과 v2는 다른 주소값을 갖는다.
//그래서 결과는 false
System.out.println(v1.equals(v2));
}
}
아래는 오버라이딩한 equals()
class Value{
int value;
Value(int value){
this.value=value;
}
//Object의 equals()를 오버라이딩해서 주소가 아닌 value()를 비교
public boolean equals(Object obj) {
//return this==obj 는 주소비교이다.
//참조변수가 Object 타입이기 때문에 어떤 객체든지 들어올 수 있다.
//그래서 instanceof로 확인 해야 함.
if(!(obj instanceof Value)) return false;
Value v =(Value)obj; //Value라는 객체에는 value 라는 변수가 있지만,Object객체에는 없기 때문에 obj를 value로 형변환
return this.value==v.value; //서로 다른 주소값을 가지고 있더라도 값이 같으면 true를 얻고 싶을떼
}
}
public class Ex9_1 {
public static void main(String[]args) {
Value v1= new Value(10);
Value v2= new Value(10);
//객체를 새로 만들때에는 비어있는곳에 객체를 만들가 때문에 v1과 v2는 다른 주소값을 갖는다.
//그래서 결과는 false
System.out.println(v1.equals(v2));
}
}
보통은 equals()를 오버라이딩할때 인스턴스변수(iv)의 값을 비교하도록 오버라이딩을 해야 한다.
(1)객체의 해시코드를 반환하는 메서드. Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환.
(2)equals()를 오버라이딩 하면 hashCode()도 오버라이딩 해야한다.
왜냐면 equals()와 hashCode()둘다 주소로 작업을 하기때문
(1)객체를 문자열(String)으로 변환하기 위한 메서드
(2)객체는 iv집합 이므로 객체를 문자열로 변환한다는 것은 iv의 값을 문자열로 변환한다는 것과 같다.
*오버라이딩 하기 전
class Card {
String kind;
int number;
Card(){
this("SPADE",1);
}
Card(String kind,int number){
this.kind=kind;
this.number=number;
}
}
public class Ex9_4 {
public static void main(String[] args) {
Card c1= new Card();
Card c2= new Card();
System.out.println(c1.toString()); //결과 Java.Card@606d8acf
System.out.println(c2.toString()); //결과 Java.Card@782830e
}
}
*오버라이딩 하고 난 후
class Card {
String kind;
int number;
Card(){
this("SPADE",1);
}
Card(String kind,int number){
this.kind=kind;
this.number=number;
}
//Object클래스의 toString()을 오버라이딩
public String toString() {
return "kind: "+kind+",number: "+number;
}
//iv비교로 오버라이딩
public boolean equals(Object obj) {
if(!(obj instanceof Card))return false;
Card c=(Card)obj;
//kind가 String이니까 equals를 써야한다.
return this.kind.equals(c.kind)&&this.number==c.number;
}
//equals()를 오버라이딩하면 hashCode()도 오버라이딩 해야한다.
public int hashCode() {
//Objects 클래스는 객체와 관련된 유용한 메서드를 제공하는 유틸 클래스이다.
return Objects.hash(kind,number);
}
}
public 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.hashCode());
System.out.println(c2.hashCode());
System.out.println(c1.toString());
System.out.println(c2.toString());
}
}