public class OverrideClass {
public static void main(String[] args) {
var sampleClass = new OverrideClass();
System.out.println(sampleClass);
}
}
/* 출력결과
org.example.OverrideClass@7ad041f3
*/
모든 클래스는 Object를 상속 받습니다. 따라서, 모든 클래스는 Object클래스의 메소드를 오버라이딩하여, 객체 고유의 기능을 제공할 수 있다. (*final 키워드 메소드 제외)
위와 같이 Object의 기본 toString() 메서드는 클래스 이름을 출력하여, 위와 같은 결과가 나옵니다. 하지만 아래와 같이 toString() 메서드를 오버라이딩하면, 결과는 다음과 같다.public class OverrideClass {
public static void main(String[] args) {
var sampleClass = new OverrideClass();
System.out.println(sampleClass);
}
@Override
public String toString() {
return "I am overrideclass! hash : 0x" + Integer.toHexString(this.hashCode());
}
}
/* 출력결과
I am overrideclass! hash : 0x7ad041f3
*/
toString()을 오버라이딩하면, 위와 같이 객체 고유의 기능을 구현할 수 있습니다.
이는, 객체지향언의 특징인 다형성에 해당하며, SOLID 원칙의 리스코프 치환 원칙을 통해, 부모 타입의 클래스로 자식 타입의 객체를 핸들링할 수 있게되는 기초가 됩니다.
public class OverrideClass {
public static void main(String[] args) {
var sampleClass = new OverrideClass();
int intValue = Integer.MAX_VALUE;
long longValue = Long.MAX_VALUE;
sampleClass.print(intValue);
sampleClass.print(longValue);
}
public void print(int value) {
System.out.println("print int : " + value);
}
public void print(long value) {
System.out.println("print long : " + value);
}
}
/* 출력결과
print int : 2147483647
print long : 9223372036854775807
*/
위 결과를 보면, 동일한 메소드의 이름을 갖고, 서로 다른 매개 변수를 받아서 출력하는 예제를 볼 수 있다.
위와 같이, 실제 클래스에서 다른 매개 변수로 동일한 기능을 제공하고 싶다면 오버로딩을 활용해 보는 것이 좋을 것이다.