오버로딩과 오버라이딩

오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩 : 상속받은 메서드의 내용을 변경하는 것

사전적 의미
- overload : 과적하다
- override : …보다 더 중요하다

class Parent{
    void parentMethod(){}
}
class Child extends Parent{
    void parentMethod(){}       //오버라이딩
    void parentMethod(int i){}  // 오버로딩
}

오버로딩

같은 일을 하지만 매개변수를 달리해야하는 경우에 오버로딩을 구현함

  • 조건

    1. 메서드 이름이 같아야함
    2. 매개변수의 개수 또는 타입이 달라야함
  • 반환타입은 오버로딩을 구현하는데 아무런 영향을 주지 못함

  • 옳은 예

      void println()
      void println(boolean x)
      void println(char x)
      void println(char[] x)
      void println(double x)
      void println(float x)
      void println(int x)
      void println(long x)
      void println(short x)
      void println(byte x)
      // 메서드 이름은 같지만 매개변수의 타입에 따라서 구분가능함
  • 틀린 예

      int add (int a, int b){return a+b}; 
      int add (int x, int y){return x+y}; 
      // 메게변수 이름만 다를뿐 타입, 갯수가 같기 때문에 오버로딩이 아니며 컴파일러는 구분하지 못한다.
      int add(int a, int b){return a+b};
      long add(int x, int y){return (long) (x+y)};
      // 리턴타입만 다른 경우며 매개변수의 타입과 갯수가 일치하기 때문에 add(2, 5); 로 호출했을때 구분하지 못함
  • 장점

    같은 일을 하는데 변수명을 다르게 해야된다면.. 귀찮고 골치 아플듯

오버라이딩(Overriding)

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것

상속받은 메서드를 그대로 사용하기도 하지만, 자신에 맞게 변경해야 하는 경우가 많음 이럴때 오버라이딩을 함

조건

메서드의 내용(블럭내에)만을 새로 작성하는 것이므로 선언부는 조상과 일치해야 함

  • 자손 클래스에서 오버라이딩하는 메서드는 조상클래스의 메서드와
    1. 이름이 같아야함
    2. 매개변수가 같아야함
    3. 반환타입이 같아야함
조건의 예외

접근 제어자(Access modifier)와 예외(Exception)는 제한된 조건 하에서만 다르게 변경할 수 있음

  1. 접근 제어자는 조상클래스의 메서드보다 좁은 범위로 변경 할 수 없다.
    • public > protected > default > private
  2. 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
    • Exception > IOException ..
  3. 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.

+ Recent posts