2019. 10. 28. 19:45

오버로딩과 오버라이딩의 차이점

지난 포스팅의 객체지향 프로그래밍에서 다형성을 설명할 때, 하나의 클래스 내부에 같은 이름의 기능을 여러 개 정의하거나 상위 클래스의 기능을 하위 클래스에서 다시 정의하는 것, 즉 오버라이딩과 오버로딩에 대해서 간략하게 짚고 넘어갔었다면 이번에는 오버라이딩과 오버로딩이 구체적으로 어떻게 사용되는지. 또, 어떤 차이점을 가지고 있는지에 대해서 알아보자.

우선 다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 말한다. 예를들면 키보드나 스마트폰을 예를 들어보자면 키보드는 같은 버튼의 동작 방법을 가지고 있더라도 ESC는 취소, Enter는 실행의 목적을 가지고 있고 스마트폰의 키패드 또한 문자나 게임 등의 모양은 같지만 다른 기능들을 수행하는 것들을 말한다. 자바에서는 주로 오버로딩과 오버라이딩을 통해서 이 다형성의 개념을 표현하는데 비슷한 이름이지만 전혀 다른 개념이기 때문에 햇갈리지 않도록 개념을 확실히 잡아두어야한다.

오버로딩(Overloading)


  • 같은 이름의 메소드를 여러개 정의하는 것
  • 매개변수의 타입이 다르거나 개수가 달라야 한다.
  • return type과 접근 제어자는 영향을 주지 않음.

 

중요한 포인트는 오버로딩은 하나의 클래스에서 같은 이름의 메소드들을 여러 개 가질 수 있다는 점이다. 가장 내가 바로 이해하기 쉬웠던 예는 바로 자바의 Sytem.out.println() 문이나 파이썬의 print() 문같은 출력문이었다. 이런 프린트문들은 기본적으로 언어에서 클래스를 내장해놓았다. 이 프린트문에 매개변수의 타입이 어떤걸 넣더라도 다 출력 값을 콘솔에 띄울 수 있다.

예를 들면 System.out.println(1+1) 이나 String a = "아무거나"라고 변수를 정의하고 이 a를 출력하면 콘솔에서는 2 나 아무거나 가 출력된다. 그 매게변수가 문자형이든 정수형이든 같은 이름의 메소드를 안에 여러개 정의해놨기 때문에 매게 변수의 타입에 따라 "어? 정수형이 들어왔네? 그럼 이 메소드","어? 문자형이 들어왔네? 그럼 이 메소드"이런식으로 다르게 출력할 수 있는 것이다.

오버라이딩(Overriding)


  • 상속에서 나온 개념
  • 상위 클래스(부모 클래스)의 메소드를 하위 클래스(자식 클래스)에서 재정의

 

여기서 중요한 포인트는 상위 클래스의 메소드를 하위 클래스에서 재정의한다는 점이다.

오버라이딩의 개념에 대해서는 잘 이해하지 못하고 있다가 스프링 프레임워크를 다루면서 인터페이스에서 임시로 정의해 두었던 것을 하위 클래스에서 implements로 가져와서 @Override 어노테이션을 사용해서 오버라이딩하면서 재정의한다는 것을 무심코 사용하다가 돌아보니 내가 했던게 오버라이딩이었구나라고 생각이 들었다.

다시말해 인터페이스에서 상위 클래스로 임시로 해당하는 메소드를 정의해두고, 그걸 오버라이딩으로 하위 클래스에서 재정의해서 사용한다. 어찌보면 메소드를 같은 이름의 메소드를 다른 기능으로 고쳐쓴다고 이해하면 편하다.

오버로딩과 오버라이딩의 차이점


오버로딩과 오버라이딩에 대해서 알아보았다. 이름이 비슷하기 때문에 기억하기 힘들다고 생각한다면, 오버로딩의 loading 사전적인 의미에 집중해보자, 로딩은 짐을 싣다할 때 어떤 것에 운반해서 올리는 이미지다. FPS게임을 하면 "리로드!"라고 외치며 총알을 장전하는 모습을 충분히 상상이 가능할 것이다. 이때 총알을 운반에 총에 실어담는 Loading의 개념이 적용된 샘이다. 영어공부나 하자고 이런 이야기를 꺼낸 것은 아니고, 여기서 오버로딩 또한 같은 의미의 용어이다. 위의 사진처럼 여러개의 메소드를 실어 담아놓아서 여러 개의 방향으로 쏠 수 있는 하나의 거대한 메소드를 만드는 것이다. 다만 여기서 주의해야할 것은 화살 하나 하나가 다른 재질(매게 변수)를 지녀야 한다는 점이다.

여기서 라이딩 또한 쉽게 유추해볼 수 있다. 라이딩은 말그대로 타는 것. 자전거를 타든 자동차를 타든 그걸 타는 사람에 의해서 그 탈것(메소드)의 방향과 결과가 달라진다. 위의 사진으로 본다면 화살 위에 또다른 화살을 태워서(Riding)날려보내는 느낌이다.

이 둘을 비교해서 굳이 차이를 나눈다면 오버로딩은 매게변수나 타입이 달라야하지만 오버라이딩은 동일해야하고 오버로딩은 리턴 타입이 무엇이든지 상관없지만 오버라이딩은 동일해야한다는 차이점이 있다.