전공공부/자바 (JAVA)

[JAVA] Overloading과 Overriding의 차이

jooona 2022. 1. 24. 22:07
반응형

자바에서 자주 나오는 개념으로 Overloading과 Overriding이 있습니다. 이름이 비슷해서 혼동하기 쉽지만 전혀 다른 뜻을 가지고 있기 때문에 한 번 정리를 하고 넘어가고자 합니다.

 

Overloading

Overloading은 한 클래스 내에서 둘 이상의 메서드가 같은 이름을 가지면서 인자의 수나 자료형이 다른 경우를 말합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public int add(int a, int b) {
        return a + b;
    } // 1번
 
    public int add(int a, int b, int c) {
        return a + b + c;
    } // 2번
 
    public int add(char a, char b) {
        return a + b;
    } // 3번
 
    public double add(double a, double b) {
        return a + b;
    } // 4번
cs

 

1번과 2번은 인자의 수가 다른 경우이고 3번은 인자의 자료형이 다른 경우입니다. 그리고 4번은 리턴 타입이 다른 경우이죠. 이렇게 4가지의 메서드를 모두 선언해두고, 아래의 코드와 같이 필요할 때마다 인자를 바꿔가며 호출할 수 있습니다. 주의해야 할 점은 인자는 모두 같으면서 리턴 타입만 다르게 선언하는 것은 불가능합니다.

 

1
2
3
4
        int a = add(12); // 1번 메서드 호출
        int b = add(123); // 2번 메서드 호출
        int c = add('a''b'); // 3번 메서드 호출
        double d = add(1.02.0); // 4번 메서드 호출
cs

 

Overloading 덕분에 같은 기능을 가지면서 인자만 다른 여러 메서드들의 이름을 모두 다르게 지어줄 필요가 없어 아주 편리하게 코딩을 진행할 수 있습니다.

 

 

Overriding

Overriding은 부모 클래스로부터 상속받은 메서드를 자식 클래스에서 재정의하는 것을 말합니다. 즉, 부모 클래스에서 이미 구현한 메서드를 이름은 같지만 상황에 맞게 조금 변경해서 사용하고 싶을 때 사용하는 기능입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public class Person{
        String name;
        int age;
        
        void eat(){
            System.out.print("먹기");
        }
    }
    
    public class SpiderMan extends Person{
 
        @Override
        void eat() {
            System.out.print("거미줄을 이용해서 먹기");
        }
    }
cs

 

Person 객체에서 eat()이라는 메서드를 구현했고, 이를 상속한 SpiderMan이라는 객체가 Person 객체를 상속하면서 eat() 메서드를 overriding해서 사용하고 있습니다. Overriding을 위해서는 메서드의 이름, 인자, 리턴 값이 모두 같아야 합니다.

 

관행적으로 overriding한 메서드 위에는 @Override라는 주석(annotation)을 적어줍니다. 이 주석은 단순하게 "//"나 "/* */"를 사용한 주석과는 달리 혹시 위에서 말한 overriding의 조건이 충족되지 않을 시에는 오류를 발생시켜주는 역할을 합니다.

 

그리고 overriding을 통해 정의된 메서드는 부모 메서드보다 더 넓은 범위의 접근 제한자(public, private, protected, default)를 가질 수 없고, 더 큰 범위의 예외를 던질 수도 없습니다.

반응형