오버라이딩과 오버로딩은 자주 나오면서도 중요한 개념이다.
상위 클래스가 가지고 있는 메소드를 하위 클래스에서 재정의해서 사용하는 것을 의미한다.
// 상위 클래스
class Animal {
// 소리를 출력하는 메서드
public void makeSound() {
System.out.println("동물이 소리를 냅니다.");
}
}
// 하위 클래스
class Dog extends Animal {
// 오버라이딩: 상위 클래스의 makeSound() 메서드를 재정의
@Override
public void makeSound() {
System.out.println("개가 멍멍 소리를 냅니다.");
}
}
// 하위 클래스
class Cat extends Animal {
// 오버라이딩: 상위 클래스의 makeSound() 메서드를 재정의
@Override
public void makeSound() {
System.out.println("고양이가 야옹 소리를 냅니다.");
}
}
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog(); // 다형성 적용
Animal animal2 = new Cat(); // 다형성 적용
animal1.makeSound(); // Dog 클래스의 makeSound() 메서드가 호출됨
animal2.makeSound(); // Cat 클래스의 makeSound() 메서드가 호출됨
}
}
위 예제는 'Animal'클래스 상속받는 'Dog'클래스와 'Cat'클래스를 정의하고, 각각 'makeSound()' 메서드를 오버라이딩 했습니다.
'Main'클래스에서는 'Animal'타입의 객체를 생성하고, 이들을 다형성을 이용하여 'Dog'와'Cat'의 인스턴스로 참조합니다.
이후 각 객체의 'makeSound()'메서드를 호출하면, 해당하는 하위 클래스의 오버라이딩된 메서드가 실행됩니다.
같은 이름의 메소드를 여러 개 가지면서 매개변수의 타입과 개수를 다르게 하여 정의하는 것을 의미한다.
즉, 메소드의 시그니처를 다르게 하여 정의하는 것이다.
class Calculator {
// 정수형 두 개를 더하는 메서드
public int add(int num1, int num2) {
return num1 + num2;
}
// 실수형 두 개를 더하는 메서드
public double add(double num1, double num2) {
return num1 + num2;
}
// 정수형 세 개를 더하는 메서드
public int add(int num1, int num2, int num3) {
return num1 + num2 + num3;
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
// 각각 다른 오버로딩된 메서드 호출
System.out.println(calc.add(5, 10)); // 정수형 두 개를 더하는 메서드 호출
System.out.println(calc.add(3.5, 2.5)); // 실수형 두 개를 더하는 메서드 호출
System.out.println(calc.add(1, 2, 3)); // 정수형 세 개를 더하는 메서드 호출
}
}