romworld

Equals, HashCode 본문

JAVA/개념정리

Equals, HashCode

inderrom 2022. 10. 28. 13:55

 

package kr.or.ddit.basic;

import java.util.HashSet;

public class EqualsHashCodeTest {

	public static void main(String[] args) {
		Person p1 = new Person();
		p1.setNum(1);
		p1.setName("홍길동");

		Person p2 = new Person();
//		p2.setNum(2);
//		p2.setName("이순신");
		p2.setNum(1);
		p2.setName("홍길동");

		Person p3 = p1;

		System.out.println(p1 == p2); // false 주소값 비교
		System.out.println(p1.equals(p2)); // false object에는 equals가 만들어져 있는데
											// 기본적으로 참조값을 비교하기 위해 만들어짐
											// 즉 equals를 쓰고 싶으면 Person 클래스에서 equals를 재정의를 해주면 됨

		// -----------------------------------------------

		HashSet<Person> testSet = new HashSet<Person>();

		testSet.add(p1);
		testSet.add(p2);
		System.out.println("set의 크기 : " + testSet.size());
		System.out.println();

		System.out.println("p1 : " + p1.hashCode()); // 해쉬코드는 다른 객체와 구별하기 위해 .. 참조값을 활용해서 해시코드를 만듬
		System.out.println("p2 : " + p2.hashCode()); // equals와 hash코드는 서로 연관이 있다
		System.out.println("p3 : " + p3.hashCode());

		/*
		 * - equals()메서드 ==> 두 객체의 내용이 같은지 검사하는 메서드 - hashCode()메서드 ==> 두 객체의 동일성을 검사하는
		 * 메서드
		 * 
		 * - HashSet, Hashtable, HashMap과 같이 Hash로 시작하는 컬렉션 객체들은 객체의 의미상의 동일성을 비교하기 위해서
		 * hashCode()메서드를 호출하여 비교한다. 그러므로 객체가 같은지 여부를 결정하려면 hashCode()메서드를 재정의 해야 한다.
		 * 단순이 값만 비교할 때는 equals만 써도 된다 결과가 true가 나오고 싶을 때.. hashCode 를 쓰는 이유는 데이터 값과
		 * 참조값이 다를 경우에 완전히 두 객체를 같게 하고 싶을 때
		 */
	}

}

class Person { // extends Object가 생략되어있는 것 .. 기본적으로 상속 받고 있으므로
	private int num;
	private String name;

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	/*
	 * @Override public boolean equals(Object obj) { if(this==obj) { // 참조값이 같냐고
	 * 물어보는 것 return true; } if(obj == null) { return false; } if(this.getClass()!=
	 * obj.getClass()) { // 같은 유형의 클래스인지 여부 검사 return false; //getClass() : 클래스의 정보를
	 * 읽어오는 것 }
	 * 
	 * Person that = (Person)obj; // 인수값으로 받은 객체를 현재 객체 유형으로 형변환한다.
	 * 
	 * if(this.name==null && that.name!=null) { return false; }
	 * 
	 * if(this.num == that.num && this.name == that.name) { return true; }
	 * if(this.num==that.num && this.name.equals(that.name)) { return true; } return
	 * false; }
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + num;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (num != other.num)
			return false;
		return true;
	}
}

'JAVA > 개념정리' 카테고리의 다른 글

Properties  (0) 2022.10.28
Map , Set  (0) 2022.10.28
ArrayList  (0) 2022.10.28
정렬(Comparable, Comparator)  (0) 2022.10.28
JDBC (DB와 연결)  (0) 2022.10.10
Comments