독학과 인강으로 공부하고 있는 초보입니다.
hashcode를 처음 공부하다보니 헷깔리는 부분이 있는데 마땅히 질문할 곳이 없어 이렇게 글을 남기게 되었습니다. 제가 궁금한 소스는 아래와 같습니다. (대충넘어가기보다는 한 줄 한 줄 주석을 달며 이해하고 넘어가는 게 많아 주석이 많습니다. 양해부탁드리고, 혹시나 틀린 내용을 발견하시어 충고해주시면 감사하겠습니다.)
package ObjectExs;
public class EqualsEx1 {
public static void main(String[] args) {
int aa = 100;
int bb = 100;
String str1 = new String("하이 자바"); // String str1 = "하이 자바" 같다.
String str2 = "하이 자바";
System.out.println(str1.hashCode()); // 출력값: 422206472
System.out.println(str2.hashCode()); // 출력값: 422206472
if (aa==bb){// 출력값 : aa와 bb는 서로 같다
System.out.println("aa와 bb는 서로 같다");
}else {
System.out.println("aa와 bb는 서로 다르다");
}
System.out.println("/////////////str1 = str2;/////////////");
if (str1==str2){//출력값 : str1와 str2는 서로 다르다
System.out.println("str1과 str2는 서로 같다");
}else {
System.out.println("str1와 str2는 서로 다르다");
}
// == 비교연산자는 기본자료형을 비교하는 경우에는 값을 비교한다.
// 참조형(Reference Type)의 비교는 주소값을 비교한다.
// equals (반환값 : true or false)
System.out.println("/////////////str1.equals(str2)/////////////");
//오버라이딩함.
if (str1.equals(str2)){//출력값 : str1와 str2는 서로 같다
System.out.println("str1과 str2는 서로 같다");
}else {
System.out.println("str1와 str2는 서로 다르다");
}
Value va1 = new Value(10);
Value va2 = new Value(10);
System.out.println(va1.hashCode()); // 출력값: 366712642
System.out.println(va2.hashCode()); // 출력값: 1829164700 둘의 주소값이 다름
//hashCode()는 object상속받음, 원칙적으로 주소값이 다른게 원칙
//va1 = va2;
//오버라이딩 안함.
if (va1.equals(va2)){//출력값 : va1와 va2는 서로 다르다
//-> but 66~72줄 equals 오버라이딩으로 인하여 같아진다.
System.out.println("va1과 va2는 서로 같다");
}else {
System.out.println("va1와 va2는 서로 다르다");
}
// 오버라이딩 유무에 따라 비교하는 것이 다르다.
// ->Equals 메소드가 Object 클래스에 있는 경우는 주소값을 비교한다
// ->String객체의 Equals메소드는 오버라이딩 된 메소드여서 내용을 비교한다.
}
} //end of EqualsEx1
class Value{
int a;
//오버라이딩//오버라이딩을 하여야 내용비교가능
public boolean equals(Object obj){ //오버라이딩
if(obj !=null && obj instanceof Value){ // obj가 Value타입인지 확인하는 것
return a == ((Value)obj).a;
} else {
return false;
}
}
public Value(int a){
this.a = a;
}
} // end of Value
Q.1 str1과 str2 str1.equals(str2)은 출력값이 str1와 str2는 서로 같다라고 나오는 반면 va1.equals(va2)은 출력값이 va1와 va2는 서로 다르다(오버라이딩안했을 시)라고 나옵니다. 왜 다른지 모르겠습니다. 강좌에서 string은 오버라이딩했다고 하는데 이 소스만 봤을 때는 오버라이딩을 했는지 잘 모르겠습니다.
Q.2 소스 맨 아래 쪽인 boolean을 반환타입으로 갖는 equals메소드의 오버라이딩에 대해 질문이 있습니다. 여기서 매개변수가 object obj인지를 모르겠습니다. 왜 object인지요? 그리고 if문의 조건으로 obj !=null && obj instanceof Value을 사용했는지 모르겠습니다.
강좌를 보고 여기에 질문을 드려 죄송하게 생각하고 있습니다. 거기엔 질문할 수 있는 곳이 없고 구글,네이버에 검색해봐도 제 수준에서는 도저히 이해하기 어려운 부분이라 질문드렸습니다.