728x90
반응형
Object 클래스
모든 클래스의 최고 조상 - 오직 11개의 메서드만 가지고 있음
1. equals()
객체 자신(this)과 주어진 객체의 주소를 비교, 따라서 아래의 코드는 false가 출력된다
public static void main(String[] args) {
test t = new test(0);
test t2 = new test(0);
System.out.println(t.equals(t2));
// this t 를 object t2랑 비교하는 것이기 때문에 객체의 주소가 다르므로 false
}
}
class test{
int i;
public test(int i) {
this.i = i;
}
}
위의 값을 true로 바꾸기 위하여 overriding을 해줘야하는데 아래와 같이 실행할 수 있다.
- equals 메서드를 새로 오버라이딩하여 객체의 값을 비교하도록 만든다.
- 이 때 object (String) 클래스를 비교하도록 매개변수를 Object로 두고 이 클래스를 test 클래스로 형변환하여 test 값의 i 멤버변수를 사용할 수 있도록 만든다.
- 그 후 서로의 값만 비교할 수 있도록 오버라이딩을 하면 객체의 주소가 다르더라도 값이 같다면 true를 반환한다.
*형변환을 할 때 object클래스에 어떤 객체가 들어올지 모르므로 꼭 instanceof를 넣어 형변환이 가능한지 확인한다.
*만약 형변환이 안되는 객체라면 비교할 수 조차 없으므로 false를 반환한다.
class test{
int i;
public test(int i ) {
this.i = i;
}
public boolean equals(Object obj) {
// 어떤 객체가 들어올지 모르기때문에 꼭 instanceof로 형변환이 가능한 객체인지 확인해야한다.
if(obj instanceof test) {
test t = (test)obj;
return this.i == t.i;
}
else {
return false;
// 타입이 test값이 아니라면 비교할 필요도 없음
}
2. hashcode()
객체의 주소를 int값으로 변환
- equals를 오버라이딩하여 객체의 값을 비교할 때 hashcode(객체의 주소)도 동일하게 오버라이딩을 해주어야 한다.
- 객체의 값이 같다면 객체의 주소값도 같아야하기 때문
- 두 메서드 전부 객체의 주소를 가지고 작업하지만, iv(지역변수, 멤버변수)를 가지고 작업하게 둘다 오버라이딩
- hashCode를 오버라이딩 할 때 사용하는 메서드는 Objects.hash()를 사용하면 된다
*System.identityHashCode(Object obj) - 혹시 본인의 기존 hashcode를 사용하고 싶다면 이 함수를 사용
*hashCode 오버라이딩의 반환값은 정수값, 즉 int값이며 return값은 논리적으로 값이 같은 것을 보여줄만한 멤버변수 1개를 골라 return한다.
아래 출력문을 보면 hashCode가 동일한 것을 확인할 수 있고 identityHashCode로 인해 본래의 hashCode 값을 출력
출력문:
1581543
1581543
1365202186
public static void main(String[] args) {
System.out.println(t.hashCode());
System.out.println(t2.hashCode());
System.out.println(System.identityHashCode(t));
public int hashCode() {
return Objects.hash(age, name, getTime(),getMoney());
}
// hash는 가변인자이기 때문에 매개변수의 숫자는 상관하지 않는다
3. toString
객체 주소의 iv값을 원하는 형식의 String값으로 변환하여 출력해줌
주소, 즉 hashCod값을 String으로 변환하여 출력
public String toString() {
return "이름: " + Name + ", 핸드폰 번호: " + PhoneN + ", 주소: " + address + ", 나이: " + age;
}
// 객체의 hashCode값을 String값으로 변환
728x90
반응형
'Java > 자바의정석 기초편' 카테고리의 다른 글
자바의 정석 9장 (24일차) - String 메서드 (0) | 2022.02.15 |
---|---|
자바의 정석 9장 (24일차) - String 클래스 (0) | 2022.02.15 |
자바의 정석 8장 (23일차) - 연습문제 (try-catch로 숫자게임 반복하기) (0) | 2022.02.14 |
자바의 정석 8장 (22일차) - 사용자 정의 예외처리 & 예외 되던지기 & 연결된 예외 처리(Chained Exception) (0) | 2022.02.13 |
자바의 정석 8장 (21일차) - 메서드에 예외 선언 & finally (0) | 2022.02.10 |