본문 바로가기
Java

자바에서 오버로딩과 오버라이딩: 예시와 함께 알아보기

by Status Code 2023. 3. 8.

자바에서 오버로딩(Overloading)과 오버라이딩(Overriding)은 객체지향 프로그래밍의 핵심 개념 중 하나입니다. 

이 두 개념은 이름이 비슷하지만, 서로 다른 개념이며 각각의 특징과 사용 방법이 다릅니다.

 

1. 오버로딩(Overloading)

오버로딩은 하나의 클래스 내에서 같은 이름의 메서드를 여러 개 정의하는 것입니다. 메서드의 이름은 같지만,

매개변수의 개수, 타입, 순서 중 하나 이상이 다른 경우에는 서로 다른 메서드로 인식됩니다.

오버로딩을 사용하면 하나의 클래스 내에서 다양한 매개변수를 받는 메서드를 정의할 수 있습니다.

다음은 오버로딩의 예시입니다.

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

    public double add(double a, double b) {
        return a + b;
    }

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

위의 예시에서 Calculator 클래스는 add() 메서드를 오버로딩합니다. 첫 번째 메서드는 두 개의 int 매개변수를 받아서 

덧셈을 수행하고, 두 번째 메서드는 두 개의 double 매개변수를 받아서 덧셈을 수행합니다. 

세 번째 메서드는 세 개의 int 매개변수를 받아서 덧셈을 수행합니다.

 

 

2. 오버라이딩(Overriding)

오버라이딩은 상위 클래스에서 정의된 메서드를 하위 클래스에서 재정의하는 것입니다.

즉, 상위 클래스에서 이미 정의된 메서드를 하위 클래스에서 다시 정의하면, 하위 클래스에서 정의한 메서드가 호출됩니다. 오버라이딩을 사용하면 상위 클래스에서 정의된 메서드를 하위 클래스에서 새롭게 구현하여 기존 코드를 재사용할 수

있습니다.

다음은 오버라이딩의 예시입니다.

public class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal cat = new Cat();
        Animal dog = new Dog();

        cat.makeSound(); // 출력 결과: "Meow"
        dog.makeSound(); // 출력 결과: "Woof"
    }
}

위 예시 코드에서 Animal 클래스는 makeSound 메소드를 가지고 있습니다. Cat 클래스와 Dog 클래스는 

Animal 클래스를 상속받았으며, 각각의 클래스에서는 makeSound 메소드를 오버라이딩하여 동작을 

재정의하고 있습니다. 메인 메소드에서는 Cat 객체와 Dog 객체를 생성하여 각각의 makeSound 메소드가 어떤 결과를 

출력하는지 확인할 수 있습니다.

 

 

 

아래는 자바에서 오버로딩과 오버라이딩을 사용한 간단한 예시 코드입니다.

public class Animal {
    public void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("The dog barks");
    }
    
    public void makeSound(int volume) {
        System.out.println("The dog barks at volume " + volume);
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.makeSound();
        
        Dog dog = new Dog();
        dog.makeSound();
        dog.makeSound(10);
    }
}

위 코드에서 Animal 클래스는 makeSound 메소드를 가지고 있습니다. Dog 클래스는 Animal 클래스를 상속하면서 makeSound 메소드를 오버라이딩하였습니다. 이때, @Override 어노테이션을 사용하여 부모 클래스의 메소드를 

오버라이딩 한 것임을 명시해 주었습니다.

또한, Dog 클래스에는 makeSound 메소드가 오버로딩되어 있습니다. 이 메소드는 매개변수로 volume을 가지며, 

오버로딩된 메소드를 호출할 때에는 매개변수의 타입, 순서, 개수 등이 달라야 합니다.

Main 클래스에서는 Animal과 Dog 객체를 생성하여 makeSound 메소드를 호출하였습니다. 이때, Dog 객체의 makeSound 메소드는 오버라이딩된 메소드가 호출되었으며, makeSound(int volume) 메소드는 오버로딩된 

메소드가 호출되었습니다.

 

 

자바에서 오버로딩과 오버라이딩은 객체 지향 프로그래밍에서 중요한 개념입니다. 오버로딩은 같은 이름의 메소드를 

여러 개 정의하여 매개변수에 따라 다르게 동작하도록 하는 것이고, 오버라이딩은 부모 클래스의 메소드를 

자식 클래스에서 재정의하여 다른 동작을 수행하도록 하는 것입니다. 이를 통해 코드의 재사용성과 유지보수성을 

높일 수 있습니다.

댓글