오버로딩과 오버라이딩

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 PrintStreamarrow-up-right 항목을 보면 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 OutputStreamarrow-up-right 항목을 보면 write() 메서드가 위와 같이 정의되어 있다.

2. 오버라이딩

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

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

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

Last updated