Java - 오버로딩과 오버라이딩

상속을 배우면서 빠질 수 없는 개념들, 오버로딩(overloading)과 오버라이딩(overriding)에 대한 부분이다.

간단히 정의하면 아래와 같다.

개념 설명
Overloading
오버로딩
오버로딩은 수퍼 클래스와 같은 이름의 메서드를 서브 클래스에서 여러개 만들어서 사용할 때 쓰는 개념
Overriding
오버라이딩
오버라이딩은 상속받은 서브 클래스가 수퍼 클래스의 기능(메서드)을 재정의해서 사용할때 쓰는 개념

둘의 차이는 오버로딩은 새로운 기능을 생성하는 것이라면, 오버라이딩은 기존의 기능을 변경하는 것이라 할 수 있다.


오버로딩

조건

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

예제코드

Car.java

1
2
3
4
5
6
7
package devandy.java.inheritance;

public class Car {
public void run() {
System.out.println("차가 달립니다.");
}
}

Bus.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package devandy.java.inheritance;

public class Bus extends Car {
public void run(int speed) {
System.out.println("버스가 시속 "+speed+"km/h로 달립니다.");
}

public void run(String name) {
System.out.println(name.concat("가 달립니다."));
}

public void run(String name, int speed) {
System.out.println(name+"가 시속 "+speed+"km/h로 달립니다.");
}
}

CarExam.java

1
2
3
4
5
6
7
8
9
package devandy.java.inheritance;

public class CarExam {
public static void main(String[] args) {
Bus bus = new Bus();
bus.run();
bus.run(70);
}
}

CarExam 클래스의 main()을 실행하면 결과는 아래와 같다.

1
2
차가 달립니다.
버스가 시속 70km/h로 달립니다.

Bus 클래스에는 선언되지 않았지만, 수퍼 클래스에서 선언된 파라미터를 받지않는 run()Bus 클래스의 인스턴스를 통해 실행할 수 있었으며, 이것과 이름은 같지만 파라미터를 주입해서 생성한, 즉 오버로딩run(int speed) 도 실행할 수 있었다.

이처럼 메서드 이름이 같더라도 파라미터의 갯수가 반환 데이터 타입이 다르면 서로 다른 메서드처럼 사용할 수 있으며, 이를 오버로딩이라 한다.


오버라이딩

조건

  • 이름이 같아야 한다.
  • 파라미터까지 같아야 한다.
  • 반환 데이터 타입도 같아야 한다.

오버로딩과 달리 오버라이딩은 수퍼클래스의 메서드와 완전히 같은 형식으로 선언될때 오버라이딩을 할 수 있다.

예제코드

위의 예제코드에서 Car를 상속받는 Bus 클래스를 추가 생성했다.

Car.java

1
2
3
4
5
6
7
package devandy.java.inheritance;

public class Car {
public void run() {
System.out.println("차가 달립니다.");
}
}

Bus.java

1
2
3
4
5
6
7
8
9
10
11
package devandy.java.inheritance;

public class Bus extends Car {
public void run() {
System.out.println("버스가 달립니다.");
}

public void run(int speed) {
System.out.println("버스가 시속 "+speed+"km/h로 달립니다.");
}
}

CarExam.java

1
2
3
4
5
6
7
8
9
package devandy.java.inheritance;

public class CarExam {
public static void main(String[] args) {
Bus bus = new Bus();
bus.run();
bus.run(70);
}
}

Car 클래스의 main() 실행결과는 다음과 같다.

1
2
버스가 달립니다.
버스가 시속 70km/h로 달립니다.

수퍼 클래스인 Car 클래스의 run()에 선언된 print문에는 "차가 달립니다."라고 작성되있었지만, 서브클래스에서 선언한 run()"버스가 달립니다."로 출력된걸 확인할 수 있다.

이처럼 수퍼클래스의 메서드와 이름도, 반환 데이터 타입도, 파라미터도 같은 메서드를 서브 클래스에 선엄함으로써 수퍼클래스의 메서드를 무시하고 서브클래스의 메서드를 사용할 수 있었다. 이를 오버라이딩이라 한다.

다시 정리하면, 둘의 차이는 오버로딩은 새로운 기능을 부여하는 것이라면, 오버라이딩은 기존의 기능을 변경하는 것이라 할 수 있다.