(Java) java.lang (equals, hashCode, toString

이정민·2021년 10월 30일
0

java.lang 패키지



1. equals(Object obj)


public boolean equals(Object obj) {
   return (this==obj);
}

this는 자기자신의 주소, obj는 매개변수로 주어진 객체의 주소를 말한다.
두 객체의 주소값을 비교해서 그 결과를 반환한다.
현재의 코드라면 서로 다른것을 비교해서 false만 나온다.(모든 객체의 주소는 다르기 때문에)


그래서 오버라이딩을 통해 인스턴스 변수의 값을 비교하도록 바꾼다.

class Person {
   long id;		// 인스턴스 변수
   
   public boolean equals(Object obj) {
      if(obj != null && obj instanceof Person) {	-- (1)
         return id == ((Person)obj).id;			-- (2)
      } else {
         return false;
      }
   }
   
   Person(long id) {
      this.id = id;
   }
}

( 1 ) 객체가 null이 아니고 Person으로 형변환이 가능할 때만 비교한다.
( 2 ) object클래스에는 id가 선언되어 있지 않기 때문에 Person타입으로 형변환한다음 비교한다.


Person p1 = new Person(8011081111222L);
Person p2 = new Person(8011081111222L);

System.out.pritln(p1==p2);		-- (3)
System.out.pritln(p1.equals(p2));	-- (4)

( 3 ) 등가비교 연산자는 변수에 저장된 값을 비교하기 때문에 주소같이 다른 두 객체는 false가 나온다.
( 4 ) 두 객체의 id값이 같기 때문에 true가 나온다.



2. hashCode()

객체의 해시코드(int타입의 정수)를 반환하는 메서드(해시함수)
다량의 데이터를 저장&검색하는 해싱기법에 사용된다.


Object클래스의 hashCode()는 객체의 내부주소를 반환한다.

public class object {
   ...
   public native int hashCode();

equals()를 오버라이딩하면, hashCode()도 같이 오버라이딩 해야한다.(필수 X)
equals()의 결과가 true인 두 객체의 hash code는 같아야하기 때문


String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2));	// true
System.out.println(str1.hashCode());	// 96354
System.out.println(str2.hashCode());	// 96354


3.toString()

객체를 문자열로 표현해서 반환하는 하는 메서드
객체가 가지고 있는 인스턴스 변수들의 값을 문자열로 변환해서 반환하는 것이 보통


class Card {
   String kind;
   int number;
   
   Card() {
      this("SPADE", 1);
   }
   Card(String kind, int number) {
      this.kind = kind;
      this.number = number;
   }
}

class CardToString
{
   public static void main(String[] args)
   {
      Card c1 = new Card();
      Card c2 = new Card();
      
      System.out.println(c1.toString());
      System.out.println(c2.toString());
   }
}

오버라이딩 전

public String toString() {
   return getClass().getName() + "@"
      + Integer.toHexString(hashCode());
}

실행결과
Card@47e553
Card@20c10f



오버라이딩 후

public String toString() {
   return "kind : " + kind + ", number : " + number;
}

실행결과
kind : SPADE, number : 1
kind : SPADE, number : 1

profile
안녕하세요.

0개의 댓글