프로그래밍 언어/Java문법 - 객체지향
6. Java 객체지향 문법(6) - 메소드 오버로딩
아사비치즈스틱
2022. 10. 28. 00:25
메소드 오버로딩(Method Overloading)
🤔 메소드 오버로딩이란?
- 매개변수의 선언을 다르게 하여 동일한 이름의 메소드를 정의하는 것을 의미합니다.
-> 원래 하나의 클래스 안에 동일한 이름의 메소드를 둘 이상 정의하는 것을 허용하지 않습니다.
-> 그러나 매개변수의 선언이 다르면 가능하며 이를 메소드 오버로딩이라고 합니다.
자바에서 호출한 메소드를 찾는 조건
- 자바의 컴파일러는 다음의 두 가지 정보를 기본으로 메소드를 찾게 됩니다.
1. 메소드의 이름
2. 메소드의 매개변수 정보
- 다음의 메소드를 참고하여 살펴봅시다.
MyHouse house = new MyHouse();
house.myRoomLocation(1,2);
- 위의 코드에서 메소드를 호출할 때 다음의 두가지 정보가 사용됩니다.
1. 메소드의 이름은 myRoomLocation
2. 정수 1과 2를 인자로 전달받을 수 있는 메소드
- 즉, 위에서 찾는 메소드의 모양은 다음과 같습니다.
void myRoomLocation(int n1, int n2) {....}
- 따라서 MyHouse 클래스 내에서 매개변수 선언을 달리하여 다음과 같이 myRoomLocation의 메소드를 선언하면 문제가 되지 않습니다.
- 매개변수의 선언이 다르면 호출된 메소드의 구분이 가능하기 때문입니다.
class MyHouse{
void myRoomLocation(int n) {.....)
void myRoomLocation(int n1,int n2) {....}
}
- 메소드 오버로딩이 성립될려면, 매개변수의 선언이 달라야 한다고 했는데 이는 매개변수의 수 또는 형(typr)이 달라야함을 의미합니다.
⭕ 매소드의 오버로딩이 성립되는 예
선언된 매개변수의 수가 다른 경우
void myRoomLocation(int n);
void myRoomLocation(int n1, int n2);
선언된 매개변수의 타입이 다른 경우
void myRoomLocation(int n);
void myRoomLocation(double d);
❌ 매소드의 오버로딩이 성립되지 않는 예
- 반환형은 호출할 메소드를 선택하는데 있어서의 판단 기준이 아니기 때문입니다.
int myRoomLocation(~) {....};
double myRoomLocation(~) {....};
❓ 생성자는 오버로딩이 되는가?
- 생성자도 매개변수의 선언이 다르면, 오버로딩이 가능합니다.
- 아래의 코드를 살펴봅시다.
💻 예제 코드
class Person{
private int regiNum; //주민등록 번호
private int passNum; //여권 번호
Person(int rnum, int pnum){
regiNum = rnum;
passNum = pnum;
}
Person(int rnum){
regiNum = rnum;
passNum = 0;
}
void showPersonalInfo(){
System.out.println("주민등록 번호: " + regiNum);
if(passNum != 0)
System.out.println("여권 번호 : " + passNum + "\\n");
else
System.out.println("여권을 가지고 있지 않습니다. \\n");
}
}
public class ConOverloading {
public static void main(String[]args){
//여권이 있는 사람의 정보를 담은 인스턴스 생성
Person jung = new Person(335577,112233);
//여권이 없는 사람의 정보를 담은 인스턴스 생성
Person hong = new Person(775544);
jung.showPersonalInfo();
hong.showPersonalInfo();
}
}
📸 출력 결과
주민등록 번호: 335577
여권 번호 : 112233
주민등록 번호: 775544
여권을 가지고 있지 않습니다.
- 위의 코드에서 Person의 생성자는 다음과 같습니다.
- 두 생성자의 매개선언이 다름으로 두 생성자가 오버로딩 관계에 있다는 것을 알 수 있습니다.
Person(int rnum, int pnum){ //여권이 있는 이를 위한 생성자
regiNum = rnum;
passNum = pnum;
}
Person(int rnum){ //여권이 없는 이를 위한 생성자
regiNum = rnum;
passNum = 0;
}
- 이로 인해 두가지의 객체(인스턴스)를 선언할 수 있습니다.
-> 이처럼 생성자의 오버로딩은 다양한 상황을 고려한 객체의 생성을 가능하게 합니다.
//여권이 있는 사람의 정보를 담은 인스턴스 생성
Person jung = new Person(335577,112233);
-> 생성자 Person(int rnum, int pnum) {...} 호출
//여권이 없는 사람의 정보를 담은 인스턴스 생성
Person hong = new Person(775544);
-> 생성자 Person(int rnum) {...} 호출
키워드 this의 사용
- 두 생성자의 부분에서 두번째에 위치한 생성자를 대신해 다음과 같이 생성자를 정의할 수 있습니다.
Person(int rnum) {
this(rnum,0); //rnum과 0을 인자로 받는 다른 생성자 호출
}
- 사용된 this는 오버로딩된 다른 생성자를 의미합니다.
- 즉 두번째에 위치한 샌성자는 초기화할 값을 전달받는 역할을 하고 실제 객체를 정의하는 것은 첫번째에 정의된 생성자를 통해서 진행합니다.
❓ 키워드 this를 통해 인스턴스 변수에 접근하는 방법
- 이번에는 this 키워드를 다른 방법으로 사용하는 방법에 대해서 알아봅시다.
💻 예제 코드
class SimpleBox{
private int data;
SimpleBox(int data){
this.data = data;
}
void setData(int data){
this.data = data;
}
int getData(){
return this.data;
}
}
public class ThisInst {
public static void main(String[]args){
SimpleBox box = new SimpleBox(99);
System.out.println(box.getData());
box.setData(77);
System.out.println(box.getData());
}
}
📸 출력 결과
99
77
- 클래스 SimpleBox에 대해 살펴봅시다
class SimpleBox{
private int data;
SimpleBox(int data){
//여기서의 data는 매개변수 data를 의미합니다.
}
}
- 클래스 내부에서 인스턴스 변수로 data가 선언되었습니다. 따라서 인스턴스 매소드와 생성자 data라는 이름의 변수에 접근하면 인스턴스 data로 접근을 의미합니다.
- 그러나 매개변수이 인스턴스 변수와 동일한 data로 선언되면 매개변수가 선언된 내부에서는 매개변수 data를 의미하게 됩니다.
- 이때 this를 이용하면 이 영역안에서도 인스턴스 변수 data에 접근할 수 있습니다.
-> this.data에서 this가 의미하는 것은 이 문장이 속한 인스턴스(객체)를 의미합니다
class SimpleBox{
private int data;
SimpleBox(int data){
//여기서의 this.data는 인스턴스 변수 data를 의미합니다.
}
}
- 따라서 private으로 선언된 인스턴스 변수 data를 접근할 수 있습니다.
- 또한 다음과 같이 생성자를 정의하는 것도 가능합니다.
class SimpleBox{
private int data;
SimpleBox(int data){
this.data = data//매개 변수 data의 값을 인스턴스 변수 data에 저장
}
}
📒 Reference (참고 자료)
- 윤성우의 열혈 자바