Dev/JAVA

JAVA 메소드 오버로딩(Overloading)

Fehoon- 2018. 1. 28. 12:33

 

자바(JAVA) 메소드 오버로딩 (Overloading)

 

메소드 오버로딩은 대부분의 객체지향 언어가 지원하는 문법적인 요소이다.

이로 인해서 자바에서는 동일한 이름의 메소드를 둘 이상 정의할 수 있다.

 

■ 매개변수의 형이 다르거나 개수가 다르거나

 

class AAA{
    void aFunc(int n){ . . . }
    void aFunc(int n1, int n2){ . . . }
    void aFunc(int n1, double n2){ . . . }
}

 

동일한 메소드명으로 3개가 정의되어 있을 때

다음과 같은 상황에서 각각의 메소드를 호출하게되는 것

 

AAA instan = new AAA(); //인스턴스 생성
instan.aFunc(10);    //a.Func(int n) 호출
instan.aFunc(10,20);    //a.Func(int n1, int n2) 호출
instan.aFunc(10, 3.14);    //a.Func(int n, double n2) 호출

 

다음과 같은 상황이 있을 수 있다.

 

AAA instan = new AAA();
instan.aFunc(10, 'a');

 

 

이 경우 char형 문자 'a'는 자동 형변환이 된다.

그렇다면 해당 instan.aFunc(10,'a'); 는 어떤 메소드를 호출하게 될까?

 

이러한 상황에서 정답은 a.Func(int n1, int n2) 이다.

그 이유는 가장 가까운 위치에 놓여있는 자료형으로 변환이 이루어지기 때문이다.

 

 

 

 

■ 반환형이 다를 경우 메소드 오버로딩이 성립되지 않는다.

 

 

 

 

다음과 같은 상황에서는 반환형이 다르기 때문에 메소드 오버로딩이 불가능하다.

 

 

class BBB{
    int bFunc(int n){ . . . }
    boolean bFunc(int n){ . . . }
}

 

 

■ 생성자도 오버로딩의 대상이 된다.

 

 

생성자의 오버로딩으로 인해서 하나의 클래스를 기반으로 다양한 형태의 인스턴스생성이가능합니다.

 

 

 ex>

 

class Person{
    private int perID;
    private int milID;

public Person(int pID,mID){
    perID=pID;
    milID=mID;
}

public Person(int pID){
    perID=pID;
    milID=0;
}

public void showInfo(){
    System.out.println("민번 : "+perID);
    if(milID!=0)
        System.out.println("군번 : "+milID+'\n');
    else
        System.out.println("군과 관계 없음 \n");
    }

} class Overloading{ public static void main(String[] args){     Person man = new Person(950123, 880102);     Person woman = new Person(941125);     man.showInfo();     woman.showInfo();

}

}

 

 

생성자 오버로딩으로 인해서 위와 같이 다양한 형태의 인스턴스 생성이 가능해진다.

 

 

 

 

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

 

class Person{
    private int perID;
    private int milID;
    private int birthYear;
    private int birthMonth;
    private int birthDay;

public Person(int perID, int milID, int bYear, int bMonth, int bDay){
    this.perID=perID;  
    // 매개변수가 perID이므로 인스턴스 변수 perID에 접근하기 위해서는 this를 이용해야만 한다.
    this.milID=milID;  // 위와 동일
    birthYear=bYear;
    birthMonth=bMonth;
    birthDay=bDay;
}

public Person(int pID, int bYear, int bMonth, int bDay){
    this(pID, 0, bYear, bMonth, bDay);
}

 . . . 이하 생략 . . .

 

 

this는 인스턴스 자신을 의미하는 키워드로써, 이를 통해서 접근하는 것은 인스턴스 변수와 인스턴스 메소드이다. 만약 this를 사용할 수 없었다면

 

public Person(int pID, int bYear, int bMonth, int bDay){

this(pID, 0, bYear, bMonth, bDay);

}



이 부분은 다음과 같이 입력해주어야 했을 것이다.

 

public Person(int perID, int bYear, int bMonth, int bDay){

this.perID=perID; 

this.milID= 0;

birthYear=bYear;

birthMonth=bMonth;

birthDay=bDay;

}

 

 

참고 서적: 난 정말 JAVA를 공부한 적이 없다구요!

 

반응형