Java

오버로딩과 오버라이딩에 대해

Tommy__Kim 2023. 5. 1. 23:01

본문에 들어가기 앞서 오버로딩과 오버라이딩을 한줄 요약한다면 다음과 같습니다. 

오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩 (overriding) : 상속받은 메서드의 내용을 변경하는 것

오버로딩 (overloading)

자바에서는 한 클래스 내에서 메서드 매개변수의 개수 혹은 타입이 다르다면 이미 존재하는 메서드명을 다시 사용할 수 있습니다. 

오버로딩이 성립하기 위해서는 다음의 조건을 만족해야 합니다. 

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 혹은 타입이 달라야 한다. 
  3. 메서드의 반환 타입은 영향을 미치지 않는다.

[출력 결과]

이름 : tommy
이름 : tommy, age : 2

예시로 Printer 이라는 클래스를 생성했습니다. 

print method가 존재하며 매개변수로 {이름} 혹은 {이름, 나이} 를 받아 정보를 출력하는 간단한 메서드를 생성하였습니다. 

해당 예제의 경우 메서드의 이름이 같으며, 매개변수의 개수가 다르므로 오버로딩의 조건을 만족합니다. 따라서 사용할 수 있습니다.

 

다음 예시에서는 새로운 method를 하나 더 추가하였습니다. 

해당 예시의 경우 메서드명 및 매개변수의 개수와 타입이 동일한 메서드가 존재합니다.

두 메서드의 차이점은 반환 타입이 다르다는 것입니다. 

오버로딩은 반환타입은 고려하지 않습니다. 따라서 두 메서드간의 충돌이 생기게 되어 오류가 발생합니다. 

 

프로그램을 설계하다보면 근본적으로 같은 기능을 하는 메서드임에도 불구하고 반환 타입이 다르다는 이유로 새로운 

메서드명을 계속 짓다보면 프로그래머로써 이름을 짓기도 어렵고, 메서드 이름을 일일히 기억해야한다는 단점이 존재합니다. 

이러한 단점을 오버로딩을 통해 극복할 수 있다는 장점을 지닙니다. 


오버라이딩 (overriding)

조상클래스로부터 상속받는 메서드의 세부 내용을 변경하는 것을 오버라이딩 이라고 합니다.

 

오버라이딩이 성립하기 위해선 다음 조건을 만족해야 합니다. 

  1. 메서드 이름이 같아야 한다.
  2. 매개변수가 같아야 한다.
  3. 반환 타입이 같아야 한다.
  4. 접근제어자는 조상 클래스의 메서드보다 좁은 범위로의 변경이 불가능 하다.
  5. 예외의 경우 조상 클래스의 메서드 보다 많은 수의 예외를 선언할 수 없다.

Pointer 실행 클래스

[출력 결과]

x : 3, y : 5
x : 3, y : 5, z : 7

2차원 Pointer
3차원 Pointer

 

해당 예제에서는 locate()라는 메서드를 오버라이딩 하는 예제를 구현해 보았습니다. 

Pointer 2D의 경우 2차원 점을 의미하며, Pointer3D의 경우 3차원 점을 의미합니다. 

앞서 말한 조건 5가지를 모두 잘 지키기 때문에 부모클래스의 메서드를 오버라이딩 할 수 있습니다. 

오버라이딩 잘못된 예시

위 예시는 부모클래스의 접근제어자보다 더 좁은 범위를 나타냅니다. 

따라서 오버라이딩이 불가능합니다.

오버라이딩 잘못된 예시2

위 예시는 부모클래스의 예시보다 더 많은 예외를 던지고 있습니다.

따라서 오버라이딩이 불가능합니다. 

 

 

해당 예제는 다음 링크에서 확인 해 보실 수 있습니다.

Github 바로가기

 

GitHub - BeomSeogKim/java-defrag: java 기능 관련 모음

java 기능 관련 모음. Contribute to BeomSeogKim/java-defrag development by creating an account on GitHub.

github.com

 

'Java' 카테고리의 다른 글

[Java] Object란 무엇인가요?  (0) 2023.06.02
[모던 자바 인 액션] 동작 파라미터화  (2) 2023.05.10
Java Parameter Passing Mechanism  (0) 2023.04.26
Java Collection Framework  (0) 2023.04.25
String, StringBuffer, StringBuilder  (0) 2023.04.24