자바에서의 오버라이딩 vs 오버로딩

소개

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

Screenshot of Java code with arrows pointing at instances where overloading and overriding are occurring.

슈퍼클래스와 자식 클래스에서 메서드 시그니처(이름과 매개변수)가 동일할 때, 이를 오버라이딩이라고 합니다. 같은 클래스 내에서 두 개 이상의 메서드가 동일한 이름을 가지지만 매개변수가 다를 때, 이를 오버로딩이라고 합니다.

오버라이딩과 오버로딩 비교

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