자바 공부/[자바] 기본 공부

[자바 공부 3일차] Object와 오버라이딩

햅2024 2024. 11. 8. 21:23

 

  • equals : 객체가 가진 있는 값을 비교할 때 사용
  • toString : 객체가 가진 값을 문자열로 리턴하는 메소드
  • hashCode : 객체의 해시코드 값 반환
public class Student {
	String name;
	String number;
	int birthYear;
}

 

학생이란 클래스를 생성시켜 값을 넣어준다. 

public static void main(String[] args) {
		Student s1 = new Student();
		s1.name = "홍길동";
		s1.number = "123";
		s1.birthYear = 2000;
		
		
		Student s2 = new Student();
		s2.name = "홍길동";
		s2.number = "123";
		s2.birthYear = 2000;
		
	}

 

현 상태에서 

if(s1.equals(s2))
{
    System.out.println("s1 = s2");
}
else {
    System.out.println("s1 != s2");
}

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

같은 값을 할당한 클래스여서 s1=s2 라고 생각할 것이다. 하지만 s1 != s2이다. 

왜일까?

아무것도 설정을 해놓지 않는다면 object 자체적으로 할당한 고유의 값이 들어가기 때문이다.

고유값이 아닌 값을 오버라이딩 하기 위해

 

Source 를 클릭하면

Generate hashCode() and equals()와

Generate toString()

이 보일 것이다.

 

이것을 통하여 hashCode, equals, toString 메소드를 사용자 정의 할 수 있다.

 

 

  • hashCode(), equals()

어떤 속성을 사용해서 해시코드 값을 구할 것인지 선택할 수 있게 한다.

위와 같이 세 멤버변수의 값이 전부 똑같을 경우, 같은 hashcode를 갖게 된다.

 

그러나, 같은 사람임에도 이름을 쓰는 방법은 여러가지 있을 수 있다.

"홍길동"과 "홍 길동" 이 그 예이다.

성을 붙여쓰든, 떼어쓰든 두 사람은 동일 인물일 것이다.

그러나 학번은 학생 한명만이 갖는 고유의 번호이다.

따라서 두 클래스의 number만을 비교하여 같은 hashcode를 부여해줄 수 있다.

 

Student s1 = new Student();
s1.name = "홍길동";
s1.number = "123";
s1.birthYear = 2000;


Student s2 = new Student();
s2.name = "홍 길동";
s2.number = "123";
s2.birthYear = 2000;

if(s1.equals(s2))
{
    System.out.println("s1 = s2");
}
else {
    System.out.println("s1 != s2");
}

System.out.println(s1.hashCode());
System.out.println(s2.hashCode());

 

 

다음과 같이 설정한다면, 이름이 띄어쓰기 때문에 문자열이 달라졌다 하더라도

똑같은 고유의 해시코드가 사용되며 두 클래스 같다고 나오게 된다.

 

 

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

 

아무런 override 없이 tostring을 사용할 경우 보통 "Study.Student@be51" < 와 같이 프로젝트명 + 클래스명+ 고유번호 가 출력이 된다.

 

이 또한 설정창에서 override 하여 클래스 멤버변수를 출력하게 만들어 줄 수 있다.

다음과 같이 표기하고 싶은 멤버 변수를 클릭하여 Generate 해보자.

 

Student [name=홍길동, number=123, birthYear=2000]

코드 실행 시 위의 값이 출력될 것이다.