본문 바로가기

별걸다하는 IT/프로그래밍언어

[C, C++, java 공통] 오버로딩이란? Overloading 개념

[C언어, C++언어 완전 정복! 강의 목차 링크]

이번에는 overloading 오버로딩 vs overriding 오버라이딩 맨날 비교하는 질문 유명하죠?

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

 

Overloading이란?

사진에서 볼 수 있듯이 'overload =너무 많이 적재하다'라는 의미를 가지고 있어요

즉 겹겹히 쌓아올리는 ~! 이런 느낌을 생각하면 됩니다.

 

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

함수 오버로딩 또는 메소드 오버로딩은 무엇을 의미할까요?

 

일단 '함수/메소드 +오버로딩'이니 '함수를 겹겹히 덮어쓰는 행위'라는 것을 유추해볼 수 있어요. (= 함수 중첩)

 

함수 오버로딩이니 함수부터 생각해봅시다. 

 

 

 

 

함수를 정의할 때 

[return type] FuncName([params..]) { coding.. }//이런 형식으로 작성을 하죠?  
int sum (int a, int b) { return a+b;} //즉 간단하게 덧셈으로 예시를 들면 이렇게요!

그래서 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 sum_int (int a, int b) {return a+b; } 
double sum_double (double a, double b) {return a+b;}

하지만 이게 .. int, double 뿐만 아니라, long, short, byte, String, Arrays 등등 덧셈을 사용하고 싶은

데이터 형태가 늘어날 수록 sum_int, sum_double, sum_long, sum_byte.. 등등 함수의 이름이 복잡해지겠죠.

이름짓기도 힘들고, 사용할 때 타입이 배열일 때 함수 이름이 sum_arrays였나? sum_array였나? 이와 같이 기억하기도 어렵고 코드를 보기에도 안좋습니다.

 

이 비효율적인 코드를 한 번에 정리해주는 개념이 Overloading입니다! 즉 이름을 굳이 여러개 정의할 필요 없이, 하나만 사용하고 그 안에서 매개변수에 따라 찾아 들어가는 걸 말해요. 

int sum (int a, int b) {return a+b;}
double sum (double a, double b) {return a+b;}

sum이라는 이름을 가진 함수가 두 개네요! sum이라는 함수를 매개변수만 달리해서 즉 겹겹히 추가적으로 정의하고 있어요 이게 Overloading! sum(3.3 ,2.7)을 했을 때 sum이라는 함수를 찾아갑니다. sum 두 개 중에 파라미터에 들어온 타입(3.3=double)에 맞는 타입을 스스로 찾아서 매칭시키는 것이 overloading입니다.

 

실제로 C++에서는 cout을 java에서는 System.out.println()함수를 이용해서 출력을 하잖아요

우리가 출력하고자 하는 값이 정수이든 소수이든 문자열이든 신경을 안쓰고 코드를 짤 수 있었던 원리가 바로 오버로딩에 있는거죠. 오버로딩으로 인해 저희는 일관성 있는 코드를 짤 수 있고 더 편하게 코딩을 할 수 있어요.

실제로 java api를 보면 출력함수를 아래와 같이 오버로딩시켜놨어요. 이 덕분에 저희가 어떤 상황에서도 편하게 println함수를 가져다가 사용할 수 있는거죠.

 

[java api 문서- System 클래스의 println]

오버로딩은 매개변수 데이터 타입뿐만 아니라 아래예시처럼 매개변수의 개수로도 자신이 들어갈 함수를 구분을 해요.

 

[ java에서 사용자로부터 입력받을 때 사용하는 Scanner입니다 (C에서는 scanf C++에서는 cin )]

주의 - 리턴타입으로 구분하지는 않아요! 매개변수 타입이나 개수만 다르면 계속 같은 이름의 함수를 덮어써도 알아서 구분합니다.

 

 

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

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

컴파일 할 때 오버로딩 되어 있는 함수를 다 다른 함수명을 가진 함수로 자동적으로 변환해줘요 (이런걸 name mangling이라고 합니다 name mangling규칙은 컴파일러마다 달라요.)

그래서 결국은 우리가 처음에 살펴봤던 sum_int, sum_double처럼 다른 이름을 갖고 동작하는 거~ 

사진 출처:  http://ecspecialist.tistory.com/entry/%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9Overloading%EC%9D%B4%EB%9E%80

 

## 요약

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

메서드를 작성하는 쪽에서는 이름을 짓기도 어렵고 메서드를 사용하는 쪽에서는 이름을 일일이 구분해서 기억해야 하기 때문에 서로 부담이 됩니다. 하지만 오버로딩 덕분에 하나의 이름으로 그 많은 함수가 정의될 수 있습니다

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

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

 

공감과 댓글, 광고보답은 질좋은 포스팅을 작성하고 정보를 공유하는데 힘이 됩니다 :)