package ch01_Object;

//public class ExObject extends Object{
public class ExObject {	
	public static void main(String[] args) {
		// import 하지 않아도 사용할 수 있는 class(System, Object...) → java.lang package에 있음. → import하지 않아도 자동으로 import됌. 
		// java의 최상위 class → JAVA 의 모든 class는 Object를 상속받음.
		Object objA = new Object();
		Object objB = new Object();
		
		// getClass() : class type 변환.
		System.out.println("objA.getClasses() : " + objA.getClass());
		
		System.out.println();
		
		// hashCode() : 객체 고유번호. → 중복되지 않음.
		// 10진수.
		System.out.println("objA.hashCode() : " + objA.hashCode());
		System.out.println("objB.hashCode() : " + objB.hashCode());
		
		System.out.println();
		
		// toString() : getClass() + hashCode() 조합.
		// 16진수로 바뀜.
		System.out.println("objA.toString() : " + objA.toString());
		System.out.println("objA : " + objA);
		System.out.println("objB.toString() : " + objB.toString());
		System.out.println("objB : " + objB);
		
		System.out.println();
		
		// equals() : 동일한 객체인지 확인.
		System.out.println("objA.equals(objB) : " + objA.equals(objB));
		
		System.out.println();
		
		
		
	}
}
package ch01_Object;

/*
 * Car class 를 정의하고, CarMain class 에서 테스트 하세요
 * - 제조회사, 모델명의 관리가 가능합니다
 * - 제조회사, 모델명이 같으면 동일한 차량으로 판단해야 합니다
 * - 변수명을 사용해서 차량 정보를 확인할 수 있습니다
 */

public class Car {
	private String company;
	private String model;
	
	public Car(String company, String model) {
		this.company = company;
		this.model = model;
	}
	
	public int hashCode() {
		return company.hashCode() + model.hashCode();
	}
	
	public boolean equals(Object obj) {
		if(obj instanceof Car) {
			Car tmp = (Car) obj;
//			if(this.company.equals(tmp.company) && this.model.equals(tmp.model)) {
//				return true;
//			}
			if(!company.equals(tmp.company))
				return false;
			if(!model.equals(tmp.model))
				return false;
			return true;
		}
		return false;
	}
	
	public String toString() {
		return "제조회사 : " + company + "\\n모델명 : " + model;
	}

	
}
--------------------------------------------------------------------------------

// CarMain
package ch01_Object;

public class CarMain {

	public static void main(String[] args) {
		
		Car car1 = new Car("현대","아반떼");
		Car car2 = new Car("현대","아반떼");
		Car car3 = new Car("기아","ev5");
		System.out.println("car1.equals(car2) : " + car1.equals(car2));
		System.out.println("car1.equals(car3) : " + car1.equals(car3));
		System.out.println(car1);
		System.out.println(car2);
		System.out.println(car3);
	}

}
package ch01_Object;

public class Product {
	
	private String serial; // 제품 고유 번호.
	
	public Product(String serial) {
		this.serial=serial;
	}
	
	// hashcode method 
	public int hashCode() {
		return serial.hashCode();
	}
	
	public boolean equals(Object obj) { // UP casting
		if(obj instanceof Product) { // 같은 타입인지 확인.
			Product tmp = (Product)obj; // 원래 타입으로 반환. Downcasting.
			if(this.serial.equals(tmp.serial)) { // 현재 serial값과 넘어온 serial 값 비교.
				return true;
			}
		}
		return false;
	}
	
	public String toString() {
		return "제품번호 : " + serial;
	}
	
	public void showSerial() {
		System.out.println("제품번호 : " + serial);
	}
	
}
--------------------------------------------------------------------------------

// ProductManager
package ch01_Object;

public class ProductManager {
	
	public static void main(String[] args) {
		
		Product pro1 = new Product("001");
		Product pro2 = new Product("002");
		Product pro3 = new Product("001");
		
		System.out.println();
		
		System.out.println(pro1.equals(pro2));
		System.out.println(pro1.equals(pro3));
		
		System.out.println(pro1.toString());
	}
}