컴퓨터공학 💻 도서관📚
Part2. 4-2 Object 클래스의 메서드 활용 (equals 메서드, hashCode 메서드, clone() 메서드) 본문
Part2. 4-2 Object 클래스의 메서드 활용 (equals 메서드, hashCode 메서드, clone() 메서드)
들판속초록풀 2025. 6. 17. 17:50equals 메서드 : 두 인스턴스의 주소를 비교하는 메서드
hashCode 메서드 : 인스턴스의 주소를 반환하는 메서드
equals() 메서드
- 두 인스턴스의 주소 값을 비교하여 true/false를 반환
- 재정의 하여 두 인스턴스가 논리적으로 동일함의 여부를 구현함
- 인스턴스가 다르더라도 논리적으로 동일한 경우 true를 반환하도록 재정의 할 수 있음
(같은 학번, 같은 사번, 같은 아이디의 회원...)
hashCode() 메서드
- hashCode()는 인스턴스의 저장 주소를 반환함
- 힙메모리에 인스턴스가 저장되는 방식이 hash 방식 (딕션너리)
- hash : 정보를 저장, 검색하는 자료구조 (딕션너리)
- 자료의 특정 값(키 값)에 대한 저장 위치를 반환해주는 해시 함수를 사용
* 두 인스턴스가 같다는 것은?
힙 메모리의 주소값, 위치가 같으면 두 개의 인스턴스가 같다는 뜻이다
두 인스턴스에 대한 equals()의 반환 값이 true 이다. / 동일한 hashCode() 값을 반환한다.
* 두 객체가 논리적으로 같다라고 하면, 두 객체가 반환하는 해시 코드 값이 같아야 한다.
그런데 컴퓨터 내에서 실제적으로 물리적으로 같은 것은 아니다. 반환하는 값만 같은 거지.
물리적인 해시 코드 값을 꺼내 보는 함수는 따로 있다.
equals 메서드와 hashCode 메서드. 두 개의 메서드는 페어(한 쌍)이다.
equals 를 오버라이딩 했다면, 그 객체가 반환하는 hashCode 값도 오버라이딩 해줘야 한다
어떤 방식으로 오버라이딩 하냐면 equals 에서 사용한 멤버 변수가 있을 건데 예시로 학번이 같으면 같은 거라고 할 때
학번이 유일한 key이고 key가 같으면 equals 가 true를 한다. 그러면 해시 코드 값을 학번으로 반환해주면 된다.
정리 : 논리적으로 동일함을 위해 equals() 메서드를 재정의 하였다면
hashCode()메서드도 재정의 하여 동일한 hashCode 값이 반환되도록 재정의해야 한다.
clone() 메서드
- 객체의 원본을 복제하는데 사용하는 메서드
생성자와는 다른 것이다. 생성자는 초기화해서 처음 값을 가지고 초기 값을 갖고 생성이 되는 거지만
클론은 중간에 변수의 값이 변했다고 가정할 때, 그 변한 값을 그대로 복제하는 메서드이다. - 생성과정의 복잡한 과정을 반복하지 않고 복제 할 수 있음
- clone()메서드를 사용하면 객체의 정보(멤버 변수 값등...)가 동일한 또 다른 인스턴스가 생성되는 것이므로,
객체 지향 프로그램에서의 정보 은닉, 객체 보호의 관점에서 위배될 수 있다 - 그래서 해당 클래스의 clone() 메서드의 사용을 허용한다는 의미로 Cloneable 인터페이스를 명시해 줘야 한다.
public class Student implements Cloneable{ // Cloneable 인터페이스를 명시 : 얘는 클론해도 된다.
.......
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
Student Lee3 = (Student)Lee.clone();
System.out.println(System.identityHashCode(Lee));
System.out.println(System.identityHashCode(Lee3));
public class Student {
private int studentId;
private String studentName;
public Student(int studentId, String studentName)
{
this.studentId = studentId;
this.studentName = studentName;
}
@Override
public boolean equals(Object obj) {
if( obj instanceof Student) { // instanceof : 객체가 어떤 클래스의 인스턴스인지 확인하는 연산자
Student std = (Student)obj;
if(this.studentId == std.studentId )
return true;
else return false;
}
return false;
}
@Override
public int hashCode() {
return studentId;
}
}
package ch02;
public class Student implements Cloneable{
private int studentId;
private String studentName;
public Student(int studentId, String studentName)
{
this.studentId = studentId;
this.studentName = studentName;
}
@Override
public boolean equals(Object obj) { // 재정의한 equals() 메서드
if( obj instanceof Student) {
Student std = (Student)obj; // Object 클래스를 Student 클래스로 다운캐스팅
if(this.studentId == std.studentId ) // 두 핛번이 논리적으로 같은지 확인
return true; // 논리적으로 같으면 true 를 반환하게 재정의
else return false;
}
return false;
}
@Override
public int hashCode() { // 재정의한 hashcode() 메서드
return studentId; // 학번을 반환하게 해서 논리적으로 같으면 같은 값을 출력하도록 재정의
}
@Override
protected Object clone() throws CloneNotSupportedException { // clone() 메서드
// TODO Auto-generated method stub
return super.clone();
}
}
package ch02;
public class EqualTest {
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)); // 논리적으로는 같고 (equals메서드 재정의)
System.out.println(std1.hashCode()); // 논리적으로 같기 때문에 같은 해시 코드 값이 반환되게 hashCode메서드 재정의
System.out.println(std2.hashCode());
// 실제 해시 코드 값 확인 방법
System.out.println(System.identityHashCode(std1));
System.out.println(System.identityHashCode(std2));
}
}
package ch02;
public class EqualTest {
public static void main(String[] args) throws CloneNotSupportedException {
Student Lee = new Student(100, "Lee");
Student Lee2 = Lee;
Student Shun = new Student(100, "Lee");
System.out.println(Lee == Shun);
System.out.println(Lee.equals(Shun));
System.out.println(Lee.hashCode());
System.out.println(Shun.hashCode());
Integer i1 = new Integer(100);
Integer i2 = new Integer(100);
System.out.println(i1.equals(i2));
System.out.println(i1.hashCode());
System.out.println(i2.hashCode());
System.out.println(System.identityHashCode(i1));
System.out.println(System.identityHashCode(i2));
Student Lee3 = (Student)Lee.clone();
System.out.println(System.identityHashCode(Lee));
System.out.println(System.identityHashCode(Lee3));
}
}
'✅🌲강의 복습 노트 > 패캠 JavaSpring 강의,코드 복습' 카테고리의 다른 글
Part2. 4-4 Class 클래스 사용하기 (조금 이해 안 된 강의) (0) | 2025.06.19 |
---|---|
Part2. 4-3 String, StringBuilder, StringBuffer 클래스, text block (0) | 2025.06.19 |
Part2. 4-1 Object 클래스 - 모든 클래스의 최상위 클래스 (toString 메서드) (0) | 2025.06.17 |
Part2. 3-16 객체 코딩으로 복습하기 2 (0) | 2025.06.16 |
Part2. 3-16 객체 코딩으로 복습하기 1 (0) | 2025.06.16 |