Object 클래스의 메서드 활용

0

Java 공부

목록 보기
16/18

equals() 메서드

  • 두 객체의 내용이 같은지 확인하는 메서드
  • 두 인스턴스의 주소 값을 비교하여 true/false를 반환한다.
  • 재정의 하여 두 인스턴스가 논리적으로 동일함의 여부를 구현한다.
  • 인스턴스가 다르더라도 논리적으로 동일한 경우 true를 반환하도록 재정의 할 수 있다. (같은 학번, 같은 사번, 같은 아이디의 회원)

hashCode() 메서드

  • 두 객체가 같은 객체인지 확인하는 메서드
  • 인스턴스의 저장 주소를 반환함
  • 자료의 특정 값(키값)에 대한 저장 위치를 반환해주는 해시 함수를 사용한다.

Student.java

public class Student {
	private int studetnNum;
	private String studentName;
	
	public Student(int studetnNum, String studentName) {
		this.studetnNum = studetnNum;
		this.studentName = studentName;
	}
	
	public String toString() {
		return studetnNum + ","+ studentName;
	}
}

EqualTest.java

public class EqualsTest {

	public static void main(String[] args) {
		
		Student std1 = new Student(100, "Lee");
		Student std2 = new Student(100, "Lee");
		
		System.out.println(std1 == std2);
        System.out.println(std1.equals(std2));
	}
}

false
false

std1 과 std2는 다른 주소를 가지고 있는 다른 객체이다.
하지만 논리적으로 학번(studetnNum)의 값이 같으면 같은 학생으로 보는것이 논리적이다.


논리적으로 학번이 같으면 true하고 싶다면!

public class Student {

	private int studetnNum;
	private String studentName;
	
	public Student(int studetnNum, String studentName) {
		this.studetnNum = studetnNum;
		this.studentName = studentName;
	}
	
	public String toString() {
		return studetnNum + ","+ studentName;
	}

	@Override
	public int hashCode() {
		return super.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Student) { //obj가 Student와 같은 타입이라면
			Student std = (Student)obj; // 다운캐스팅 되며,
			if(this.studetnNum == std.studetnNum) { // studetnNum과 std.studetnNum가 같은지?
				return true;
			} else {
				return false;
			}
		}
		return false;//obj와 Student가 다르다면 false
	}
}
public class EqualsTest {

	public static void main(String[] args) {
		
		Student std1 = new Student(100, "Lee");
		Student std2 = new Student(100, "Lee");
		
		System.out.println(std1 == std2);
		System.out.println(std1.equals(std2));
		
		System.out.println(std1.hashCode());
		System.out.println(std2.hashCode());
	}
}

false
true
1134712904
985922955

주소값은 달라 false로 다르다고 출력되지만,
논리적으로 같다고 재정의 하였기 때문에 true.

Student.java

	@Override
	public int hashCode() {
		return studetnNum; // 학번이 같을때(equals) 같은학번이 반환된다.
	}

false
true
100
100

주소값은 틀리지만(false),
학번이 논리적으로 같아서(true),
논리적으로 같기때문에 같은 헤시값이 출력되었다.(100, 100)

0개의 댓글