소개
오버라이딩과 오버로딩은 자바 프로그래밍의 핵심 개념입니다. 이들은 우리의 자바 프로그램에서 다형성을 구현하는 방법입니다. 다형성은 객체지향 프로그래밍(OOPS Concepts)의 하나입니다.

슈퍼클래스와 자식 클래스에서 메서드 시그니처(이름과 매개변수)가 동일할 때, 이를 오버라이딩이라고 합니다. 같은 클래스 내에서 두 개 이상의 메서드가 동일한 이름을 가지지만 매개변수가 다를 때, 이를 오버로딩이라고 합니다.
오버라이딩과 오버로딩 비교
Overriding | Overloading |
---|---|
Implements “runtime polymorphism” | Implements “compile time polymorphism” |
The method call is determined at runtime based on the object type | The method call is determined at compile time |
Occurs between superclass and subclass | Occurs between the methods in the same class |
Have the same signature (name and method arguments) | Have the same name, but the parameters are different |
On error, the effect will be visible at runtime | On error, it can be caught at compile time |
오버라이딩과 오버로딩 예제
다음은 자바 프로그램에서 오버로딩과 오버라이딩의 예입니다:
package com.journaldev.examples;
import java.util.Arrays;
public class Processor {
public void process(int i, int j) {
System.out.printf("Processing two integers:%d, %d", i, j);
}
public void process(int[] ints) {
System.out.println("Adding integer array:" + Arrays.toString(ints));
}
public void process(Object[] objs) {
System.out.println("Adding integer array:" + Arrays.toString(objs));
}
}
class MathProcessor extends Processor {
@Override
public void process(int i, int j) {
System.out.println("Sum of integers is " + (i + j));
}
@Override
public void process(int[] ints) {
int sum = 0;
for (int i : ints) {
sum += i;
}
System.out.println("Sum of integer array elements is " + sum);
}
}
오버라이딩
`process()
` 메소드와 `int i, int j
` 매개변수는 `Processor
`에서 자식 클래스 `MathProcessor
`에 오버라이드됩니다. 7번째 줄과 23번째 줄:
public class Processor {
public void process(int i, int j) { /* ... */ }
}
/* ... */
class MathProcessor extends Processor {
@Override
public void process(int i, int j) { /* ... */ }
}
그리고 `process()
` 메소드와 `int[] ints
`도 `Processor
`에서 자식 클래스에 오버라이드됩니다. 11번째 줄과 28번째 줄:
public class Processor {
public void process(int[] ints) { /* ... */ }
}
/* ... */
class MathProcessor extends Processor {
@Override
public void process(Object[] objs) { /* ... */ }
}
오버로딩
`process()
` 메소드는 `Processor
` 클래스에서 오버로드됩니다. 7, 11, 그리고 15번째 줄:
public class Processor {
public void process(int i, int j) { /* ... */ }
public void process(int[] ints) { /* ... */ }
public void process(Object[] objs) { /* ... */ }
}
결론
이 문서에서는 자바에서의 재정의와 오버로딩을 다뤘습니다. 재정의는 슈퍼클래스와 하위 클래스에서 메서드 시그니처가 동일할 때 발생합니다. 오버로딩은 동일한 클래스 내의 두 개 이상의 메서드가 동일한 이름을 가지지만 매개변수가 다를 때 발생합니다.
Source:
https://www.digitalocean.com/community/tutorials/overriding-vs-overloading-in-java