My footsteps

hashCode, toString의 오버라이딩,Object클래스 본문

예습/이론

hashCode, toString의 오버라이딩,Object클래스

밀김 2023. 1. 20. 19:48
728x90

 

 

 

- 객체의 해시코드(주소?)를 int 형태로 반환하는 매서드 

 

- equals()를 오버라이딩 하면 해시코드도 오버라이딩을 같이 해줘야한다. 이퀄스의 결과가 참이면 두 객체의 주소가 같아야 하기 때문에..

 

- 객체=iv 집합 이므로 객체를 문자열로 반환한다는것은 iv의값을 문자열로 반환한다는 것과 같음

 

 

class Card {
	String kind;
	int number;
	//iv들

	Card() {
		this("SPADE", 1);
	}

	Card(String kind, int number) {
		this.kind = kind;
		this.number = number;
	}
	
	//오브젝트(Object.최고조상)클래스의 toString값을 오버라이딩 한것
	public String toString() {
		return "kind "+kind+", number "+number;
	}
}

class Ex9_4 {
	public static void main(String[] args) {
		Card c1 = new Card();
		Card c2 = new Card();

		System.out.println(c1.toString());
		System.out.println(c2.toString());
	}
}

 

 

 

 

 

 

 

class Ex9_1 {
	public static void main(String[] args) {
		Value v1 = new Value(10);
		Value v2 = new Value(10);

		if (v1.equals(v2))
			System.out.println("v1과 v2는 같습니다");
		else
			System.out.println("v1과 v2는 다릅니다");
	}
} //두 객체가 각각 따로라서 객체 주소값이 달라, 결과는 다릅니다가 나옴. 클래스 부분에서 오버라이딩 해줘야함

class Value {
	int value;

	Value(int value) {
		this.value = value;
	}
	
	public boolean equals(Object obj) { //오버라이딩 매서드
	//equals는 반환타입이 참,거짓이기 때문에 앞에 	boolean형을 써준다
		Value v = (Value)obj;
	//오브젝트 리모컨에는 Value라는 버튼이 없기 때문에 형변환을 해줘서 버튼을 생성해준것.
		return this.value==v.value;
		//참,거짓 반환해야하니까 boolean은 리턴문씀
	//this.value는 원조 value고 다른 value는 오브젝트의 value다.
	}
	
	
}

 

 

하지만 참조변수의 형변환 전에는 반드시 instanceof로 형변환이 되는지 확인을 해야하니까,boolean문에

if ( ! (obj instanceof Value) ) return false;

만약 obj가 value로 형변환이 안된다면 거짓을 반환해라

 

 

 

class Person {
	long id;

	public boolean equals(Object obj) {
		if(obj instanceof Person)
			return id ==((Person)obj).id;
		//(obj에는 id라는 버튼이 없으니 형변환을 통해 버튼 생성해준것.)person클래스가 가리키는 id랑,
		//obj가 가리키는 id를 비교해서 같다면, 
		else
			return false;
		//둘 값이 같지 않다면,
	}

	Person(long id) { //long타입인 id변수를 가진 person매서드
		this.id = id;
		//person id와 obj id 구분을 위해 this씀.
	}
}

class Ex9_2 {
	public static void main(String[] args) {
		Person p1 = new Person(8011081111222L); // long타입
		Person p2 = new Person(8011081111222L);
		//p1과 p2의 주민번호가 똑같다. 그래서 p1,p2 객체주소가 달라도 iv의 값으로 비교를 해서 같은 사람이라는 결과가 반환됨.

		if(p1.equals(p2))
			System.out.println("p1과p2는 같은 사람이다");
		// 여기로 이동해서 같은 사람이다 라는값 나오고
		else
			System.out.println("p1과p2는 다른 사람이다");
		// 여기로 이동해서 다른사람이다 라는 값 나오게.
	}
}

 

 

 

 

 

 

 

728x90