Object 클래스의 equals(), toString(), hashCode()

Jaeuk Oh·2021년 8월 4일
1

Java

목록 보기
3/6
post-thumbnail
  1. Object
  • Object는 모든 클래스의 최상위 클래스

  • 모든 클래스는 Object를 상속받음

  • 모든 클래스는 Object의 메소드를 호출할 수 있음

  • Object에 어떤 메소드가 있는지, 어떤 기능을 수행하는지 알아보자




  1. boolean equals(Object obj)
  • 기본 동작

    • 오버라이드 이전(동일성): boolean을 반환, 두 객체의 참조 변수의 주소가 같으면 true, 아니면 falase

    • 오버라이드 이후(동등성): boolean을 반환, 두 객체가 다른 객체여도 동등한 내용(값)을 갖고있다면 true를 반환하고 다르다면 false를 반환한다.

  • 목적

    • 물리적으로 다른 메모리에 위치하는 객체여도 논리적으로 동등함을 구현하기 위함이다.
  • TMI

    • 동일성과 동등성은 다르다.
    • 동일성은 참조 변수의 주소를 비교할 때 쓰는 개념이라서 두 객체가 같은 객체인지 물어보는 연산입니다. 예시로는 '=='연산자가 있다.
    • 동등성은 동등성은 서로 다른 객체지만 가지고 있는 내용(값)을 비교할 때 쓰는 개념입니다.
  • 코드

    • package com.programmers.java.test;
      
      import java.util.Objects;
      
      public class Arsenal {
          private String name;
      
          public Arsenal(String str){
              this.name = str;
          }
      
          @Override
          public boolean equals(Object obj) {
              return this.name == ((Arsenal)obj).name;
          }
      
          public static void main(String[] args) {
      
              Arsenal a = new Arsenal("아스날");
              Arsenal b = new Arsenal("아스날");
              if(a.equals(b)) {
                  System.out.println("True");
              }
              else {
                  System.out.println("False");
              }
      
              String str1 = "Arsenal";
              String str2 = "Arsenal";
              if(str1.equals(str2)) {
                  System.out.println("True");
              }
              else {
                  System.out.println("False");
              }
          }
      }
    • /*오버라이드 이전: equals()가 동일성을 보기 때문에 두 객체의 내용(값)이 같아도 주소가 다르면 False 반환*/
      > Task :Arsenal.main()
      False
      True
          
      /*오버라이드 이후: equals()가 동등성을 보기 때문에 두 객체의 내용(값)이 같아서 모두 True 반환*/
      > Task :Arsenal.main()
      True
      True



  1. String toString()
  • 기본 동작

    • Object클래스의 toString() 메소드는 클래스명@16진수 해시코드로 구성된 문자열 정보를 반환한다
    • 객체의 문자 정보를 리턴한다. 즉, 객체를 문자열로 표현한다
  • 목적

    • 객체의 정보를 문자열 형태로 표현하고자 할 때
  • 코드

    • public class Arsenal {
          private String name;
      
          public Arsenal(String str){
              this.name = str;
          }
      
          @Override
          public String toString(){
              return "이 객체의 이름은 " + this.name;
          }
      
          public static void main(String[] args) {
              Arsenal a = new Arsenal("아스날");
              System.out.println(a.toString());
          }
      }
    • /*결과*/
      > Task :Arsenal.main()
      이 객체의 이름은 아스날



  1. int hashCode()
  • 기본 동작

    • JVM이 객체에게 부여한 코드값. 인스턴스가 저장된 가상머신의 주소를 10진수로 반환(레퍼런스 주소)
  • 목적

    • 오버라이드 이전(동일성): 객체의 동일성을 확인하기 위한 목표

      • Object클래스에 정의된 hashCode 메소드는 객체의 주소값을 이용해서 해시코드를 만들어 반환하기 때문에 서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없다.
    • 오버라이드 이후(동등성): 두 개의 서로 다른 메모리에 위치한 객체가 동등성을 갖기 위해 구현한다.

      • 일반적으로 해시코드가 같은 두 객체가 존재하는 것이 가능하다
    • 즉 객체를 구별하기 위해 고유한 정수값으로 출력시켜주는 메소드

  • 코드

    • package com.programmers.java.test;
      
      import java.util.Objects;
      
      public class Arsenal {
          private String name;
      
          public Arsenal(String str){
              this.name = str;
          }
      
          @Override
          public int hashCode() {
              return Objects.hash(name);
          }
      
          public static void main(String[] args) {
              Arsenal a = new Arsenal("아스날");
              Arsenal b = new Arsenal("아스날");
      
              System.out.println(a.hashCode());
              System.out.println(b.hashCode());
          }
      }
      
    • /*오버라이드 이전: a.hashCode()와 b.hashCode()의 결과값 */
      > Task :Arsenal.main()
      681842940
      1392838282
          
      /*오버라이드 이후: a.hashCode()와 b.hashCode()의 결과값 */
      > Task :Arsenal.main()
      50120415
      50120415

    image

0개의 댓글

관련 채용 정보