[Assignment] Object 클래스의 method(toString, equals, hashcode 등)

열심히 사는 루피 🥰·2021년 8월 4일
0

과제 해결

목록 보기
2/2

Object 클래스

Java에서 모든 클래스들은 Object 클래스를 상속받는다.
따라서 제작하는 클래스들은 Object 클래스가 가진 메소드를 override하여 사용할 수 있다.

대표적인 Object클래스의 메소드인 toString, equals, hashcode, clone 을 언제 어떻게 사용해야 할까?

toString

  • 어떤 객체를 문자열로 표현해야 할 때 사용한다.

  • String 클래스는 이미 toString을 Override하고 있어 String을 print 할때 toString 결과가 알아서 적용된다~

  • 📜 코드

public class ObjectMethods {
    private String methodName;

    public ObjectMethods(String methodName) {
        this.methodName = methodName;
    }

    @Override
    public String toString() {
        return "I love programmers " + methodName;
    }

    
    public static void main(String[] args) {

        /***
         * toString : 어떤 객체를 문자열로 표현해야할때.
         */
         
         
        System.out.println("=======================");
        System.out.println("[toString test]");
        ObjectMethods method1 = new ObjectMethods("toString");
        

        //오버라이드한 toString 의 결과 나타남
        //만약 오버라이드 하지 않으면 -> 클래스 풀네임@해시코드로 출력됨.
        System.out.println("METHOD IS : " + method1);


        //String 클래스가 toString을 override 하고 있음
        String justString = "toString";
        System.out.println(justString);

    }
}
  • 💻 결과
=======================
[toString test]
METHOD IS : I love programmers toString
toString

eqauls

  • 객체들의 메모리 주소는 다르지만 논리적으로 둘이 같음을 표현해야 할 때

  • 📜 코드

public class ObjectMethods {
    private String methodName;

    public ObjectMethods(String methodName) {
        this.methodName = methodName;
    }

     @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        ObjectMethods methods = (ObjectMethods) o;

        return methodName != null ? methodName.equals(methods.methodName) : methods.methodName == null;
    }

    
    public static void main(String[] args) {
    	ObjectMethods method1 = new ObjectMethods("toString");
        
 	/***
         * equals : 메모리 주소는 다르지만 논리적으로 같은것을 표현해야 할 때.
         */

        System.out.println("=======================");
        System.out.println("[equal test]");

        //만약 오버라이드 하지 않으면 둘은 false
        ObjectMethods method2 = new ObjectMethods("toString");
        System.out.println("IS EQAUL? : " + method2.equals(method1));

    }
}
  • 💻 결과
=======================
[equal test]
IS EQAUL? : true

hashcode

  • hashCode는 jvm이 각 메모리 주소에 부여한 코드이다.
  • 자바에서 두 객체의 동일함을 보일때 equals와 함께 사용한다.
  • Integer 클래스는 hashcode를 override 하고있어 같은 숫자엔 같은 hashcode로 나타난다.
  • 📜 코드
public class ObjectMethods {
    private String methodName;

    public ObjectMethods(String methodName) {
        this.methodName = methodName;
    }

     @Override
    public int hashCode() {
        return methodName != null ? methodName.hashCode() : 0;
    }

    
    public static void main(String[] args) {
    	ObjectMethods method1 = new ObjectMethods("toString");
        ObjectMethods method2 = new ObjectMethods("toString");
        
 	/***
         * hashcode : 메모리 주소는 다르지만 객체가 같은 것을 표현해야 할 때.
         *
         * hashcode = jvm이 각 메모리 주소에 부여하는 코드(실제 메모리 주소와는 별개)
         *
         * 자바에서 두 객체의 동일성 : equals() == true 이고 hashcode 반환값이 동일해야함. (왜일까요?)
         * equals와 hashcode는 함께 오버라이드
         */

        System.out.println("=======================");
        System.out.println("[hashcode test]");

        //만약 오버라이드 하지 않으면 eqauls는 true 인데 해시코드는 다르다.
        System.out.println("IS EQAUL? : " + method2.equals(method1));
        System.out.println("method 1 hashcode : " + method1.hashCode());
        System.out.println("method 2 hashcode : " + method2.hashCode());


        //Integer 클래스가 hashCode를 override 하고 있음.
        Integer int1 = 1200;
        Integer int2 = 1200;
        System.out.println("IS EQAUL? : " + int1.equals(int2));
        System.out.println("method 1 hashcode : " + int1.hashCode());
        System.out.println("method 2 hashcode : " + int2.hashCode());
    }
}
  • 💻 결과
=======================
[hashcode test]
IS EQAUL? : true
method 1 hashcode : -1776922004
method 2 hashcode : -1776922004
IS EQAUL? : true
method 1 hashcode : 1200
method 2 hashcode : 1200

clone

  • 개체의 복사본을 제작할 때 사용

  • 개체의 private 정보가 공개되어 캡슐화가 깨질 수 있어서 Cloneable 인터페이스를 implements 해야한다.

  • 📜 코드

public class ObjectMethods implements Cloneable {
    private String methodName;

    public ObjectMethods(String methodName) {
        this.methodName = methodName;
    }

     @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    
    public static void main(String[] args) {
    	ObjectMethods method1 = new ObjectMethods("toString");
        
 	/***
         * clone : 객체의 복사본을 제작
         *
         * private이 공개될 수 있어서 Cloneable 인터페이스를 적어 확장해줘야한다.
         * 아니면 Execption이 발생한다.
         */

        System.out.println("=======================");
        System.out.println("[clone test]");

        try {
            ObjectMethods methodClone = (ObjectMethods) method1.clone();
            System.out.println("CLONE : " + methodClone);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
}
  • 💻 결과
=======================
[clone test]
CLONE : I love programmers toString

정리하며..

toString이 String클래스의 메소드인 줄 알았던 바보는 안녕!

  • toString : 어떤 객체를 문자열로 표현해야 할 때
  • equals : 객체들의 메모리 주소는 다르지만 논리적으로 둘이 같음을 표현해야 할 때
  • hashCode : 객체의 동일성을 나타내기 위해 equals와 함께 오버라이드해 사용
  • clone : 객체의 복사본을 제작해야 할 때

😃 각 메소드를 적재적소에 오버라이드해서 사용하기!

profile
반가워_! 세상아!

0개의 댓글