언어(Language)/Java

[Java] 자바 메서드 오버로딩과 오버라이딩 (Overloading vs Overriding)

잇트루 2022. 9. 14. 02:00
반응형

오버로딩 (Overloading)

메서드 오버로딩이란 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것이다. 보통 하나의 메서드에는 하나의 기능만을 구현해야 하기 때문에, 같은 이름의 메서드를 여러 개 만들어 여러 기능을 구현하기 위해 사용한다.

 

메서드 오버로딩은 같은 메서드 이름을 사용한다고 해서 오버로딩이 되는 것은 아니다.

 

메서드 오버로딩을 하기 위한 조건

  1. 같은 이름의 메서드 이름을 정의한다.
  2. 매개변수의 개수 또는 매개변수 타입을 다르게 정의한다.

 

이 두 가지 조건을 모두 만족해야만이 문제없이 실행이 가능하다.

public class OverloadingEx {
    public static void main(String[] args) {
        OverloadingMethod test = new OverloadingMethod(); // 객체 생성

        test.area();
        test.area(5);
        test.area(5, 10);
    }
}

class OverloadingMethod {
    public void formula() {
        System.out.println("formula()");
        System.out.println("formula(int r)");
        System.out.println("formula(int a, int b)");
    }

    public void formula(int r) {
        System.out.println(r * r * 3.14);
    }

    public void formula(int a, int b) {
        System.out.println(a * b);
    }
}

이렇게 메서드 오버로딩을 사용하면, 하나의 메서드로 여러 경우의 수를 해결할 수 있다.

 

오버라이딩 (Overriding)

자바에서 오버라이딩은 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것이다.

 

메서드 오버라이딩을 하기 위한 조건

  1. 상위 클래스와 하위 클래스 관계에서만 성립할 수 있다.
  2. 메서드의 선언부(메서드 이름, 매개변수, 반환 타입)가 상위 클래스의 메서드랑 일치해야 한다.
  3. 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.
  4. 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.
public class MethodOverridingEx {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Dog dog = new Dog();
        Cat cat = new Cat();

        animal.run();
        dog.run();
        cat.run();
    }
}

class Animal {
    void run() {
        System.out.println("동물이 달린다.");
    }
}

class Dog extends Animal {
    void run() {
        System.out.println("강아지가 달린다.");
    }
}

class Cat extends Animal {
    void run() {
        System.out.println("고양이가 달린다.");
    }
}

 

모든 객체를 상위 클래스 타입 하나로 선언하면 배열을 사용하여 간편하게 선언할 수 있다.

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

        // animal.run();
        // dog.run();
        // cat.run();

        Animal[] animals = new Animal[] {new Dog(), new Cat(), new Animal()};
        for (Animal animal : animals) {
            animal.run();
        }
    }
}
반응형