package CHAPTER08;

class Book {
	private String title; 
	private String isbn; 
	
	public Book(String title, String isbn) {
		this.title = title;
		this.isbn = isbn;
	}
	
	// 객체를 문자열로 표현할 때 호출되는 메서드 (Object 클래스 오버라이드)
	@Override
	public String toString() {
		return "제목: " + title + ", ISBN: " + isbn;
	}

	// 두 Book 객체의 동등성 판단 (ISBN 기준으로 동일하면 같다고 판단)
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true; // 주소가 같으면 true
		if (!(obj instanceof Book))
			return false; // Book 타입이 아니면 false
		Book b = (Book) obj;
		return this.isbn.equals(b.isbn); // ISBN 값이 같으면 true
	}

	// hashCode도 ISBN 기준으로 생성 (equals와 일치되도록 보장)
	@Override
	public int hashCode() {
		return isbn.hashCode();
	}
}

public class ObjectClass { 
	public static void main(String[] args) {		
		Book b1 = new Book("자바 마스터", "12345");
		Book b2 = new Book("자바 마스터", "12345"); // 내용은 같지만 객체는 별개
		Book b3 = new Book("C 프로그래밍", "67890");

		// toString() 자동 호출
		System.out.println(b1);

		// equals()를 이용한 내용 비교 (ISBN 기준)
		System.out.println("b1 equals b2: " + b1.equals(b2)); // true
		System.out.println("b1 equals b3: " + b1.equals(b3)); // false

		// hashCode 출력 (같은 ISBN이면 같은 해시코드)
		System.out.println("b1 hashCode: " + b1.hashCode());
		System.out.println("b2 hashCode: " + b2.hashCode());
	}
}
