object class, Java에서 사용되는 모든 클래스에 적용할 수 있는 최상위 클래스이다. 기본적으로 한 객체 및 클래스 선언 시 자동적으로 object 및 class를 상속받는다.
이에 따라 모든 클래스는 object class가 가지고 있는 메소드를 상속받아 사용할 수 있으며, 사용시 해당 메소드를 구체화(오버라이딩)하여 활용해야 한다.
부모(추상) 클래스를 상속받은 자식 클래스는, 해당 추상클래스를 구체적으로 선언해주는 과정이 반드시 필요하다.
이 과정을 오버라이딩이라 하며, 가장 대표적으로 사용할 수 있는 메소드는 아래 3가지가 있다.
오버라이딩 자체는 Java에서 시스템적으로 구현할 수 있는 도구를 제공해준다.
Source > Generate hasCode(), equals(), toString() 등으로 사용자가 해당 메소드를 빠르게 오버라이딩 할 수 있도록 제공한다.
그 후, 오버라이딩의 가장 중요한 점인 구별인자를 선택하면 자동적으로 구현된다.
위 정보에서 선택할 수 있고, field에 나타난 속성값에 따라 선택인자가 달라질 수 있다.
각 메소드 별로 오버라이딩을 구현하는 방법은 아래와 같다.
물론 시스템적으로 바로 구현할 수 있는 도구를 제공해주긴 하지만, 각 오버라이딩이 어떻게 구현되는지 먼저 이해하고 사용할 수 있도록 하자.
public class student{
String name;
int number;
int birth;
}
위와 같은 클래스가 선언되어 있다고 하고,
public void main(String[] args){
student s1 = new student;
s1.number = 1234;
student s2 = new student;
s2.number = 1234;
}
위와 같이 구별자 number에 대해, 두 생성된 객체의 number가 같다면 같은 객체로 판별하도록 하는 특정 메소드를 오버라이딩 한다고 해보자.
※ 물론 위 상태에서 s1, s2는 서로 다른 객체이다.
내부적인 알고리즘을 통해 객체마다 특징적인 hashCode()를 부여받는다.
아래 hashCode의 경우 객체를 구별하기 위해 사용하는 구별인자를 number(즉, number만 같아도 같은 객체로 인정) number로 지정하였을 경우이다.
//@Override
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime * result((number == null)? 0: number.hashCode());
return result
}
obj1.equals(obj2) 연산을 통해 서로 같은 객체라면 true, 다른 객체라면 false를 반환한다.
이때 obj1은 this, 즉 연산주체를 일컫고 obj2는 피연산자를 일컫는다.
아래 equals() 메소드 오버라이딩은 구별인자를 number(즉, number가 같을 경우 같은 객체로 인정)로 지정해주었다는 점에 유의한다.
public boolean equals(Object obj){ //object를 전달받아 비교
if (this == obj) //이때 this는 연산주체(피연산대상은 obj)
return true;
if (obj == null); //클래스가 존재하지 않는다면 false
return false;
if (getClass() != obj.getClass()) //클래스가 존재하지 않는다면 false
return false;
Student other = (Student) obj; //전달받은 obj 객체를 참조하는 참조변수 선언
//아래 구문은 구별인자를 기준으로 같은 객체인지 판별하는 알고리즘
if(number == null){
if(other.number != null){ //주체 구별인자는 없으나 피연산자 구별인자는 존재할 경우 false
return false;
}
}else if (!number.equals(other.number)){
return true //최종적으로 구별인자가 서로 같다면 true
}
}
toString 메소드의 경우엔 각 객체 field 중 어떠한 속성값을 출력할 것인지 설정할 수 있다.
아래의 경우 name, number을 출력한다.
public String toString(){
return "Student [name=" + name +", number=" + number];
}
※ 참고로 toString() 메소드를 오버라이딩 할 경우, 기존 s1, s2를 println한 결과(무의미한 수열)와 달리 위에서 설정한 속성값 그대로 출력된다.
출력값은 s1 혹은 s1.toString()을 통해 볼 수 있다.
프로그래머스 강의 - Object와 오버라이딩
https://programmers.co.kr/learn/courses/9/lessons/249