package com.tenco.object;
//자동으로 import 되는 패키지이다
//import java.lang.*;
import com.tenco.Inheritance.B;
/**
* Object 클래스는 모든 클래스의 최상위 클래스이다
* 자바는 기본적으로 단일 상속만을 지원하지만 단, Object 클래스는 예외이다
*/
//public class Book extends Object
public class Book extends Object {
private String title;
private String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public void showInfo() {
// ....
}
@Override
public String toString() {
return "제목 : " + title + ", " + "저자 : " + author;
}
// 테스트 코드
public static void main(String[] args) {
Book book = new Book("데미안", "헤르만헤세");
System.out.println(book.toString());
}
}
기본 동작: 참조 비교( == )를 수행하여 두 객체가 동일한 메모리 주소를 가리키는지 확인.
재정의 목적 : 논리적 동등성을 비교(ex: 책 제목, 저자, ID가 같으면 같은 책으로 간주)
주의사항 : equals()를 재정의할 때는 hashCode()도 반드시 재정의 해야 함 (의도치 않은 결과 예방)
//equals()를 재정의 할 때 해시코드 메서드를 함께 재정의 해야 의도치 않은 결과를 예방할 수 있다
@Override
public int hashCode() {
return bookTypeId;
}
-코드
package com.tenco.object;
//자동으로 import 되는 패키지이다
//import java.lang.*;
import com.tenco.Inheritance.B;
/**
* Object 클래스는 모든 클래스의 최상위 클래스이다
* 자바는 기본적으로 단일 상속만을 지원하지만 단, Object 클래스는 예외이다
*/
//public class Book extends Object
public class Book extends Object {
private String title;
private String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
@Override
public boolean equals(Object obj) {
// 물리적 주소 비교가 아닌 논리적으로 같다라고 판별하고 싶다면 자식 클래스에서 재정의하면
// 기능을 구현해 준다.
// 만약 책 제목 같다면 논리적으로 같은 책이라고 판단하고 true 반환 아니면 false 반환
if (obj instanceof Book) {
// Book 타입먼저 확인
// 제목.equals("제목")
Book targetBook = (Book) obj;
// 데미안 equals 데미안
if (this.title.equals(targetBook.title)) {
return true;
}
}
return false;
}
// @Override
// public String toString() {
// return "제목 : " + title + ", " + "저자 : " + author;
// }
// 테스트 코드
public static void main(String[] args) {
Book book1 = new Book("데미안", "헤르만헤세");
Book book2 = new Book("데미안", "헤르만헤세");
Book book3 = book1;
System.out.println(book1);
System.out.println(book2);
if (book1 == book2) {
System.out.println("Heap 메모리 영역에 같은 객체를 가리키고 있다");
} else {
System.out.println("서로 다른 주소를 가지고 있어요. 다른 객체");
}
// Object 클래스의 메서드인 equals() 를 사용해서 각 객체의 주소값을 비교해보자.
boolean result1 = book1.equals(book2);
System.out.println("결과 book1과 book2에 논리적인 비교 결과 : " + result1);
boolean result2 = book1.equals(book3);
System.out.println("결과 book1과 book3에 논리적인 비교 결과 : " + result2);
}
}
객체를 효율적으로 저장하고 검색할 때 사용.(ex : 도서관 책 청구기호(123.4 가)로 분류)
기본 동작 : 객체의 메모리 주소를 기반으로 고유한 정수 값을 생성.
재정의 목적: 논리적으로 동일한 객체가 동일한 해시코드를 반환하도록 보장하여, equals()와 일관성 유지.
코드
package com.tenco.object;
//자동으로 import 되는 패키지이다
//import java.lang.*;
import com.tenco.Inheritance.B;
/**
* Object 클래스는 모든 클래스의 최상위 클래스이다
* 자바는 기본적으로 단일 상속만을 지원하지만 단, Object 클래스는 예외이다
*/
//public class Book extends Object
public class Book extends Object {
private String title;
private String author;
private int bookTypeId;
public Book(String title, String author, int bookTypeId) {
this.title = title;
this.author = author;
this.bookTypeId = bookTypeId;
}
public void showInfo() {
//.....
}
// @Override
// public String toString() {
// return "제목 : " + title + "," + "저자 : " + author;
// }
//equals()를 재정의 할 때 해시코드 메서드를 함께 재정의 해야 의도치 않은 결과를 예방할 수 있다
@Override
public int hashCode() {
return bookTypeId;
}
@Override
public boolean equals(Object obj) {
//물리적 주소 비교가 아닌 논리적으로 같다라고 판별하고싶다면 자식 클래스에서 재정의하면
//기능을 구현해 준다
//만약 책 제목 같다면 논리적으로 같은 책이라고 판단하고 true 반환 아니면 false반환
if (obj instanceof Book) {
//Book 타입 먼저 확인
//제목.equals("제목")
Book targetBook = (Book) obj;
// 데미안 equals 데미안
if (this.title.equals(targetBook.title)) {
return true;
}
}
return false;
}
//테스트 코드
public static void main(String[] args) {
Book book1 = new Book("데미안", "헤르만헤세", 1);
Book book2 = new Book("데미안", "헤르만헤세", 1);
Book book3 = book1;
System.out.println(book1);
System.out.println(book1.hashCode());
System.out.println("--------------------------------");
System.out.println(book1);
System.out.println(book2);
if (book1 == book2) {
System.out.println("Heap 메모리 영역에 같은 객체를 가리키고 있다");
} else {
System.out.println("서로 다른 주소를 가지고 있어요. 다른 객체");
}
//Object 클래스의 메서드인 equals()를 사용해서 각 객체의 주소값을 비교해보자
boolean result1 = book1.equals(book2);
System.out.println("결과 book1과 book2에 논리적인 비교 결과 " + result1);
boolean result2 = book1.equals(book3);
System.out.println("결과 book1과 book3에 논리적인 비교 결과 : " + result2);
}
}