Overloading & Overriding

hanrabong 2022. 3. 10. 13:12

 

 Overloading과 Overriding은 객체지향 프로그래밍에서 필수적으로 알아야 하는 개념입니다. 대표적인 객체지향 언어인 JAVA를 공부하지 않아도 python, javascript, typescript에서도 사용되는 개념입니다. 또한 Overloading의 경우는 클래스 내에 메서드뿐만 아니라 함수에도 적용이 됩니다.

 이번 글에서는 Overloading과 Overriding의 개념에 대해서 정리를 해보려고 합니다. java와 typescript에서 overloading과 overriding의 규칙이 살짝 다른데 그 부분은 추후의 글에서 다뤄보도록 하겠습니다.

 

Overloading


 Overloading이란 함수나 메서드의 이름은 똑같은데 return type이나 argument type, argument 개수에 따라서 호출되는 메서드나 함수가 결정되는 것을 말합니다.

예시를 통해서 알아보겠습니다. C++을 이용하여 덧셈을 하는 함수를 개발해보겠습니다. 

C++ functon overloading

 위의 사진에서 오른쪽 사진을 보면 함수가 3개 있습니다. int type argument 2개를 받아서 int type을 return 하는 return 하는 함수와 double type argument 2개를 받아서 double type을 return 하는 함수와 int type argument 3개를 받아서 int type을 return 하는 함수가 있습니다. 3개의 함수를 보면 이름이 모두 똑같습니다. 위의 프로그램을 실행시키면 다음과 같은 결과가 나옵니다.

 

function overloading의 결과

 위의 결과를 통해서 개발자의 의도대로 코드가 실행되는 것을 확인할 수 있습니다. 만약에 Overloading을 사용할 수 없다면 위의 세 개의 함수를 모두 다른 이름으로 정의를 해줘야 합니다. 그리고 호출을 할 때 각자 다른 이름의 함수를 호출해야 합니다.

 

어떻게 자동으로 필요한 함수를 매칭해 줄 수 있을까?


 위에서 보면 sum으로 함수 이름이 전부 동일한테 어떻게 자신한테 정확히 맞는 함수를 찾아서 동작을 하는 것일까요? 컴파일러가 정확한 함수를 찾게 도와줍니다. 컴파일러가 코드를 컴파일할 때 오버로딩 되어 있는 함수를 전부 다른 이름의 함수명으로 변환해줍니다. 이런 개념을 name mangling이라고 합니다. 그러하여 Overloading이 compile time에 resolve 되었다고 표현을 합니다.

위의 코드에서 직접 확인을 하고 싶어 compile 한 후 파일을 확인해 보았습니다. compiler마다 name mangling 규칙은 다르다고 합니다.

function overloading compile file

 sum 함수를 compiler가 name mangling 한 것을 확인할 수 있었습니다. argument type에 따라서 double type argument일 경우 sumdd로 inter type argument가 2개인 경우 sumii, 3개인 경우 sumiii로 이름을 바꿔줬습니다. 

 

Overloading의 장점


 위에서 덧셈을 해주는 코드에서 sum이라는 이름의 함수를 가지고 3개의 역할을 할 수 있게 만들었습니다. 똑같은 이름을 사용하여 비슷한 기능을 할 수 있게 함수를 만들었지만 결국에는 함수 3개를 직접 만들어야 했습니다. 이름이 똑같은 장점으로 인해 어떤 점이 좋은지 또 성능 면에서도 장점이 있는지 찾아보았습니다.

  • 코드의 가독성 향상
  • 코드 유지 관리 쉽다
  • 코드의 재사용성

 같은 이름으로 정의할 수 있기에 가독성도 좋고 유지관리도 좋습니다. 또한 이름을 통해 비슷한 기능을 한다는 것을 유추할 수 있기에 개발면에서 많은 장점이 있습니다.

 특정 글들에서 function overloading을 통해 memory를 절약하고 빠르게 수행할 수 있다고 나와있었습니다. 하지만 Overloading이 compile time에 resolve가 되고 제가 알기에 현재 프로그램들은 run time에 memory에 적재되기에 memory면과 성능에서 장점이 있는지 의문이 듭니다. (아시는 분 있으면 댓글로 달아주면 정말 감사하겠습니다...)

 

 

Overriding 


  Overriding의 사전적 정의를 보면  다른 무엇보다 더 중요한, 최우선시되는 이라는 뜻을 갖고 있습니다. 실제로 객체지향 프로그래밍에서 말하는 Overriding의 사전적 정의와는 비슷하면서 조금 다릅니다. 

 흔히 객체지향에서 말하는 Overriding이란 상속을 통해서 부모 class에서 method를 가져와서 사용을 하는데 자식 class에서 사용하고 싶은 대로 덮어씌워 다시 정의하여 사용하는 것을 말합니다. 사전적 정의와 연관을 시켜보면 Parent의 method를 Overriding한 method가 있으면 나한테 있는 method를 더 우선시해라로 이해하여도 됩니다.

 예시를 통해 알아보겠습니다. 밑에 간단한 class를 만들었습니다. Uncle과 Child class는 Parent class를 상속하고 있습니다. Child class는 Parent class의 info method를 Overriding 하고 있습니다.

Java Overriding

 위의 코드를 실행해보면 다음과 같은 결과가 나옵니다. 

Overriding 결과

 Overriding을 한 Child의 경우 재정의한 method가 실행이 되었고, Uncle 객체의 경우 Parent의 method가 실행되었습니다.

 

 

어떻게 method가 부모의 method인지 나의 method인지 알까?


 Overriding 된 method는 Overloading과 다르게 runtime에서 어떤 객체의 method를 호출하는 것인지 알 수 있습니다. 언어마다 Override 하는 규칙이 다른데 Override규칙을 위배해서 method를 정의한다면 compile error가 나옵니다. 이로 인해 compile time에 알 수 있는 게 아닌가 할 수 있지만, Override 하여 method를 정의할 때 확인은 compiler가 합니다. 하지만 해당 method를 호출할 때 어떤 object의 method를 호출했는지 확인은 runtime에 합니다.

 

Overriding의 장점


 Overriding은 Parent의 기능이 필요해서 Child가 상속을 했을 경우 특정 method만 재정의가 가능하게 해 줍니다. Overriding이 없을 경우 Parent와 똑같은 기능을 하는 Class만 상속을 해야할 것이며 그럼 상속의 이점이 줄어듭니다. 상속을 하여 원하는 method를 재사용가능하게 하며 필요한 method들만 재정의할 수 있어 code의 재사용성 등과 같이 상속의 이점을 가능하게 해줍니다.

 

 

 

※ 틀린점이나 궁금한 점은 댓글로 질문해주세요

 

 

 

참고자료

https://stackoverflow.com/questions/2227516/in-c-how-is-function-overloading-typically-implemented

 

In C++ how is function overloading typically implemented?

If there is no function overloading, the function name serves as the address of the function code, and when a function is being called, its address is easy to find using its name. However with func...

stackoverflow.com

 

'' 카테고리의 다른 글

[CDN] CDN을 사용하면 성능이 좋아질까?  (0) 2022.02.21