본문 바로가기
자바(Java)

자바 중급1 - Object클래스, equals, toString, hashcode

by codeyaki 2022. 1. 13.
반응형

해당 강의를 듣고 정리한 것입니다

https://programmers.co.kr/learn/courses/9

 

자바 중급

평가 5.0 17개의 평가 ★★★★★17 ★★★★0 ★★★0 ★★0 ★0 ds02168 2021.08.20 15:37 Yeonggwang 2021.06.28 01:48 강신우 2021.04.23 10:20 HyeonWoo Jeong 2021.04.08 17:12 이용준 2021.01.26 19:23 리뷰 더보기

programmers.co.kr


Object

: 모든 클래스의 최상위 클래스

아무것도 상속받지 않으면 자동으로 Obect를 상속받는다.

Object가 가지고 있는 메서드는 모든 클래스에서 다 사용 가능.

 

Object의 대표적 메서드

equals

: 객체가 가진 값을 비교. 기준을 정해주어야 하기 때문에 오버 라이딩해서 사용해야 함.

hashcod

: 객체의 해시 코드 값 반환.

public class Student {
	String name;
	String number;
	int birthYear;
	
	public static void main(String[] args) {
		Student s1 = new Student();
		s1.name = "홍길동";
		s1.number = "1234";
		s1.birthYear = 1995;
		
		Student s2 = new Student();
		s2.name = "홍길동";
		s2.number = "1234";
		s2.birthYear = 1995;
		
		if(s1.equals(s2)) 
			System.out.println("같음");
		else
			System.out.println("다름");
		
		System.out.println(s1.hashCode());
		System.out.println(s2.hashCode());
	}
}

>>

다름
617901222
1159190947

 

  • 두 객체의 동일함을 어떠한 기준으로 판단하지 정해주지 않았음. => 객체 자체를 기준으로 판단함.
  • 각각의 객체를 해시 코드로 변환해보면 각각의 결과가 다르다.
    즉, 두 객체는 다른 객체이므로 동일하지 않다는 결과가 나옴을 알 수 있다.
  • 오버 라이딩을 통해 어떠한 기준으로 두 객체를 비교할 건지 정해주어야 함.

이클립스에서는 해당 메서드를 간편하게 오버 라이딩할 수 있는 기능을 제공해주고 있다.

Source - Generate hashCode() and equals() 메뉴를 사용하면 됨.

누르면 해당 창이 나오는데

여기서 어떤 걸 기준으로 hashCode()와 equals()을 처리할지 결정해주고 

Insertion point(삽입 시점)을 선택해주면 된다!

import java.util.Objects;

public class Student {
	String name;
	String number;
	int birthYear;
	
	
	
	public static void main(String[] args) {
		Student s1 = new Student();
		s1.name = "홍길동";
		s1.number = "1234";
		s1.birthYear = 1995;
		
		Student s2 = new Student();
		s2.name = "홍길동";
		s2.number = "1234";
		s2.birthYear = 1995;
		
		if(s1.equals(s2)) 
			System.out.println("같음");
		else
			System.out.println("다름");
		
		System.out.println(s1.hashCode());
		System.out.println(s2.hashCode());
	}



	@Override
	public int hashCode() {
		return Objects.hash(number);
	}



	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		return Objects.equals(number, other.number);
	}
	
}

>>

같음
1509473
1509473

이처럼 자동으로 메서드를 오버 라이딩해줄 수 있다!

  • 처음 메서드 진입 시 3가지 if문에 해당되면 바로 return 해줌
    1. 객체 자체가 같으면 당연히 같은 객체(s1과 s2로 다름)
    2. obj은 비어있지 않음(s1, s2는 비어있지 않은 객체)
    3. obj의 클래스와 비교하려는 클래스(혹은 상속받은 클래스)가 다르면 비교 불가능.(s1, s2는 같은 클래스)
  • obj을 형 변환해줌(Student형으로 변환해줌)
  • Objects 비교하려는 객체의 필드로 equals 호출
  • 해당 메서드를 위해서는 java.util.Objects를 import 해주어야 한다.

toString

: 객체가 가진 값을 문자열로 반환.

System.out.println(s1.toString());

>>Student@170861

해당 코드로 s1을 출력해보면 Student@170861와 같이 의미 없는 값이 출력이 된다.

toString을 오버 라이딩하여 알고 싶은 내용을 출력할 수 있도록 만들어보자

아까와 동일한 방법으로 

Source - Generate toString()으로 들어가 보면

해당 화면과 같이 나오는데 출력을 원하는 필드 선택 후 생성해주면

@Override
public String toString() {
	return "Student [name=" + name + ", number=" + number + ", birthYear=" + birthYear + "]";
}

해당 코드가 추가된다. 

다시 s1을 출력해보면

Student [name=홍길동, number=1234, birthYear=1995]

으로 우리가 원하는 값을 얻을 수 있게 된다.

반응형