Overriding / Overloading

HH_Nebula·2022년 8월 30일

오버라이딩과 오버로딩

Java 에서 다형성(polymorphism)을 지원하는 방법으로 OverridingOverloading 이 있다. 한글 발음으로는 두 가지가 비슷하여 헷갈릴 수 있으나 그 뜻을 비교하면 이해하기 쉽다.


오버라이딩 Overriding

Overriding 은 사전적 의미 그대로 조상클래스의 메서드를 자손 클래스에서 재정의하는 것을 말한다. 가장 대표적인 예시는 Object ClasstoString 메서드 이다.

Object Class toString() Method

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

모든 클래스의 최상위 조상인 Object 에서는 toString() 메서드가 객체의 클래스명 @ 16진수 해시코드 를 반환하는 메서드로 정의되어 있으나, 오버라이딩(재정의)를 통해 원하는 방식으로 변환할 수 있다.

public class Student {
	
	String name;
	int score;
	
	@Override
	public String toString() {
		return "Student [name=" + name + ", score=" + score + "]";
	}
	
}

toString() 메서드를 학생의 이름과 점수를 출력하는 메서드로 재정의하였다.
Overriding 의 뜻 그대로 재정의하여 사용한 것이다.

오버라이딩의 조건

오버라이딩에는 몇가지 조건이 있지만 생각해보면 당연한 것들이다.

  • 상속이 전제되어 조상 클래스의 메서드를 자손 클래스에서 재정의한다.
  • static 메서드는 오버라이딩이 불가하다.
    ( staric 메서드는 프로그램 실행 시 static 영역에 선언되므로 )
  • private 메서드는 상속자체가 되지 않아 오버라이딩이 성립되지 않음
  • final 메서드는 변경이 자체가 불가하여 오버라이딩이 성립되지 않음
  • 조상 메서드의 접근 제어자보다 작아질 수 없음
  • 리턴타입, 메서드명, 매개변수의 조건이 같아야 함
  • 조상 메서드보다 많은 예외를 던질 수 없음

오버로딩 Overloading

Overloading 은 메서드뿐만 아니라 생성자에도 적용할 수 있으며 같은 이름의 메서드를 여러개 정의하고, 매개변수의 유형과 개수를 다르게 하여 다양한 유형의 호출에 응답할 수 있게 한다. 즉 하나의 이름을 여러가지 경우의 수에 적용(Loading)하는 것이라고 생각하면 이해하기 쉽다.

	public int add(int a, int b) {
		return a + b;
	}

두 개의 int 타입 매개변수를 받아 더한 뒤 그 결과를 int 타입으로 반환하는 메서드이다. 그러나 사용자의 실수로 문자열로된 매개변수를 입력할 경우 오류가 발생될 수 있을 것이다. 이러한 경우를 막기 위한 오버로딩을 해보자.

	public int add(int a, int b) {
		return a + b;
	}

	public int add(String a, String b) {
		int aa = Integer.parseInt(a);
		int bb = Integer.parseInt(b);
		return aa + bb;
	}
	
	public int add(String a, int b) {
		int aa = Integer.parseInt(a);
		return aa + b;
	}
	
	public int add(int a, String b) {
		int bb = Integer.parseInt(b);
		return a + bb;
	}

두 개의 매개변수 중 어느 한쪽이 문자열이거나 모두 문자열일 경우 이를 int 타입으로 변환하여 연산을 수행하고 그 결과를 반환할 수 있도록 추가적인 메서드를 작성했다. 이렇게 이름이 같은 메서드를 여러개 정의하여 전달받는 매개변수에 따라 호출되는 메소드가 다르게 하여 원하는 결과를 얻을 수 있다.

오버로딩의 조건

  • 메소드의 이름이 같아야 한다.
  • 매개변수의 개수나 타입을 반드시 다르게 해야한다.
  • 반환타입은 관계 없다.
profile
공부하고 기록하고 복습하고

0개의 댓글