티스토리 뷰

Tip and Error/JAVA

toString() & equals() & hashCode() & clone()

geonwoopaeng@gmail.com 2021. 4. 16. 17:21

Object class - 모든 class의 최상위 class

https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html

  • import java.lang (자동적으로 import 된다.)
  • String, int, System...
  • 모든 class는 object 클래스를 상속 받는다.

+추가 (toString() 관련)

toString()

  • 객체가 가지고 있는 정보나 값들ㅇ르 문자열로 만들어 return 하는 메서드
Book book = new Book();
System.out.println(book.toString()); // System.out.println(book); 
//인스턴스 출력 ch4_1.Book@3830f1c0
//ch4_1.Book : class의 full name (package 이름까지 나옵니다.)
//3830f1c0 : instance 메모리의 위치에 대한 가상 메모리 값(jvm이 준 값으로 실제 메모리 값은 아닙니다.)

String str = new String("test");
System.out.println(str.toString()); //System.out.println(str); 
//test가 출력 됩니다. -> str.toString()이 Overriding 되었기 때문

Object Method

https://jeong-pro.tistory.com/172

equals()

  • 두 객체의 메모리 위치(주소 값)을 비교 + (Override)재정의 가능
    • heap 메모리 위치 = 메모리 위치 = 주소 값 = 같은 hashCode() 값

==

  • 두 객체의 메모리 위치(주소 값)을 비교
    • heap 메모리 위치 = 메모리 위치 = 주소 값 = 같은 hashCode() 값

hashCode()

  • hash: 정보를 저장, 검색하는 자료구조

  • equals()가 재정의 되면 hashcode도 재정의 되어야 한다.

    => eqauls()로 같은 객체인 경우 hashCode()도 반드시 같은 값

    => 같은 parameter 이동

  • instance의 저장 주소를 반환

  • heap 메모리에 instance가 저장되는 방식

  • //overriding 전의 hashCode() 값 얻기
    System.identityHashCode(객체(instance)); 

clone()

  • 객체의 원본을 복제하는데 사용

    (instance의 상태 그대로 복제, 변화되면 변화된 것을 복제)

  • clone()을 사용할 경우 해당 클래스에 implements Cloneable 선언해줘야 한다.

  • Override 가능

ex)

//Student.java
public class Student {
    private int id;
    private String name;

    //... 생성자

    //equals override
    @Override
    public boolean equals(Objecct obj) {
        if (obj instanceof Student) {
            Student std = (Student)obj;
            if (this.id == std.id)
                return true;
            else return false;
        }
        return false;
    }
    @Override
    public int hashCode() {
        //주소 값이 같아지도록 override 해주는 것입니다.
        return id;
    }

}

//Test.java
public class Test {
    public static void main(String[] args) {
        Student std1 = new Student(100, "paeng");
        Student std2 = new Student(100, "paeng");

        System.out.println(std1 == std2); //false

        //false -> override 시 true
        System.out.println(std1.equals(std2)); 

        String str1 = new String("ab");
        String str1 = new String("ab");

        System.out.println(str1 == str2); //false
        System.out.println(str1.equals(str2)); //true

        //clone()
        Student clone_s = (Student)std1.clone();
        System.out.println(clone_s); // 100,paeng 
    }
}
반응형

'Tip and Error > JAVA' 카테고리의 다른 글

Class 클래스 <자료형을 모르는 Class 사용 할 때>  (0) 2021.04.17
JAVA 컴파일 과정  (0) 2021.04.17
default & static & private  (0) 2021.04.16
인터페이스 활용 (interface)  (0) 2021.04.14
인터페이스 (interface)  (0) 2021.04.14
공지사항
최근에 올라온 글