오버로딩과 오버라이딩

1. 오버로딩

오버로딩(Overloading)이란 이름은 같고 매개변수가 다른 메서드를 정의하는 것이다. 다시 말해 기존의 메서드를 확장한다. 오버로딩을 할 때 리턴 타입은 중요하지 않다. 실제 오버로딩의 예시에는 무엇이 있을까? 첫 번째 예제는 java.lang.PrintStream 클래스의 println() 메서드이다.

public void println()
public void println(boolean x)
public void println(char x)
public void println(char[] x)
public void println(double x)
public void println(float x)
public void println(int x)
public void println(long x)
public void println(Object x)
public void println(String x)

자바 공식 문서에서 Class PrintStream 항목을 보면 println()이 위와 같이 정의되어 있다. println() 메서드는 다양한 매개변수로 오버로딩 되어 있다. 덕분에 우리가 어떤 매개변수를 넣고 출력해도 컴파일과 실행 단계에서 에러가 발생하지 않았던 것이다. 두 번째 예제는 java.io.OutputStream 클래스의 write() 메서드이다.

public void write(byte[] b) throws IOException
public void write(byte[] b, int off, int len) throws IOException
public abstract void write(int b) throws IOException

역시 자바 공식 문서에서 Class OutputStream 항목을 보면 write() 메서드가 위와 같이 정의되어 있다.

2. 오버라이딩

오버라이딩(Overriding)이란 상속받은 메서드의 구현만 새로 정의하는 것이다. 다시 말해 기존의 메서드 내용을 새롭게 덮어 씌운다. 오버라이딩을 할 때는 몇 가지 주의 사항이 있다. 먼저 접근 제어자를 상위 클래스의 메서드보다 좁은 범위로 변경할 수 없다는 것이다. 또한 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다. 실제 오버라이딩의 예시에는 무엇이 있을까? 첫 번째 예제는 java.lang.String 클래스의 equals() 메서드이다.

// java.lang.Object
public boolean equals(Object obj) {
    return (this == obj);
}

// java.lang.String
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    return (anObject instanceof String aString)
            && (!COMPACT_STRINGS || this.coder == aString.coder)
            && StringLatin1.equals(value, aString.value);
}

모든 클래스의 최상위 클래스는 Object이다. 자연스럽게 java.lang.String도 Object와 상속 관계를 맺고 있다. Object 클래스의 equals() 메서드는 두 객체의 주소값을 비교해서 true를 리턴한다. 그런데 String 클래스의 equals() 메서드는 두 객체의 실제 값을 비교해서 boolean 값을 리턴한다. 두 번째 예제는 java.lang.Object 클래스의 toString() 메서드이다.

// java.lang.Object
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

// user custom overriding
public String toString() {
    return "Hello World!";
}

Object 클래스의 toString() 메서드는 "객체의 이름@객체의 해시코드"를 반환한다. 이 메서드를 오버라이딩해서 구현하면 각 클래스에 맞는 문자열 표현을 제공할 수 있다.

Last updated