메서드 오버로딩은 동일한 이름을 공유하지만 서로 다른 인수를 갖는 여러 메서드를 설계할 수 있는 프로그래밍 개념이다. 즉, 같은 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는 것이다. 각 메서드는 서로 다른 매개변수 목록을 가져야 한다. 이는 코드의 가독성과 유연성을 높여준다.
오버로딩은 메서드의 매개변수의 개수, 유형 또는 둘 다의 변경이 가능하다. 메서드의 이름은 같지만 매개변수의 개수나 유형이 다르면 오버로딩된 것이다. 다른 인수를 전달하여 같은 이름의 다른 메서드를 호출할 수 있다.
메서드 시그니처는 메서드의 이름과 인수로 구성된 메서드의 고유 식별자이다.
public int sum(int a, int b)
sum
: 메서드 이름a
, b
: 정수인 매개변수메서드가 호출되면 컴파일러는 시그니처를 비교하여 어떤 메소드가 호출되었는지 식별한다.
public class MathUtils {
// 두 정수의 합을 반환하는 메서드
public int add(int a, int b) {
return a + b;
}
// 세 정수의 합을 반환하는 메서드
public int add(int a, int b, int c) {
return a + b + c;
}
// 두 실수의 합을 반환하는 메서드
public double add(double a, double b) {
return a + b;
}
public static void main(String[] args) {
MathUtils math = new MathUtils();
System.out.println(math.add(5, 10)); // 15
System.out.println(math.add(5, 10, 15)); // 30
System.out.println(math.add(5.5, 10.5)); // 16.0
}
}
메서드 오버라이딩은 상속 관계에 있는 클래스에서 부모 클래스의 메서드를 자식 클래스가 재정의하는 것이다. 이는 다형성을 구현하여 객체 지향 프로그래밍의 유연성을 높여준다.
// 부모 클래스
class Animal {
public void makeSound() {
System.out.println("Animal makes a sound");
}
}
// 자식 클래스
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Animal(); // 부모 클래스의 객체
Animal myDog = new Dog(); // 자식 클래스의 객체
myAnimal.makeSound(); // Animal makes a sound
myDog.makeSound(); // Dog barks
}
}