[객체 지향 프로그래밍] 오버로딩(Overloading)과 오버라이딩(Overriding)

sy·2023년 7월 2일
0

오버로딩 (Overloading)

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
자바에서 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.

오버로딩의 조건

  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(Object x);
void println(String x);

장점

  • 메서드의 이름만 보고도 이 메서드들은 이름이 같으니 , 같은 기능을 하겠구나 라고 쉽게 예측할 수 있다.
  • 메서드의 이름을 절약할 수 있다.

가변인자(varargs)와 오버로딩

가변인자(variable arguments)는 메서드의 매개변수를 동적으로 지정하는 것이다.
'타입... 변수명' 과 같은 형식으로 선언

public PrintStream printf(String format, Object... args) {...}

가변인자를 매개변수 중에서 제일 마지막에 선언해야한다. 그렇지 않으면 가변인자인지 아닌지 구별할 방법이 없기 때문에 컴파일 에러가 난다.


오버라이딩 (Overriding)

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

class Point {
	int x;
    int y;
    
    Strin getLocation() {
    	return "x: " + x + " + y: " + y;
    }
}

class Point3D extends Point {
	int z;
    
    Strin getLocation() { // 오버라이딩
    	// return "x: " + x + ", y: " + y + ", z: " + z;
        
        // 조상의 메서드 호출, 나중에 값이 변경 되어도 자동으로 반영
        return super.getLocation() + ", z: " + z; 
    }
}

오버라이딩 조건

자손 클래스에서 오버라이딩 하는 메서드는 조상 클래스의 메서드와
-이름이 같아야 한다.
-매개변수가 같아야 한다.
-반환타입이 같아야 한다.

  • JDK1.5 부터 공변 반환 타입(convariant return type)이 추가 되어, 반환 타입을 자손 클래스의 타입으로 변경하는 것은 가능하도록 조건이 완화됨
  1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
    만약 조상 클래스에 정의된 메서드의 접근 제어자(access modifier)가 protexcted 라면, 자손 클래스의 메서드는 protected나 public이 되어야한다.
    public > protected > private

  2. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
    예외 개수의 문제가 아닌 Exception은 모든 예외의 최고 조상이므로 가장 많은 개수의 예외를 던진다.

  3. 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.
    static 멤버들은 자신들이 정의된 클래스에 묶여있다고 생각하기

오버로딩(Overloading) vs 오버라이딩(Overriding)

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

0개의 댓글