아무것도 상속받지 않으면 자동으로 Object를 상속받고, Object가 가지고 있는 메서드는 모든 클래스에서 사용할 수 있다는 것을 의미한다.
- equals - 객체가 가진 값을 비교할 때 사용
- hashCode - 객체의 해시코드 값을 반환
- toString - 객체가 가진 값을 문자열로 변환
Object 클래스에서 메서드는 제공해주지만, 이것들을 사용할때 반드시 개발자는 오버라이딩해서 사용 해야한다. 어떤 개념인지 정확히 알아보기 위해 예제를 만들며 이해해보자.
public class Student {
String name;
String number;
int birthYear;
public static void main(String[] args) {
Student s1 = new Student();
s1.name = "테스터";
s1.number = "010-7777-7777";
s1.birthYear = 1997;
Student s2 = new Student();
s2.name = "테스터";
s2.number = "010-7777-7777";
s2.birthYear = 1997;
if(s1.equals(s2))
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
}
}
Student라는 클래스를 생성하여 s1, s2라는 2개의 객체를 만든 후 서로 같은 값을 넣어보았다.
내가 만약 공부를 하지 않았더라면 출력값은 당연히 True?
라고 생각했었을 것이다.
😨 두 개의 객체는 분명 같은 값일 텐데,,,?
아니다. 당연히 아니다.
Object 클래스에서 제공해주는 메서드인 equals는 제공해주는 그대로 들고 오기 때문에 현재 두 개의 객체는 다른게 당연하다. 두 개의 객체를 같게 하려면 위에서 말했다시피 @Override
가 필요하다.
@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);
}
해시코드는 과연 어떻게 출력될까?
public class Student {
String name;
String number;
int birthYear;
public static void main(String[] args) {
Student s1 = new Student();
s1.name = "테스터";
s1.number = "010-7777-7777";
s1.birthYear = 1997;
Student s2 = new Student();
s2.name = "테스터";
s2.number = "010-7777-7777";
s2.birthYear = 1997;
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
}
해시코드 역시 다르게 출력되고, 해시코드 또한 @Override
가 필요하다.
@Override
public int hashCode() {
return Objects.hash(number);
}
만약 이전에 생성한 s1, s2 객체를 그냥 출력하면 어떤 값들이 출력될까?
public class Student {
String name;
String number;
int birthYear;
public static void main(String[] args) {
Student s1 = new Student();
s1.name = "테스터";
s1.number = "010-7777-7777";
s1.birthYear = 1997;
Student s2 = new Student();
s2.name = "테스터";
s2.number = "010-7777-7777";
s2.birthYear = 1997;
System.out.println(s1);
System.out.println(s2);
}
}
외계어,,,,? Student 객체를 출력하고 싶은데,,,,! 의미없는 값이 출력된다.
Student 객체가 가지고 있는 속성을 알고 싶을때도 toString을 @Override
해야한다.
@Override
public String toString() {
return "Student [name=" + name + ", number=" + number + ", birthYear=" + birthYear + "]";
}
내가 이해한 만큼 정리를 하고 싶은데,, 글을 쓰는것도, 말을 하는것도 역시 많이 해보고 노력해야 느는것 같다. 앞으로 꾸준히 글을 쓰며 공부한 내용을 정리해야겠다고 또 한번 느꼈다❕❗