2014년 5월 22일 목요일

JAVA Object HashCode, 해시코드란?[자바JSP/Servlet/JDBC/MiPlatform/XPlatform/교육/JSP/서블릿강좌/Spring교육잘하는곳/자바,JSP/spring/교육추천/JSP/JDBC실무교육]

JAVA Object HashCode, 해시코드란?[자바JSP/Servlet/JDBC/MiPlatform/XPlatform/교육/JSP/서블릿강좌/Spring교육잘하는곳/자바,JSP/spring/교육추천/JSP/JDBC실무교육]

해쉬 코드는 객체에 대한 서명, 또는 checksum과 같은 것으로 보통 객체의 내용을 바탕으로 만들어진 난수처럼 보이는 객체 인식용 정수이다.

자바에서 동일한 이름의 객체가 여러 개 생성될 수 있는데 이 객체들은 이름만 같을 뿐 서로 다른 상태를 가진 가진 객체들이 되는 것이다. 이런 객체를 구별하기 위해, 고유한 정수값으로 출력시켜주는 메소드가 바로 hashCode()다

일반적으로, 이것은 객체의 내부 주소를 정수값로 변환하는 형태로 구현된다.

우리가 보통 객체 참조 변수를 출력할 때, 출력되는 Reference Address는 바로 이 hashCode를 16진수로 출력한 값입니다.

객체가 서로 다른 내용을 포함한다면 반드시 달라야 하며 ,equals() 메소드가 같다면 일반적으로 같은 값을 가진다.

해쉬 코드는 객체를 Hashtable에 저장하는 경우에 사용한다. 해쉬 코드는 객체를 골고루 저장할 수 있도록 식별자로 활용 할 수 있고 따라서 자료를 찾을때도 빠르게 찾을 수 있도록 도와 준다.

실행중 두번 이상 같은 객체의 해쉬코드가 호출 되는 경우 항상 같은 정수 값을 return 한다.


[예]

package onj;

class Person {
String name;
Person(String name) {
this.name = name;
}
}

public class Test {
public static void main(String[] args) {
Person p1 = new Person("오라클자바커뮤니티"); 
Person p2 = new Person("오라클자바커뮤니티");
//먼저 p1, p2객체참조변수를 출력해 보자.
//객체명과 hashCode를 16진수로 변환한값 출력
System.out.println("p1.toString() --> "+p1);
System.out.println("p2.toString() --> "+p2);
//hashCode값 출력
System.out.println("p1.hashCode() --> "+p1.hashCode());
System.out.println("p2.hashCode() --> "+p2.hashCode());
//hashCode값을 16진수로 바꾸어서 한번 찍어보자.
System.out.println(Integer.toHexString(p1.hashCode())); 
System.out.println(Integer.toHexString(p2.hashCode())); 
//이번에는 String클래스의 예를보자.
String s1 = new String("abc");
String s2 = new String("abc");
//hashCode값 출력(문자열값이 같으므로 같은 hashCode)
//스트링 키객체의 주소가 달라도 같은 값을 가지면 객체의 해쉬 코드는 같다
        //String 클래스에 hashCode()메소드가 오버라이딩 되있기 때문에           
        //키 객체의 값이 같을때 이와 같이 같은 헤쉬코드를 리턴해야 
        //해쉬테이블, 해쉬맵 사용시 제대로된 Key로써 역할을 기에 오버라이딩함
System.out.println("s1.hashCode() --> "+s1.hashCode());
System.out.println("s2.hashCode() --> "+s2.hashCode());
//이번에는 String클래스의 예를보자.
String s3 = new String("abc");
String s4 = new String("def");
//다른 hashCode값 출력(문자열값이 다르므로 다른 hashCode)
System.out.println("s3.hashCode() --> "+s3.hashCode());
System.out.println("s4.hashCode() --> "+s4.hashCode());
}
}



[결과]

p1.toString() --> onj.Person@823618
p2.toString() --> onj.Person@ad89ec
p1.hashCode() --> 8533528
p2.hashCode() --> 11373036
823618
ad89ec
s1.hashCode() --> 96354
s2.hashCode() --> 96354
s3.hashCode() --> 96354
s4.hashCode() --> 99333

댓글 없음:

댓글 쓰기