Programming/JAVA

JAVA.LANG PACKAGE

gyu0 2020. 7. 7. 23:23

equals()

equals test

	Value(int Value){
		this.Value = Value;
	}
}
public class EqualsEx1 {
	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는 다릅니다.");
		}
	}//메인
}//java.lang.package equals test.

 

equals test (overriding)

class Person{
	long id;
	public boolean equals(Object obj) {
		if (obj instanceof Person) {
			return id == ((Person)obj).id;
			//obj가 object타입이므로 id값을 참조하기 위해서는 Person타입으로 형변환이 필요하다.
		}
		else {
			return false;
		}
	}
	Person(long id){
		this.id=id;
	}
}
public class EqualsEx2 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person p1 = new Person(8011081111222L);
		Person p2 = new Person(8011081111222L);
		
		if(p1==p2)
			System.out.println("p1과 p2는 같은 사람 입니다.");
		else
			System.out.println("p1과 p2는 다른 사람 입니다.");
		if(p1.equals(p2)) 
			System.out.println("p1과 p2는 같은 사람 입니다.");
		else
			System.out.println("p1과 p2는 다른 사람 입니다.");
	}
}

 

오버라이딩을 한 것과 안한 것의 차이는 그냥 단순 변수로만 비교되었을 때는 서로의 주솟값을 비교한다.

하지만 equals 를 오버라이딩해서 확인 한 결과 equals의 메서드는 서로 그 주소값이 아닌 내부값을 직접 비교한다.

 

 

hashcode()다량의 데이터를 저장하고 검색하는 데 유용하다. 찾고자하는 값을 입력하면 그 데이터가 저장된 위치를 알려주는 해시코드를 반환한다.

hashcode를 오버라이딩 하지 않는다면 모든 객체가 서로다른 해시코드값을 가질 것이므로, 같은 객체라면 적절하게 오버라이딩해서 같은 객체가 서로 같은 값을 가질 수 있도록 오버라이딩한다.

 

public class HashCode1 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str1 = new String("abc");
		String str2 = new String("abc");
		
		System.out.println(str1.equals(str2));//print equals messages
		System.out.println(str1.hashCode());
		System.out.println(str2.hashCode());
		//equals를 적절하게 오버라이딩해서 같은 객체의 문자열이 같을 경우 같은 해시값을 도출한다.
		System.out.println(System.identityHashCode(str1));
		System.out.println(System.identityHashCode(str2));
		//반면 object class 에서 identityHashCode는 서로 다른 주솟값에 대해 해시코드를 도출한다.
	}
}

 

 

equals를 적절하게 오버라이딩 한 equals , hashcode는 객체의 문자열이 같을 경우 같은 해시값을 도출하며

반면에 object class 에서 identityHashCode는 서로 다른 주솟값에 대해 해시코드를 생성한다.

 

tostring()

class Card{
	int number;
	String kind;
	
	Card(){
		this("SPADE",1);
	}
	Card(String kind, int number){
		this.kind=kind;
		this.number=number;
	}
}
public class CardToString {
	public static void main(String[] args) {
		Card c1 = new Card();
		Card c2 = new Card();
		System.out.println(c1.toString());
		System.out.println(c2.toString());
	}
/*public string tostring(){
 * 	return getclass().getname()+"@"+Integer.tohexstring(hashcode());
 * {
 * 이런 식으로 되어있어서 저 문자를 출력시 Card@hashcode 이런식으로 서로다른 값을 띈다.
 * 클래스 네임은 같아도 다른 객체인 것을 확인하는 문제.
 * 객체 자체의 string 문자열이 있어야 그것을 문자열로 반환한다.
 */
}

 

public string tostring(){
 *return getclass().getname()+"@"+Integer.tohexstring(hashcode());
  {
 * 이런 식으로 되어있어서 저 문자를 출력시 Card@hashcode 이런식으로 서로다른 값을 띈다.
 * 클래스 네임은 같아도 다른 객체인 것을 확인하는 문제.
 * 객체 자체의 string 문자열이 있어야 그것을 문자열로 반환한다.

 

오버라이딩 후

class Card {
	int number;
	String kind;
	
	Card(){
		this("SPADE",1);
	}
	Card(String kind, int number){
		this.kind=kind;
		this.number=number;
	}
	public String toString() {
		return "kind : "+kind+",number : "+number;
		//card인스턴스 kind와 number를 문자열로 반환한다. 적절한 오버라이딩
	}
}

public class CardToString2 {
	public static void main(String[] args) {
		Card c1 = new Card();
		Card c2 = new Card("HEART",10);
		System.out.println(c1.toString());
		System.out.println(c2.toString());
	}
/*
 * 1번을 오버라이딩 한 코드.
 */
}