이전에 상속에 대해 알아보고 식별자 this와 super에 대해서도 알아봤습니다. 이번 글에서는 오버 라이딩과 오버 로딩에 대해 알아보려 합니다.
먼저 오버로딩에 대해 알아보겠습니다. 과적하다는 사전적 의미가 있지만 전혀 와 닿지 않아 보입니다. A4 용지를 예로 설명해 보려 합니다.
여기에 똑같은 A4 용지가 각 케이스별로 들어있습니다. 그런데 노란색 케이스에 든 종이는 숫자만 쓸 수 있고 빨간색 케이스에 든 종이에는 문자만 파란색 케이스에는 든 종이는 특수문자만 쓸 수 있다고 정말 어이없는 상황일 거 같습니다. 숫자를 쓰려고 종이를 가져가려다가 실수로 빨간색 케이스에서 꺼낸다면 다시 노란색 케이스에 든 종이를 가지러 가야 할 것입니다.
마 친가지로 A4()라는 매더스가 있습니다. 이 매머드는 매개변수를 A4용지에 적을 수 있는 기능을 가지고 있습니다. 예를 들어 A4(int 19)을 입력하면 A4용지에 19가 입력됩니다. 만약에 오버 로딩이라는 개념이 없다면 숫자를 쓰는 A4 매서드 따로, 문자를 적을 수 있는 매서드 따로, 색을 칠할 수 있는 매서드 각 기능에 따라 매서드를 생성해야 합니다.
A4_int()
A4_String()
A4_Picture()
A4_....
그리고 숫자와 문자를 둘다 적을 수 있는
A4_int_String()
숫자와 문자 그림을
A4_int_String_Picture()
...
...
같은 기능을 함에도 뭘 적느냐에 따라 매서드명이 달라야 합니다. 메서드 개수가 너무 많아지고 다른 이름을 짓는데 머리가 아플 거 같습니다. 이러한 불편함을 해소하기 위한 개념이 바로 오버 로딩입니다. 실제로 쓰이는 대표적인 오버 로딩이 바로 우리가 늘 쓰던 print 기능을 가진 println(), printf(), print() 등입니다.
매개변수의 타입이 다른 print() 를 볼 수 있습니다. 즉 오버로딩을 사용하지 않으면 메서드 이름을 짓는 사람도 힘이 들고 사용하는 사람도 알아보기 힘들 것입니다.
오버로딩이 되기 위해서는 메서드 이름이 같아야 하고 매개변수의 개수 또는 타입과 순서가 달라야 합니다. 리턴 타입은 무관합니다.
a라는 이름의 매서드들입니다. 이름이 같지만 매개변수의 타입 또는 개수가 다르기 때문에 오버로딩이 됩니다.
만약 void a() 라는 메서드를 선언하면 어떻게 될까요? 왠지 int a() 매개변수가 비어 있어 안될 거 같은데 리턴 타입이 다르니깐 되지 않을까라고 생각이 들며 헷갈리는데요.
네. 리턴타입과는 상관없이 둘 다 매개변수를 받지 않는 것이 같기에 오버 로딩의 조건에 맞지 않습니다.
그렇다면 int a(int a, int b) 와 float a(int a, float b)는 어떨까요 리턴 타입은 상관없고 매개변수의 타입이 다르지만 개수는 같은데 오버로딩일까 아닐까 헷갈립니다.
에러가 안뜹니다. 네 오버 로딩이 맞습니다. 매개변수의 개수는 같지만 타입이 다르기 때문입니다.
마지막으로 매개변수에 순서에서 동일한 2개이 매개변수라 해도 순서가 다르면 오버로딩이 됩니다.
글이 너무 길어져 죄송합니다. 우리가 이전에 봤던 코딩에서 예를 들어 보려합니다. 자식 클래스에는 오버로딩으로 3개의 생성자가 선언되어있습니다.
첫번째 child()는 자식의 이름과 나이를 정하지 않은 객체가 생성됩니다. 하지만 저는 객체를 생성하며서 이름과 나이를 정하고 싶습니다. 그래서 child("Alice", 24) 를 통해 이름과 나이가 정해진 자식객체를 생성했습니다. 그런데 child("Alice", 24)는 부모님의 이름과 나이도 똑같이 되어버립니다. 그래서 이번에는 부모님의 이름과 나이까지 다 정할수 있는 객체를 만들겠습니다. child("아부지", 56, "아들",23)라는 생성자를 통해 부모님클래스와 자식클래스의 객체에 각기 다른 변수를 입력해 객체를 만들었습니다.
정리하자면 오버로딩은 같은 기능을 하는 매서드를 매개변수에 따라 각기 다른 이름을 가진 매서드로 선언하면 만드는 개발자도 이름짓기 어렵고 사용자도 매서드에 대해 헷갈릴수 있기 때문에 만들어진 개념입니다.
child()
child("Alice", 24)
child("아부지", 56, "아들",23)
이 오버로딩을 위해서는 동일한 이름의 매서드에 다른타입의 매개변수나 갯수, 순서가 달라야 됩니다.
%저는 여태 순서만 다른 것만으로는 오버로딩이 안되는 것으로 알고 있었는데
void(int a, double b) 와 void(double b, int a) 가 에러가 안나는 것을 알게 되었습니다. 다시 한번 더 확인해봐야겠습니다.
'자바' 카테고리의 다른 글
클래스변수, 인스턴스변수, 지역변수 (0) | 2019.10.04 |
---|---|
오버로딩과 오버라이딩의 차이 (0) | 2019.09.27 |
오버라이딩, overriding (0) | 2019.09.21 |
상속, this, super (0) | 2019.09.04 |
상속 (0) | 2019.09.03 |