자바강의/자바교육)자바의 Object 클래스, toString(), equals(), hashcode(), 실습(자바동영상/자바강좌/자바/JAVA)
ojc.asia/bbs/board.php?bo_table=LecJava&wr_id=757

1. Object 클래스
모든 클래스의 최상위 클래스
모든 객체는 Object의 하위 객체, 즉 소스에서 아무것도 상속 받지 않았다면 컴파일러에 의해 java.lang.Object를 상속하는 클래스로 선언 된다.(extends Object)
Object 타입의 변수는 어떠한 객체도 가리킬 수 있다. 또한 유형을 모르는 객체를 참조하려 할 때 유용하다.
Object obj = new int[10];
Object obj = new StringBuffer(“abc”);
Object obj = getObject(); //어떤 객체가 리턴될지 모르는 경우
객체의 내용을 String 으로 변환
String toString()
모든 객체를 System.out으로 출력할 때 toString() 메소드가 간접적으로 호출되도록 되어있다.
객체의 내용으로 비교
boolean equals(Object obj)
Hash code 생성
int hashCode()
복제된 객체 생성
protected Object clone() throws CloneNotSupportedException
객체가 소멸될 때 불리는 함수
finalize() throws Throwable
2. 객체의 내용 비교 (equality test)
boolean equals(Object obj)
두 객체가 같은지 비교
실질적으로 두 객체의 내용이 같은지를 검사 하려면 equals() 메소드를 오버라이드 해서 객체가 포함하고 있는 내용을 비교해야 한다.
Object 클래스의 equals() 메소드는 객체의 참조값(주소값)이 같은지 비교한다.
Java.lang.Object.equals() 메소드를 살펴보면
public boolean equals(Object obj) {
return (this == obj);//결국 equals()를 overriding하지 //않는 한 equals()와 ==의 차이는 없다.
}
Java.lang.String 의 경우는 equals() 메소드를 재정의 하여 다음과 같이 문자열이 같은 경우 같다고 정의하고 있다.
public boolean equals(Object anObject) : Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object.
3. 해시코드(HashCode)
해시 코드
해시 코드는 객체에 대한 서명, 또는 checksum과 같은 것으로 보통 객체의 내용을 바탕으로 만들어진 난수처럼 보이는 객체 인식용 정수이다.
객체가 서로 다른 내용을 포함한다면 반드시 달라야 하며 ,객체의 내용이 같다면 일반적으로 같은 값을 가진다.
해시코드는 객체를 Hashtable에 저장하는 경우에 사용한다. 해시코드는 객체를 골고루 저장할 수 있도록 식별자로 활용 할 수 있고 따라서 자료를 찾을 때도 빠르게 찾을 수 있도록 도와 준다.
실행 중 두번 이상 같은 객체의 해시코드가 호출 되는 경우 항상 같은 정수 값을 return 한다.
4. 실습
package javatest;
class Person extends Object {
String name;
Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
return this.name.equals(((Person)obj).name);
}
}
public class ObjectTest {
public static void main(String[] args) {
Person p1 = new Person("오라클자바커뮤니티");
Person p2 = new Person("오라클자바커뮤니티");
//먼저 p1, p2 객체참조변수를 출력해 보자.
//객체명@hashCode를 16 진수로 변환한값 출력
System.out.println("p1.toString() --> " + p1);//javatest.Person@15db9742
System.out.println("p2.toString() --> " + p2);//javatest.Person@6d06d69c
//hashCode 값 출력(int형으로 출력)
//p1, p2는 힙 메모리의 서로 다른 객체이므로 해시코드가 다르다.
System.out.println("p1.hashCode() --> " + p1.hashCode());//366712642
System.out.println("p2.hashCode() --> " + p2.hashCode());//1829164700
System.out.println("p1 == p2 --> " + (p1 == p2)); //false
System.out.println("p1.equals(p2) --> " + p1.equals(p2)); //false
//hashCode 값을 16 진수로 바꾸어서 한번 찍어보자.
System.out.println(Integer.toHexString(p1.hashCode()));//15db9742
System.out.println(Integer.toHexString(p2.hashCode()));//6d06d69c
System.out.println();
//new String() 하는 경우 값이 같아도 다른 메모리 공간에 생성된다.(주소가 다름)
String s1 = new String("abc");
String s2 = new String("abc");
//hashCode 값 출력(문자열값이 같으므로 같은 hashCode, String은 Object의 hashcode()를 재정의)
//String클래스는 equals를 재정의(문자열이 같으면 true)
System.out.println("s1.hashCode() --> " + s1.hashCode());//96354
System.out.println("s2.hashCode() --> " + s2.hashCode());//96354
System.out.println("s1.equals(s2) --> " + s1.equals(s2));//true
System.out.println("s1 == s2 --> " + (s1 == s2));//false
System.out.println();
//new String()이 아닌 문자열 생성은 값이 같으면 "문자열 상수 풀에"서 공유한다.
String s3 = "abc";
String s4 = "abc";
//hashCode 값 출력(문자열값이 같으므로 같은 hashCode)
System.out.println("s3.hashCode() --> " + s3.hashCode());//96354
System.out.println("s4.hashCode() --> " + s4.hashCode());//96354
System.out.println("s3.equals(s4) --> " + s3.equals(s4));//true
System.out.println("s3 == s4 --> " + (s3 == s4));//true
System.out.println();
}
}
[실행결과]
p1.toString() --> javatest.Person@15db9742
p2.toString() --> javatest.Person@6d06d69c
p1.hashCode() --> 366712642
p2.hashCode() --> 1829164700
p1 == p2 --> false
p1.equals(p2) --> true
15db9742
6d06d69c
s1.hashCode() --> 96354
s2.hashCode() --> 96354
s1.equals(s2) --> true
s1 == s2 --> false
s3.hashCode() --> 96354
s4.hashCode() --> 96354
s3.equals(s4) --> true
s3 == s4 --> true
#자바Object, #Object란, #해시코드, #객체비교, #객체지향, #자바동영상, #자바강의, #자바교육, #자바강좌, #자바, #JAVA, #자바동영상강의, #추천자바강의, #추천자바강좌, #JAVA동영상, #JAVA강의, #JAVA강좌, #JAVA교육, #JAVA, #추천JAVA강의, #추천JAVA교육, #추천JAVA강좌, #자바소스, #자바실습
댓글 없음:
댓글 쓰기