티스토리 뷰

오버로딩과 오버라이딩 한방에 이해하기 (Overloading vs Overriding) < OOP, 객체지향 프로그래밍, 다형성, 면접 빈출, 코딩 테스트, 코딩 인터뷰 >


Overloading vs Overriding




Overloading vs Overriding 이름이 비슷해서 매번 헷갈리셨죠?


이번 포스팅에서 둘의 차이를 까먹지 않도록 한방에 이해시켜드리겠습니다.



둘다 함수에 대한 성질을 말하는 개념이며


표기는 비슷하지만, 전혀 다른 의미입니다.



간단히 정리하자면 아래와 같습니다.


Overloading = 이름은 같지만 그냥 전혀 다른 함수


Overriding = 부모에게 물려받아 변형한 함수


하나씩 좀 더 자세히 알아보겠습니다.




1. 오버로딩 (Overloading)


오버로딩은 앞서 말씀드린 것 처럼


"이름은 같지만 그냥 다른 함수"입니다.


Java의 간단한 예제를 통해 좀 더 자세히 살펴보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Overloading{
    public void same(int param){
        System.out.println("숫자를 출력하는 함수입니다.");
    }
    public void same(String param){
        System.out.println("문자를 출력하는 함수입니다.");
    }
}
 
public class OverloadingDemo {
    public static void main(String[] args) {
        Overloading o = new Overloading();
        o.same(1);
        o.same("one");
    }
}
cs



Overloading이라는 클래스 안에 "same"이라는 같은 이름의 함수 2개를 만들었습니다.


그러나 첫번째는 int 형태의 인자를 받으며, 두번째는 String 형태로 받습니다.


그렇게 때문에 그냥 함수 이름만 같을 뿐,


컴퓨터가 보기에는 전혀 다른 함수입니다.


참고로, Java에서 함수를 구분하는 조건은 다음과 같습니다. 


1. 메소드의 이름


2. 메소드 매개변수의 숫자와 데이터 타입 그리고 순서


3. 메소드의 리턴 타입


이 3가지 중에 하나라도 다르면 그냥 전혀 다른 함수인것이죠.


우리가 보기에 비슷할 뿐입니다.


앞선 예제에서는 메소드 이름이 동일하지만,


2번 매개 변수의 타입이 달랐기에 전혀 다른 함수가 되었던 것이지요!


그렇기에 아래의 출력 결과는 다음과 같습니다.


o.same(1);// "숫자를 출력하는 함수입니다."
o.same("one");// "문자를 출력하는 함수입니다."


즉 same이라는 겉보기에 같은 함수를 호출하였지만,


실제로는 전혀 다른 함수를 호출한것이라, 그냥 각각의 기능을 수행한 것이지요.





2. 오버라이딩 (Overriding)


오버라이딩은 앞서 말씀드린 것 처럼


"부모에게 물려받아 변형한 함수"입니다.


상속의 개념이 들어갔으며 객체지향의 핵심 특징인 "다형성"과 밀접한 관련이 있죠.


(객체지향 4가지 핵심 특징 포스팅)



우선 단어의 의미를 살펴보겠습니다.



"다른 무엇보다 더 중요한"의 의미로,


부모로부터 물려받은 동일한 함수를 사용하였지만, 자식이 변형하여 새로 정의한게 더 중요시 된다. 


라고 풀이할 수 있겠습니다.


즉 앞서 Overloading은 그냥 전혀 다른 함수를 부르는 것이지만,


Overriding은 같은 함수인데, 변형에 따른 우선 순위를 따지는 것이지요.


Java의 간단한 예제를 통해 좀 더 자세히 살펴보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 부모 클래스
class Calculator {
    public void sum(int left, int right) {
        System.out.println(left + right);
    }
}
 
// 자식 클래스
class OverridingCalculator extends Calculator {
    public void sum(int left, int right) {
        System.out.println(left + right + "입니다.");
    }
}
 
// 실행
public class Demo {
    public static void main(String[] args) {
        OverridingCalculator c1 = new OverridingCalculator(); // 자식 인스턴스 생성
        c1.sum(10,20); // 결과 : "30입니다."
    }
}
cs


부모 클래스에서 sum이라는 함수를 left + right 로 정의하였고,


자식이 그 부모를 상속받아 동일한 sum이라는 함수를 사용하였습니다.


(앞서 언급한 java가 인식하는 같은 함수의 조건을 모두 만족합니다.)


그러나 "입니다."라는 새로운 문장을 출력값에 추가해주는 변형을 하였죠!


그렇기에 이것을 Overriding이라고 부르며 java는 자식이 변형한 함수에 우선순위를 줍니다.


그렇기에 결과값으로 "30입니다."가 출력되는 것이지요.



이제 두 개념의 차이를 확실히 아시겠나요?


Overloading과 Overriding의 Over가 같아서 헷갈릴 뿐 때어놓고 생각하면 더 쉽습니다.


Loading, Riding은 차이가 크죠


Loading = 불러오다. (전혀 다른 함수를 불러오다)


Riding = 올라타다. (같은 함수를 올라타서 덮어 씌우고 새롭게 정의한다)


이렇게 보니 이제 확실히 아시겠죠?!



도움이 되셨다면, 아래의 하트 혹은 댓글 남겨주세요~


더 좋은 포스팅으로 찾아 뵙겠습니다.


감사합니다.

댓글