메소드 오버로딩, this

gustjtmd·2022년 1월 26일
0

Java

목록 보기
5/40
한 클래스 내에 동일한 이름의 메소드를 둘 이상 정의하는 것은 허용하지 않지만 매개변수의 선언이 다르면 가능하다. 이것을 오버로딩이라 한다.

메소드 오버로딩

메소드 오버로딩 조건

호출말 메소드를 찾을때 다음 두 가지 정보를 참조하여 메소드를 찾게된다

1. 메소드의 이름
2. 메소드의 매개변수 정보

클래스 내에 다음과 같이 메소드 둘 이상 존재해도 문제가 되지 않는다
매개변수의 선언이 다르면 호출된 메소드의 구분이 가능하기 때문이다

class MyHome{
	void mySimpleRoom(int n){...}
    	void mySimpleRoom(int n1, int n2){...}
        void mySimpleRoom(double d1, double d2){...}
}
성립되는 경우

void simpleMethod(int n){...}
void simpleMethod(int n1, int n2){...}
void simpleMethod(double d){...}

그러나 다음과 같이 반환형이 다른 경우에는 메소드 오버로딩이 성립하지 않는다

int simpleMethod(){...}
double simpleMethod(){...}

반환형은 호출할 메소드를 선택하는데 있어서 판단 기준이 아니기 때문

오버로딩된 메소드를 호출할 때에는 전달인자 자료형과 매개변수의 자료형을 일치시키는 것이 좋다.

Class AAA{
	void simple(int p1, int p2){...}
    	void simple(int p1, double p2){...}
}

AAA inst = new AAA();
inst.simple(7,'K');	//어떤 메소드가 호출될까?

이러한 상황에서는 자동 형 변환 규칙을 적용하되 가장 가까운 위치에 놓여있는 자료형으로의
형 변환을 우선 시도한다 
따라서 void simple(int p1, int p2){...} 가 호출되는데
가능은 하지만 이런 애매한 상황은 만들지말자.

생성자도 오버로딩의 대상

코드로 확인해보자

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);
        else
            System.out.println("여권을 가지고 있지 않습니다.");
    }
}
public class ConOverloading {
    public static void main(String[] args) {
        //여권 있는 사람의 정보를 담은 인스턴스 생성
        Person jung = new Person(335577, 112233);

        //여권 없는 사람의 정보를 담은 인스턴스 생성
        Person hong = new Person(775544);

        jung.showPersonalInfo();
        System.out.println();
        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

키워드 this를 이용한 다른 생성자의 호출


Person(int rnum, int pnum){	
        regiNum = rnum;
        passNum = pnum;
    }
    
Person(int rnum){
        regiNum = rnum;
        passNum = 0;
    }
    
이 중에서 두번째로 위치한 생성자를 다음과 같이 정의할수 있다.

Persont(int num){
	this(rnum,0)	// rnum과 0을 인자로 받는 다른 생성자를 호출
}

--------------------------------------------------------------------------

위에서 사용된 this'오버로딩 된 다른 생성자'를 의미한다
즉 위의 문장은 rnum과 0을 인자로 받는 다른 생성자의 호출을 의미한다.
결국 위와 같이 생성자를 정의하면 이 생성자는 초기화 값을 전달하는 역할만 하고 실제 초기화는
첫 번째로 정의된 생성자를 통해서 진행하는 형태가 된다.
이와 같이 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 내에는 인스턴스 변수로 data가 선언 되었다 따라서 인스턴스 메소드 내에서
생성자 내에서 data라는 이름의 변수에 접근하면 이는 인스턴스 변수 data의 접근으로 이어진다

그러나 매개변수 data라는 이름의 변수가 선언되면 상황은 달라진다.
class SimpleBox{
	private int data;
    
	SimpleBox(int data){
       		여기서의 data는 매개변수 data를 의미함
    }
}

위와 같이 매개변수의 이름이 인스턴스 변수의 이름과 동일하게 선언된 경우 선언된 지역 내에서의
해당 이름은 매개변수를 의미하게 된다.
키워드 this를 이용하면 이 영역 안에서도 인스턴스 변수에 접근할수 있다.

class SimpleBox{
	private int data;
    
	SimpleBox(int data){
   		 //매개변수 data의 값을 인스턴스 변수 data에 저장
       		this.data = data;	
    }
}
출처 윤성우의 열혈 Java 프로그래밍
profile
반갑습니다

0개의 댓글