본문 바로가기

Backend/Java

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

오버라이딩과 오버로딩은 자바에서 다형성을 이루는 방법들이다.

다형성이란 같은 이름의 메서드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현되는 것을 말한다.

필드 오버라이딩이라는 용어는 없다. 메서드 오버라이딩을 간단히 오버라이딩이라고 부른다.

 

오버라이딩

- 슈퍼 클래스에 구현된 메서드를 서브 클래스에서 동일한 이름으로 자신의 특성에 맞게 다시 구현하는 것이다.

- 슈퍼 클래스의 메서드를 이름, 매개변수 타입과 개수, 리턴 타입을 모두 동일하게 서브 클래스에 재작성하는 것이다.

- 슈퍼 클래스와 서브 클래스의 메서드 사이에 발생하는 관계이다.

- 메서드 오버라이딩이 일어나면 서브 클래스에서 슈퍼 클래스의 메서드를 무시하며 이런 처리를 동적 바인딩이라고 한다.

- 동적 바인딩은 실행할 메서드를 컴파일 시에 결정하지 않고 실행 시에 결정하는 것을 말한다. 자바에서는 동적 바인딩을 통해 오버라이딩된 메서드가 항상 실행되도록 보장한다.

- 슈퍼 클래스의 메서드와 동일한 원형으로 작성한다.

- 슈퍼 클래스 메서드의 접근 지정자보다 접근의 범위를 좁혀 오버라이딩 할 수 없다. 접근 지정자는 public, protected, 디폴트, private 순으로 접근의 범위가 좁아진다. 슈퍼 클래스에 protected로 선언된 메서드는 서브 클래스에서 protected나 public으로만 오버라이딩할 수 있고, public으로 선언된 메서드는 서브 클래스에서 public으로만 오버라이딩할 수 있다.

- static이나 private 또는 final로 선언된 메서드는 서브 클래스에서 오버라이딩할 수 없다.

- 상속 관계에서만 성립된다.

 

 

오버로딩

- 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메서드를 여러 개 만드는 메서드이다.

- 한 클래스나 상속 관계에 있는 클래스들 사이에 메서드의 이름은 같지만, 매개변수 타입이나 개수가 다르게 메서드를 작성해야 한다. 매개변수의 개수와 타입은 같고 리턴 타입이 다른 경우에는 오버로딩이 성립되지 않는다. 메서드를 호출하는 부분에서는 호출할 메서드의 이름과 매개변수 개수, 타입으로 구분짓기 때문이다.

- 동일한 클래스 내 혹은 상속 관계 둘다 가능하다.

 

비교 요소 메소드 오버로딩 메소드 오버라이딩
선언 같은 클래스나 상속 관계에서 동일한 이름의 메서드 중복 작성 서브 클래스에서 슈퍼 클래스에 맞는 메서드와 동일한 이름의 메서드 재작성
관계 동일한 클래스 내 혹은 상속 관계 상속 관계
목적 이름이 같은 여러 개의 메서드를 중복 작성하여 사용의 편리성 향상, 다형성 실현 슈퍼 클래스에 구현된 메서드를 무시하고 서브 클래스에서 새로운 기능의 메서드를 재정의하고자 함. 다형성 실현
조건 메서드 이름은 반드시 동일하고, 매개변수 타입이나 개수가 달라야 성립 메서드의 이름, 매개변수 타입과 개수, 리턴 타입이 모두 동일해야 성립
바인딩 정적 바인딩. 호출될 메서드는 컴파일 시에 결정 동적 바인딩. 실행 시간에 오버라이딩된 메서드 찾아 호출