개인공부

overloading

리승우 2022. 7. 19. 22:37

동일 클래스 내, 같은 이름의 메소드를 가지고 있음에도 다른 매개변수의 형식 또는 숫자를 가지고 있으면

동일한 메소드 이름을 가져도 되게 하는 것

 

 

다른 매개변수를 가지면 다른 메소드로 인지하는 것 =  overloading

 

이름은 같지만 시그니처는 다른 메소드를 중복으로 선언 할 수 있는 방법을 메소드 오버로딩(overloading)이라고 한다.

 

class Calculator{
    int left, right;
    int third = 0;

    public void setOprands(int left, int right){
        System.out.println("setOprands(int left, int right)");
        this.left = left;
        this.right = right;
    }

    public void setOprands(int left, int right, int third){
        System.out.println("setOprands(int left, int right, int third)");
        this.left = left;
        this.right = right;
        this.third = third;
    }

    public void sum(){
        System.out.println(this.left+this.right+this.third);
    }

    public void avg(){
        System.out.println((this.left+this.right+this.third)/3);
    }
}

public class newnew {

    public static void main(String[] args) {

        Calculator c1 = new Calculator();
        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        c1.setOprands(10, 20, 30);
        c1.sum();
        c1.avg();

    }
}

setOprands(int left, int right)
30
10
setOprands(int left, int right, int third)
60
20

 

 

메소드 오버로딩은 매개변수를 사용한다. 

즉 매개변수가 다르면 이름이 같아도 서로 다른 메소드가 되는 것이다. 

 

반면에 매개변수는 같지만 리턴타입이 다르면 오류가 발생한다.

 

 

class OverloadingDemo {
    void A() {
        System.out.println("void A()");
    }

    void A(int arg1) {
        System.out.println("void A (int arg1)");
    }

	//void A(int param1) {
        System.out.println("void A (int arg1)");
    }
	//매개변수의 이름을 다르게 한 것은 메소드 오버로딩이 가능하다
    허나 od.A(1);로 메소드를 호출할 때 자바는 
    어떤 메소드를 사용하는 것인지 모르기에 에러가 발생한다.
    

    void A(String arg1) {
        System.out.println("void A (String arg1)");
    }
    //int A (){System.out.println("void A()");}
    // void a()와 비교하였을 때, 메소드 이름 / 매개변수 형식이 같다
    하지만 리턴값이 int / void로 서로 다르다.
    그렇기에 오버로딩이 불가능하다.
    자바는 사용자가 ob.a()를 호출하였을 때, 반환값을 기준으로, 어떤 메소드를
    호출하는지 몰라서 에러가 발생한다.
    
    메소드의 이름은 같고, 매개변수는 다르고, 리턴값은 같다?
    => 메소드 오버로딩이 가능하다.
    
}

    public class newnew {


        public static void main(String[] args) {
            OverloadingDemo od = new OverloadingDemo();
            od.A();
            od.A(1);
            od.A("coding everybody");
        }
    }

void A()
void A (int arg1)
void A (String arg1)

 

 

 

overriding VS overloading

오버라이딩과 오버로딩은 용어가 참으로 헷갈린다. 당연하다. 중요한 것은 오버라이딩이 무엇이고 오버로딩이 무엇인가를 구분하는 것은 아니다. riding(올라탄다)을 이용해서 부모 클래스의 메소드의 동작방법을 변경하고, loading을 이용해서 같은 이름, 다른 매개변수의 메소드들을 여러개 만들 수 있다는 사실을 아는 것이 중요하다. 다만 학습이나 협업의 과정에서 개념을 주고 받을 때는 용어가 중요해진다. 필자의 생각에 이 개념들이 헷갈리는 이유는 over라는 공통분모 때문이다. over를 제외하고 알아두면 덜 헷갈리지 않을까 싶다. (참고로 overriding는 재정의라는 사전적인 의미가 있습니다.)