[Java] 오버라이딩과 오버로딩

Carrot.___.·2024년 3월 4일
0

오버라이딩 (Overriding)

  • 부모 클래스로부터 상속받아 재정의하거나, 인터페이스를 구현하는 것을 말한다.
  • 부모 클래스나 인터페이스를 통한 재정의로 자신의 클래스의 고유한 기능을 제공할 수 있다.
public class OverrideClass {
	public static void main(String[] args) {
    	var sampleClass = new OverrideClass();
        System.out.println(sampleClass);        
    }    
}
/* 출력결과
    org.example.OverrideClass@7ad041f3
*/

모든 클래스는 Object를 상속 받습니다. 따라서, 모든 클래스는 Object클래스의 메소드를 오버라이딩하여, 객체 고유의 기능을 제공할 수 있다. (*final 키워드 메소드 제외)

  • toString() 메서드
    위와 같이 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 원칙의 리스코프 치환 원칙을 통해, 부모 타입의 클래스로 자식 타입의 객체를 핸들링할 수 있게되는 기초가 됩니다.

오버로딩 (Overloading)

  • 같은 메서드 이름과 반환값을 같고, 파라미터의 개수 혹은 타입 다른 메서드를 여러개 정의하는 것을 말한다.
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
*/

위 결과를 보면, 동일한 메소드의 이름을 갖고, 서로 다른 매개 변수를 받아서 출력하는 예제를 볼 수 있다.
위와 같이, 실제 클래스에서 다른 매개 변수로 동일한 기능을 제공하고 싶다면 오버로딩을 활용해 보는 것이 좋을 것이다.

0개의 댓글