[java] 클래스와 객체의 오버로딩과 오버라이딩에 대해 설명해주세요.

자바 프로그래밍 언어에서 클래스와 객체는 중요한 개념입니다. 클래스는 객체를 생성하기 위한 템플릿이며, 객체는 클래스의 인스턴스입니다. 오버로딩과 오버라이딩은 클래스와 객체의 동작을 커스터마이징하는 데 사용되는 개념입니다.

클래스와 객체의 오버로딩 (Overloading)

오버로딩은 같은 이름의 메서드를 여러 개 정의할 수 있는 기능입니다. 인자의 개수나 타입이 다르면 같은 이름을 가진 여러 메서드를 정의할 수 있습니다. 이렇게 정의된 여러 메서드들은 매개 변수의 형식에 따라 호출될 때 자동으로 선택됩니다.

아래의 예시를 보겠습니다.

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
    
    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

위의 예시에서는 Calculator 클래스에 두 개의 add 메서드가 있습니다. 첫 번째 메서드는 두 개의 정수를 입력받아 합을 반환하고, 두 번째 메서드는 세 개의 정수를 입력받아 합을 반환합니다.

Calculator calculator = new Calculator();
int result1 = calculator.add(2, 3);
int result2 = calculator.add(2, 3, 4);

위의 코드에서는 calculator 객체를 생성하고, add 메서드를 호출하는 예시입니다. 첫 번째 호출은 두 개의 정수를 입력받는 add 메서드가 호출되고, 두 번째 호출은 세 개의 정수를 입력받는 add 메서드가 호출됩니다.

클래스와 객체의 오버라이딩 (Overriding)

오버라이딩은 상위 클래스에 정의된 메서드를 하위 클래스에서 재정의하는 기능입니다. 오버라이딩을 통해 하위 클래스는 동일한 이름의 메서드를 가지지만, 자신에게 필요한 동작으로 재정의할 수 있습니다.

아래의 예시를 보겠습니다.

public class Animal {
    public void sound() {
        System.out.println("동물이 소리를 낸다.");
    }
}

public class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("개가 짖습니다.");
    }
}

위의 예시에서는 Animal 클래스에 sound 메서드가 있고, Dog 클래스에서는 이 메서드를 오버라이딩하여 개가 짖는 소리를 출력하도록 재정의했습니다.

Dog dog = new Dog();
dog.sound();

위의 코드에서는 Dog 객체를 생성하고, sound 메서드를 호출하는 예시입니다. 이 때, Dog 클래스에서 오버라이딩된 sound 메서드가 호출되어 개가 짖는 소리가 출력됩니다.

결론

오버로딩과 오버라이딩은 자바 프로그래밍에서 클래스와 객체의 동작을 커스터마이징하는 데에 유용한 개념입니다. 오버로딩은 같은 이름의 여러 메서드를 정의하여 매개 변수의 형식에 따라 호출될 때 자동으로 선택되도록 합니다. 오버라이딩은 상위 클래스에 정의된 메서드를 하위 클래스에서 재정의하여 자신에게 필요한 동작으로 재정의할 수 있도록 합니다.