본문 바로가기

JavaScript

[Java] 오버로딩(Overloading)과 오버라이딩(Overriding) 차이

결론부터 말하자면, 오버로딩과 오버라이딩은 명백히 다르다.

오버로딩(Overloading): 기존에 없는 새로운 메서드를 추가하는 것 (new)

오버라이딩(Overriding): 상속받은 메서드의 내용을 변경하는 것 (change, modify)

 

1. 오버로딩(Overloading)


멤버변수는 같은 클래스 내에서 동일한 이름으로 쓰일 수 없다. 클래스 내에서 구별이 가능해야 하기 때문이다. 그러나 메서드에 한해서는 다르다. 자바에서는 동일한 이름을 가진 메서드를 정의할 수 있다. 단, 클래스 내에서 구별이 가능해야 하기 때문에 매개변수의 개수 또는 타입이 달라야 한다. 

 

이처럼 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(mothod overloading)' 또는 '오버로딩(overloading)'이라 한다.

 

* overloading의 사전적 의미: 과적하다, 초과하여 싣다 => 클래스 내에 이름이 하나만 존재해야 하는데 초과해서 정의한다는 의미로 이해

 

오버로딩의 조건

  • 메서드 이름이 같아야 한다.
  • 매개변수의 개수 또는 타입이 달라야 한다.

* 주의! 반환 타입만 다른 것은 오버로딩이 아니다.

 

오버로딩의 사용

public class MyMath {
	int add(int a, int b) {return a+b;}
	long add(int a, long b) {return a+b;} // 오버로딩
	long add(long a, int b) {return a+b;} // 오버로딩
	long add(long a, long b) {return a+b;} // 오버로딩
}
public static void main(String[] args) {
	MyMath m = new MyMath();
	System.out.println(m.add(3, 3));
	System.out.println(m.add(3L, 3));
    System.out.println(m.add(3, 3L));
    System.out.println(m.add(3L, 3L));
}

 

2. 오버라이딩(Overriding)


조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 메서드를 그대로 사용하기도 하지만, 자신에 맞게 변경해야 하는 경우가 많다. 이럴 때 조상의 메서드를 자신에 맞게 변경하는 것오버라이딩(overriding)이라고 한다.

 

* overrid의 사전적 의미는 '~위에 덮어쓰다'이다.

 

오버라이딩의 사용

public class Point {
	int x;
	int y;
	
	String getLocation() {
		return "x: " + x + ", y: " + y;
	}
}
public class Point3D extends Point {
	int z;
	
	@Override
	String getLocation() {
		return "x: " + x + ", y: " + y + ", x: " + x;
	}
}

위 코드는 2차원 좌표계의 한 점을 표현하기 위한 Point 클래스와 3차원 좌표계의 한 점을 표현하기 위한 클래스를 작성한 코드이다. 

 

Point 클래스의 getLocation()은 x, y 좌표를 문자열로 반환하도록 되어있다. Point3D 클래스는 Point 클래스를 상속받았으므로 Point3D 인스턴스에 대해서 getLocation()을 호출하면 Point 클래스의 getLocation()이 그랬듯이 좌표를 문자열로 얻을 수 있을 것이라고 기대할 것이다. 그렇기 때문에 새로운 메서드를 제공하는 것보다 오버라이딩하는 것이 좋다.

 

오버라이딩의 조건

오버라이딩은 메서드의 내용만을 새로 작성하는 것이므로 선언부는 조상의 것과 완전히 일치해야 한다. 따라서 오버라이딩은 다음과 같은 조건을 만족해야 한다.

 

자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와

  • 이름이 같아야 한다.
  • 매개변수가 같아야 한다.
  • 반환타입이 같아야 한다. (JDK1.5부터 반환 타입 조건 완화)
더보기

다만 접근 제어자(access modifier)와 예외(exception)는 제한된 조건 하에서만 다르게 변경할 수 있다.

  • 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.
  • 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다. 
  • 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.