한 클래스 내에 동일한 이름의 메소드를 둘 이상 정의하는 것은 불가능하다.
그러나 매개변수의 선언이 다르면 메소드의 이름이 같더라도 정의가 가능하며, 이것을 메소드 오버로딩이라고 한다.
🔎 호출된 메소드를 찾을 때 참조하는 두가지 정보
따라서 이름이 같고 매개변수 선언이 다른 메소드를 정의하는 것이 가능하다.
// 메소드 오버로딩 예1 (매개변수의 수가 다른 경우)
void sampleMethod(int n) {...}
void sampleMethod(int n1, int n2) {...}
// 메소드 오버로딩 예2 (매개변수의 형이 다른 경우)
void sampleMethod(int n) {...}
void sampleMethod(double d) {...}
// 메소드 오버로딩 조건x
int sampleMethod() {...}
double sampleMethod() {...}
🔎 메소드 오버로딩의 주의할 점
생성자도 매개변수의 선언이 다르면 둘 이상 정의가 가능하다.
class Main {
public static void main(String[] args) {
// 여권번호가 있는 사람의 정보를 담은 인스턴스 생성
Person lim = new Person(990522, 112233);
// 여권번호가 없는 사람의 정보를 담은 인스턴스 생성
Person kim = new Person(201228);
System.out.println("lim의 정보");
lim.showPersonInfo();
System.out.println("kim의 정보");
kim.showPersonInfo();
}
}
class Person {
private int regiNum; // 주민등록 번호
private int passNum; // 여권 번호
/* 생성자1 */
Person(int rnum, int pnum) {
regiNum = rnum;
passNum = pnum;
}
/* 생성자2 */
Person(int rnum) {
regiNum = rnum;
passNum = 0;
}
void showPersonInfo() {
System.out.println("주민등록 번호: " + regiNum);
System.out.println("여권 번호: " + passNum);
}
}
// 출력 결과
lim의 정보
주민등록 번호: 990522
여권 번호: 112233
kim의 정보
주민등록 번호: 201228
여권 번호: 0
🔎 키워드 this를 이용한 다른 생성자의 호출
this(..) : 오버로딩 된 다른 생성자를 의미this를 이용해 정의된 생성자는 초기화 할 값을 전달받는 역할만 하고, 실제 초기화는 호출한 다른 생성자를 통해 진행된다.
이는 중복된 코드를 줄이는 효과를 가진다.

🔎 키워드 this를 이용한 인스턴스 변수의 접근
this. : 인스턴스 변수를 의미인스턴스 변수와 생성자의 매개변수의 이름이 동일하게 선언된 경우, 선언된 지역 내에서의 해당 이름은 매개변수를 우선적으로 의미한다.
이때 키워드 this를 이용하면 해당 영역 안에서도 매개변수가 아닌 인스턴스 변수에 접근할 수 있다.
class ThisInstExam {
public static void main(String[] args) {
SampleBox box = new SampleBox(99);
System.out.println(box.getData());
box.setData(77);
System.out.println(box.getData());
}
}
class SampleBox {
private int data;
/* 생성자 */
SampleBox(int data) {
// 인스턴스변수와 매개변수의 이름이 동일할 경우 매개변수가 우선
// 따라서 매개변수가 아닌 인스턴스 변수 this에 접근하기 위해서 this 키워드를 사용
this.data = data;
}
void setData(int data) {
this.data = data;
}
int getData() {
return this.data;
}
}
// 출력 결과
99
77