프로그래밍 언어/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 (참고 자료)


  1. 윤성우의 열혈 자바