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 |