오버로딩, 오버라이딩

stoph·2023년 3월 12일
0

메소드 오버로딩

한 클래스 안에 같은 이름의 메소드를 여러 개 정의하는 것

오버로딩 성립조건

  • 메서드 이름이 동일해야 한다.
  • 매개변수의 개수 또는 타입이 달라야 한다.
  • 매개변수명은 영향을 주지 않는다.
  • 반환 타입은 영향을 주지 않는다.
  • 접근 제어자는 영향을 주지 않는다.

예시

// 성립 가능
int add(int a, int b) { return a+b; }
int add(int a, int b, int c) { return a+b+c; }
int add(long a, long b) { return a+b; }

// 성립 불가능
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 a, int b) { return (long) (a+b); }

public int add(int a, int b) { return a+b; }
protected int add(int a, int b) { return a+b; }

메서드 오버라이딩

상속받은 슈퍼 클래스에 선언된 메소드를 서브 클래스에서 재정의하는 것

오버라이딩 조건

  • 선언부가 슈퍼 클래스의 메소드와 일치해야 한다.
  • 접근 제어자를 슈퍼 클래스의 메소드보다 좁은 범위로 변경할 수 없다.
  • 예외는 슈퍼 클래스의 메소드보다 많이 선언할 수 없다.

예시

public class Parent {
    public void parentMethod() { System.out.println("Parent"); }
    public void parentMethodEx() throws IOException { ... };
}

public class Child {
	// 오버라이딩 성립
    public void parentMethod() { System.out.println("Child"); }
    public void parentMethod(String s) { System.out.println(s); } // 오버라이딩한 메소드를 오버로딩
    
    // 오버라이딩 성립 X
    private void parentMethod() { ... } // 슈퍼 클래스보다 좁은 범위의 접근 제어자를 가질 수 없음
    public void parentMethodEx() throws IOException, SQLException { ... } // 슈퍼 클래스보다 예외를 더 많이 선언할 수 없음
}

실제로 동작하는 방식

개념적으로는 슈퍼 클래스의 메소드를 재정의하는 것인데 실제로는 해당 메소드를 서브 클래스에서 자신에게 맞게 새롭게 만드는 것이다. 자바 컴파일러는 동적 바인딩을 통해 항상 오버라이딩된 메소드가 실행되도록 보장한다.

정적 바인딩

public class Parent {
	void method1() { System.out.println("Parent"); }
}

public class Child {
	void method1() { System.out.println("Child"); }
}

public class Main {
	public static void main(String[] args) {
    	Child child = new Child();
        child.method1();
    }
}

Child 객체를 생성하여 Child 타입의 변수에 할당해주었다. 컴파일러는 명시된 타입의 정보를 보고 Child의 method1을 호출해야 하는 것을 바로 알 수 있다.
이를 정적 바인딩이라고 한다.

동적 바인딩

public class Parent {
	void method1() { System.out.println("Parent"); }
}

public class Child {
	void method1() { System.out.println("Child"); }
}

public class Main {
	public static void main(String[] args) {
    	Parent parent = new Child();
        parent.method1();
    }
}

Child 객체를 생성하여 슈퍼 클래스인 Parent 타입의 변수에 할당해주었다. 컴파일러는 Parent의 method1와 Child의 method1 중에서 오버라이딩된 Child의 method1를 동적으로 호출한다.
이를 동적 바인딩이라고 한다.

사용하는 이유

오버로딩과 오버라이딩 모두 다형성을 구현하는데에 사용되는 중요한 기능이다.

0개의 댓글