JAVA

[JAVA] 자바 메소드 오버라이딩 오버로딩 차이

오탄자 2020. 3. 16. 01:02

자바에 오버라이딩과(Overriding)과 오버로딩(Overloading)이 있는데 비슷한 이름이라 자주 헷갈리곤 한다.

이름은 비슷하지만 개념은 전혀 다르다.

 

 

 

 

메소드 오버라이딩 (Overriding)

상속관계에 있는 부모클래스에서 정의된 메소드를 상속받은 자식 클래스에서 다시 재정의를 하는것이다.

상속받은 메소드를 그대로 사용해도 되고, 다시 재정의해서 사용할수도 있다.

 

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

public class B extends A{
  void overridingTest() {
    System.out.println("overridingTest B");
  }
}

public class Test {
  public static void main(String[] args) {
    B b = new B();
    b.overridingTest();
  }
}

// overridingTest B

 

 

메소드 오버로딩 (Overloading)

메소드의 이름은 같고 매개변수의 갯수나 유형이 다른 또 하나의 메소드를 만드는 것이다.

예를들어 어떤 메소드에서 인자를 int로만 받아들인다면 메소드를 호출하는 쪽에선 int로만 보내야 하기 때문에

int만 보내던가, double을 int로 변환을 해서 메소드를 호출해야 한다.

하지만 같은 메소드 이름으로 인자를 double로 오버로딩하게 되면 메소드를 호출하는 쪽에서 변환 없이 

호출이 가능하기 때문에 호출하는 입장에서 더 편할수 있다.

 

public class Overload {
  public int inputNumber(int a) {
    return a;
  }
  
  public double inputNumber(double a) {
    return a;
  }
}

 

 

 

 

 

주의할점은

메소드 오버로드 시 인자 목록이 다르면 리턴 유형을 바꿔줘도 된다.

다만, 리턴 유형만을 바꿀 순 없다.

 

public class Overload {
  public int inputNumber(int a) {
    return a;
  }
  
  public double inputNumber(int a) {
    return a;
  }
}


// error
// Duplicate method inputNumber(int) in type Test