지난 포스팅에서 생성자에 관해 다루면서 잠시 '오버로딩'에 대해 잠깐 언급하였다.
이번 포스팅에서는 그 오버로딩에 대해 다루며 this 에 대해 함께 정리한다.
1. 오버로딩이란?
오버로딩을 네이버 사전에 검색해보면 다음과 같이 나온다.

사진 설명을 입력하세요.
사전에 정의된 내용처럼 메소드 오버로딩이란 동일한 이름을 가진 메소드를 정의하는 것을 얘기한다.
2. 오버로딩의 조건
메소드를 오버로딩하기 위해서는 다음과 같은 조건을 만족해야 한다.
1. 동일한 클래스에 있어야 한다.
2. 메소드 이름이 같아야 한다.
3. 메소드 매개변수의 개수가 달라야 한다.
4. 메소드 매개변수의 타입이 달라야 한다.
5. 반환형은 무관하다.
6. 접근 제한자는 무관하다.
<소스코드>
package com;
public class Add {
// 1번 : 정수형 매개변수 1개
public void add(int a) {
System.out.println("실행 결과 : "+ a);
}
// 2번 : 정수형 매개변수 2개
public void add(int a, int b) {
System.out.println("덧셈 결과 : "+ (a+b));
}
// 3번 : 실수형 매개변수 2개
public void add(float a, float b) {
System.out.println("덧셈 결과 : "+ (a+b));
}
// 4번 : 정수형 매개변수 3개
public int add(int a, int b, int c) {
System.out.println("덧셈 결과 : "+ (a+b+c));
return a+b+c;
}
// 5번 : 정수형 매개변수 2개 + 반환형
//public int add(int a, int b) { // error!
// System.out.println("덧셈 결과 : "+ (a+b));
// return a + b;
//}
}
코드에서 보면 add( ) 메소드를 총 5개 만들었다. (주석까지 5개)
중요한 것은 매개변수의 갯수와 타입이다.
각 메소드의 이름은 같지만 매개변수의 개수와 자료형의 차이로 인해 오버로딩된 것을 확인할 수 있다.
만약 5번 메소드를 주석 해제하면 에러가 발생된다.
그 이유는 반환형의 차이는 있지만 매개변수의 자료형과 갯수가 완전히 동일하기 때문이다.
즉, 오버로딩에 중요한 것은 매개변수이며 반환에 따른 차이는 전혀 없다는 것이다.
package com;
public class AddManager {
public static void main(String[] args) {
// TODO Auto-generated method stub
Add add = new Add();
add.add(10); // 매개변수가 1개
add.add(1, 5); // 정수형을 받는 매개변수
add.add(1.1f, 5.0f); // 실수형을 받는 매개변수
add.add(1, 5, 6); // 반환형 + 정수형을 3개 받는 매개변수
System.out.println("덧셈 결과 : " + add.add(1, 5, 6)); // 반환 결과
}
}
위의 메인 메소드와 함께 실행해보면 다음의 결과를 얻을 수 있다.

3. this
C++ 에서의 this 의미는'자기 자신을 가리키는 포인터' 였다.
JAVA 에서도 비슷한 개념으로 자기 자신을 가리킬 때 this 가 사용된다.
JAVA 에서는 클래스 내부에서 다른 생성자를 호출할 때 사용되는 지시자로도 사용할 수 있다.
또한 자신의 멤버를 가리키는 용도로도 사용될 수 있다.
먼저 다른 생성자를 호출할 때 사용을 살펴보자.
package com;
public class CarManager {
public static void main(String[] args) {
// TODO Auto-generated method stub
Car car1 = new Car();
car1.showInfo();
Car car2 = new Car("Red");
car2.showInfo();
Car car3 = new Car("White", "manual");
car3.showInfo();
Car car4 = new Car("Black", "manual", 2);
car4.showInfo();
}
}
main 메소드 부분이다. 이번 예제에서는 main에 대한 변경은 없으니 이 소스만 참고해도 무관하다.
package com;
public class Car {
String color; // 색상
String gearType; // auto , manual
int door; // 문의 갯수
Car(){
color = "Grey"; // 기본컬러 회색 설정
gearType = "auto";
door = 4;
}
Car(String c) {
color = c;
gearType = "auto";
door = 4;
}
Car(String c, String g) {
color = c;
gearType = g;
door = 4;
}
Car(String c, String g, int d){
color = c;
gearType = g;
door = d;
}
public void showInfo() {
System.out.println("색상 : " + color + " , " + "변속기 : " +
gearType + " , " + "문 : " + door);
}
}
위 예제는 자동차의 색상, 기어 종류, 문의 갯수를 인스턴스 변수로 하는 클래스이다.
총 4개의 생성자 메소드가 오버로딩된 것을 확인할 수 있다.
각 생성자를 보면 color 와 gearType, door 멤버 변수들이 반복적으로 나오고 있는 것을 확인할 수 있다.
이런 중복적인 코드는 라인의 수만 지나치게 많아지게 하여 코드 작성에 불편함을 초래한다.

코드는 조금 지저분하지만 실행 결과는 정상적으로 나온다.
이를 this를 통하여 다시 정리해보자.
package com;
public class Car {
String color; // 색상
String gearType; // auto , manual
int door; // 문의 갯수
Car(){
this("grey");
}
Car(String c) {
this(c, "auto");
}
Car(String c, String g) {
this(c, g, 4);
}
Car(String c, String g, int d){
color = c;
gearType = g;
door = d;
}
public void showInfo() {
System.out.println("색상 : " + color + " , " + "변속기 : " +
gearType + " , " + "문 : " + door);
}
}
많은 양의 코드가 아니라 차이는 적어보이지만 this 를 통해 깔끔하게 정리된 것을 확인할 수 있다.
코드의 의미상으론 동일하다. 물론 실행결과도 동일한다.
이제 생성자를 보자.
잘 보면 각 생성자에서 자신의 매개변수와 this 에 들어간 값의 갯수가 1개씩 차이나는 것을 확인할 수 있다.
즉, this 에 들어간 값의 갯수에 따라서 갯수가 맞는 다른 생성자를 호출하는 것을 확인할 수 있다. 이는 각 생성자를
호출시 입력된 매개변수와 함께 최종 형태 ( Car(String c, String g, int d) 생성자 ) 까지 각 변수에 조립하듯 갚이
넣어지는 것을 볼 수 있다. (맨 위의 소스인 main 에서 인스턴스 생성 시 입력된 값을 참고해 보자.)

this의 용도는 다른 생성자를 호출하는 외에도 한 가지 더 있다.
바로 멤버변수를 지칭하는 것이 또 하나의 용도이다.
위의 예제를 다시 수정하여 봤다.
package com;
public class Car {
String color; // 색상
String gearType; // auto , manual
int door; // 문의 갯수
Car(){
this("grey");
}
Car(String c) {
this(c, "auto");
}
Car(String c, String g) {
this(c, g, 4);
}
Car(String color, String gerType, int door){
this.color = color;
this.gearType = gerType;
this.door = door;
}
public void showInfo() {
System.out.println("색상 : " + color + " , " + "변속기 : " +
gearType + " , " + "문 : " + door);
}
}
주목할 곳은 마지막 생성자 부분이다.
잘 보면 매개변수와 다른 변수의 이름이 같으며 변수 앞에 this. 가 붙은 것을 확인할 수 있다.
여기서 this가 붙은 변수는 클래스 멤버 변수라는 것을 확인할 수 있다. (이클립스에서는 색상의 차이로 식별가능)
즉 this 를 통해 멤버 변수라는 것을 확인시켜 이름이 같아도 서로 다른 변수임을 알려준다.
이러한 기능은 setter 메소드를 자동완성해 보면 확인해 볼 수 있다.
※ 이런 this의 기능은 이클립스의 코드 자동완성 기능에서 (다른 언어, 프로그램 에서도) 변수의 명칭이 같아져
발생하는 문제를 해결하기 위해 만들어 둔 듯 하다.

실행 결과는 전혀 다름 없음을 볼 수 있다.