JAVA - 객체(toString(), equals(), hashCode())

Object

Object.class 파일에는 여러가지의 메소드가 존재한다.

그중에서 3가지의 메소드를 대표적으로 사용하고있다.

toString()

원래는 풀클래스명@객체의 해쉬코드 16진수값이 출력이되는데,

대부분 그 객체가 가지고있는 필드값을 보여줄때 사용된다.

toString() Override(X)

 

Product.class

class Product{
	//toString() override 안하였음.
}

 

Run.class

public class Run {
	public static void main(String[] args) {
    	Product p = new Product(); //Product 자료형의 객체 생성
        // p참조변수가 참조하고있는 Product객체의 toString 메소드 호출
        System.out.println(p.toString()); 
        
        // 위의 코드랑 동일한 효과
        // toString() 는 안적어줘도 JVM에서 자동으로 적어주기때문에 안써도무방
        System.out.println(p);
    
    }
}

 

출력

com.java.Product@622b8a45  << p.toString()

com.java.Product@622b8a45  << p

 

위의 방식처럼 클래스명@해쉬코드16진수값으로 출력이된다.

앞으로 toString은 안쓰고 참조변수명만 써야지 ..

 

 

toString() Override(O)

 

Product.class

class Product{
	private String name;
	private int price;
    
    public Product(){
    	
    }
    public Product(String name, int price){
    	this.name = name;
        this.price = price;
    }
    
    
    // toString Override 하였음
	@Override
    public String toString(){
    	return "name : " + name + ", price : " + price;
    }
}

 

Run.class

public class Run {
	public static void main(String[] args) {
    	Product p = new Product("홍길동", 200); //Product 자료형의 객체 생성
        // p참조변수가 참조하고있는 Product객체의 toString 메소드 호출
        System.out.println(p.toString()); 
        
        // 위의 코드랑 동일한 효과
        // toString() 는 안적어줘도 JVM에서 자동으로 적어주기때문에 안써도무방
        System.out.println(p);
    
    }
}

 

출력

name 홍길동, price 100  << p.toString()

name 홍길동, price 100  << p

 

 

equals()

equals은 참조변수 가 가지고있는 값을 비교할때사용한다.

String str1 = "cc";

String str2 = "cc";

str1.equals(str2); = true

이런식으로 String 참조자료형 작성할때 사용했을것이다.

근데 이걸 객체를 비교할때도 사용한다.

객체의 타입과, 객체의 필드를 확인하여 사용한다.

 

Product.class



public class Product {
  private String name;
  private String id;
  private int price;
  
  // 생성자
  public Product(){}
  public Product(String name, String id, int price){
  	this.name = name;
    this.id = id;
    this.price = price;
  }
  
  // getter/setter 생략
  
  // equals Override
  @Override
  public boolean equals(Object obj){
  	// 1. 매개변수로 들어오는 obj를 비교할 객체타입으로 받아 변수생성
    Product p = (Product) obj;
    
    // 2. 우선적으로 매개변수로 들어온타입과 비교할타입이 같은객체인지 확인
    //    만약 같은객체가아니면 return false;
    if(!(p instanceof Product)){
    	return false;
    }
    
    // 3. 같은객체면 자신객체와 매개변수로들어온 객체의 필드값 확인
    //    모든필드의 값이 일치하면 return true 반환
    return this.name.equals(p.getName()) && this.id.equals(p.getName()) && this.price == p.getPrice();
  }


}

 

Run.class

public class Run {
	public static void main(String[] args) {
   		Product p1 = new Product("홍길동","hong",100);
        Product p2 = new Product("김길동","kim",100);
        Product p3 = new Product("홍길동","hong",100);
        
        System.out.println(p1.equals(p2)); //객체는 같지만 주소값이다르기때문에 false반환
        System.out.println(p2.equals(p3)) //객체는 같지만 주소값이다르기때문에 false반환
        System.out.println(p1.equals(p3)) //객체도 같고 필드값도 다 같기때문에 true반환
    }
}

 

 

hashCode()

실행 중 객체의 Integer값을 반환한다. heap에 저장된 객체의 메모리 주소를 반환 한다.

 

 

hashCode() 를 Override 하지않았을시

Product.class

public class Product {
  private String name;
  private String id;
  private int price;
  
  // 생성자
  public Product(){}
  public Product(String name, String id, int price){
  	this.name = name;
    this.id = id;
    this.price = price;
  }
  
  // getter/setter 생략
  
  // equals Override
  @Override
  public boolean equals(Object obj){
  	// 1. 매개변수로 들어오는 obj를 비교할 객체타입으로 받아 변수생성
    Product p = (Product) obj;
    
    // 2. 우선적으로 매개변수로 들어온타입과 비교할타입이 같은객체인지 확인
    //    만약 같은객체가아니면 return false;
    if(!(p instanceof Product)){
    	return false;
    }
    
    // 3. 같은객체면 자신객체와 매개변수로들어온 객체의 필드값 확인
    //    모든필드의 값이 일치하면 return true 반환
    return this.name.equals(p.getName()) && this.id.equals(p.getName()) && this.price == p.getPrice();
  }


}

 

Run.class

public class Run {
	public static void main(String[] args) {
   		Product p1 = new Product("홍길동","hong",100);
        Product p2 = new Product("김길동","kim",100);
        Product p3 = new Product("홍길동","hong",100);
        
        System.out.println(p1.hashCode()); // 123123151456856
        System.out.println(p2.hashCode()); // 2311253151456856
        System.out.println(p3.hashCode()); // 1811253151456856
    }
}

 

 

hashCode() 를 Override 했을시

Product.class

public class Product {
  private String name;
  private String id;
  private int price;
  
  // 생성자
  public Product(){}
  public Product(String name, String id, int price){
  	this.name = name;
    this.id = id;
    this.price = price;
  }
  
  // getter/setter 생략
  
  
  // hashCode Override
  @Override
  public int hashCode(){
  	// 모든필드값을 괄호안에 작성후 한반더 hashCode() 사용한다.
  	return (name + id + price).hashCode();
  }
  
  
  
  
  
  // equals Override
  @Override
  public boolean equals(Object obj){
  	// 1. 매개변수로 들어오는 obj를 비교할 객체타입으로 받아 변수생성
    Product p = (Product) obj;
    
    // 2. 우선적으로 매개변수로 들어온타입과 비교할타입이 같은객체인지 확인
    //    만약 같은객체가아니면 return false;
    if(!(p instanceof Product)){
    	return false;
    }
    
    // 3. 같은객체면 자신객체와 매개변수로들어온 객체의 필드값 확인
    //    모든필드의 값이 일치하면 return true 반환
    return this.name.equals(p.getName()) && this.id.equals(p.getName()) && this.price == p.getPrice();
  }


}

Run.class

public class Run {
	public static void main(String[] args) {
   		Product p1 = new Product("홍길동","hong",100);
        Product p2 = new Product("김길동","kim",100);
        Product p3 = new Product("홍길동","hong",100);
        
        System.out.println(p1.hashCode()); // 123123151456856
        System.out.println(p2.hashCode()); // 2311253151456856
        System.out.println(p3.hashCode()); // 123123151456856
    }
}

 

 

그럼 p1과 p3의 해쉬코드는 같아질것이다.

equals() 랑 hashCode()는 그냥 항상 같이 오버라이딩 해주면될것같다 ..

 

'프로그래밍 > JAVA' 카테고리의 다른 글

JAVA - DATE, Calendar,  (0) 2021.06.02
JAVA - String 클래스  (0) 2021.05.31
JAVA - 상속  (0) 2021.05.26
JAVA - 객체 배열  (0) 2021.05.25
JAVA - 객체(4편)  (0) 2021.05.25
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유