본문 바로가기

프로그래밍기초

( C, C++,JAVA 공통 ) 오버로딩이란?

프로그래밍의 기초를 다지는 시간입니다.

이번에는 OVERLOADING 오버로딩 VS OVERRIDING 오버라이딩

말이 비슷해서 비교대조 문제로 종종 출제되는 오버로딩에 댕해서 알아볼께요

 

  ※ OVERLOADING 이란?

 

사진에서 볼수 있듯이 "너무 많이 적재하다" 

라는 의미를 가지고 있습니다

즉 겹겹히 쌓아올리는 이런느낌을 생각하면

됩니다.

자그러면 C++, JAVA, C#,C등 언어에서 사용되는

함수 오버로딩 또는 메소드 오버로딩은

무엇을 의미할까요??

 

일단 '함수/메소드 +오버로딩' 이니 '함수를 겹겹히 덮어쓰는행위' 라는것을

유추해볼수 있어요 (+함수 중첩)

 

함수오버로딩이니 함수부터 생각해봅시다 함수를 정의할때

그래서 SUM(5,3) 하면 5+3인 결과 값 8을 우리가 얻을수 있어요

하지만 만약 소숫점을 포함한 수를 더하고 싶어서 SUM (3,3 =2,7) 라고 쳤어요

SUM 이라는 함수를 찾아갔는데 3.3은 소수인데 매개변수 타입이 INT네??

그러면 함수 이름에 해당하는 매개변수 PARAM의 타입이 일치하지않아

에러가 뜨게 됩니다

결국 같은 내용을 수행하는 함수일지라도 변수 타입에 따라 한 개의 함수를

더 선언해줘야 합니다

 

SUM_DOUBLE(3.3,2.7)하면 이제 SUM_DOUBLE이라는 이름을 가진 함수를 찾아가

매개변수에 3.3과 2.7을 대입해서 결과를 전해줄꺼예요

 

하지만 이게 INT, DOUBLE 뿐만 아니라, LONG, SHORT, BYTE, STRING, ARRAYS 등등

덧셈을 사용하고 싶은 데이터 형태가 늘어날수록 함수의 이름이 복잡해지겠죠

이름짓기도 힘들고, 사용할 때 타입이 배열일 때 함수 이름이 SUM_ARRAYS였나?

SUM_ARRAY였나? 이와 같이 기억하기도 어렵고 코드를 보기에도 안좋습니다.

 

이런 비효육적인 코드를 한번에 정리해주는 개념이 OVERLOADING입니다. 즉 이름을

굳이 여러개 정의할 필요 없이, 하나만 사용하고 그안에서 매개변수를 따라 찾아 

들어가는걸 말합니다.

 

SUM이라는 이름을 가진 함수가 두개네요 SUM 이라는 함수를 매개변수만 달리해서 즉 겹겹히

추가적으로 정의하고 있어요 이게OVERLOADING! SUM(3.3 ,2.7)을 했을때 SUM 이라는 함수를

찾아갑니다 SUM 두개 중에 파라미터에 들어온 타입(3.3=DOUBLE)에 맞는 타입을

스스로 찾아서 매칭시키는 것이 OVERLOADING 입니다.

 

실제로 C++에서는COUT을JAVA에서는SYSTEM.OUT.PRINTLN()함수를 출력을 하잖아요

우리가 출력하고자 하는 값이 정수이든 소수이든 문자열이든 신경을 안쓰고 코드를

짤 수 있었던 원리가 바로 오버로딩에 있는거죠. 오버로딩으로 인해 저희는 일관성 있는

코드를 짤수 있고 더 편하게 코딩을 할 수 있어요.

실제로 JAVA API를 보면 출력함수를 아래와 같이 오버로딩시켜놨어요. 

이 덕분에 저희가 어떤 상황에서도 편하게 PRINTLN 함수를 가져다가 사용할 수 있는거죠

 

오버로딩은 매개변수 데이터 타입뿐만 아니라 아래예시처럼 매개변수의 개수로도

자신이 들어갈 함수를 구분을 해요

 

 

주의 - 리턴타입으로 구분하지는 않아요! 매개변수 타입이나 개수만 다르면 계속

같은 이름의 함수를 덮어써도 알아서 구분합니다.

 

그럼 이러한 오버로딩은 어떻게 자동적으로 매칭해주는 걸까요?

 

컴파일러가 우리가 해야할 일을 대신 해줬기 때문입니다.

컴파일 할 때 오버로딩 되어 있는 함수를 다 다른 함수명을 가진 함수로 자동적으로 

변환을 해줘요 그래서 결국은 우리가 처음에 살펴봤떤 SUM_INT, SUM_DOUBLE 처럼

다른 이름을 갖고 동작하는거

 

 

망일 메서드도 변수처럼 단지 이름만으로 구별한다면 모든 메서드의 이름은 달라야합니다

메서드를 작성하는 쪽에서는 이름을 짓기도 어렵고 메서드를 사용하는 쪽에서는

이름을 일일이 구분해서 기억해야 하기 때문에 서로 부담이 됩니다. 하지만 오버로딩 덕분에 

하나의 이름으로 그 많은 함수가 정의될수 있습니다.

이름만 보고도 이 메서드들은 이름이 같으니 같은 기능을 하겠구나! 라고 쉽게 예측할 수도 있죠

이렇게 공통 기능의 함수를 하나의 이름으로 묶어주는게 오버로딩입니다.