본문 바로가기

CS

[Java] Override와 Overload

Override와 Overload 를 설명해주실 수 있을까요?

Overload

  • 매개변수의 개수나 타입이 다르고 이름이 동일한 메소드들
  • 리턴 타입은 오버로딩과 관련 없다.

<메소드 오버로딩 성공 사례>

public class Override {
    public int getSum(int i, int j){
        return i+j;
    }
    public int getSum(int i, int j, int k){
        return i+j+k;
    }

}

메소드 이름이 동일하고 매개변수의 개수가 서로 다르기 때문에, 두 메소드는 한 클래스 내에서 공존하는데 문제 없다.

 

<메소드 오버로딩 실폐 사례>

public class Override {
    public double getSum(int i, int j, int k){
        return (double) i+j+k;
    }
    public int getSum(int i, int j, int k){
        return i+j+k;
    }

}

getSum() 메소드의 매개변수 개수와 타입이 모두 같다. 그로므로 이 두 메소드는 호출자의 입장에서 구분할 수 없기 때문에 컴파일 오류가 발생한다.

 

public class Main {
    public static void main(String[] args) {
        Override testOverride = new Override();

        int i = testOverride.getSum(1,2);
        int j = testOverride.getSum(1,2,3);
        double k = testOverride.getSum(1.1, 2.2);
    }
}
public class Override {
	// int i = testOverride.getSum(1,2);
    public int getSum(int i, int j){
        return i+j;
    }
    // double k = testOverride.getSum(1.1, 2.2);
    public double getSum(double i, double j){
        return (double) i+j;
    }
    // int j = testOverride.getSum(1,2,3);
    public int getSum(int i, int j, int k){
        return i+j+k;
    }

}

각각 변수들이 호출하는 메소드를 위에 주석으로 표시해두었다.

 

Override

  • 상속에서 주로 사용하고 슈퍼클래스의 메소드를 서브 클래스에서 재정의해서 사용
  • 슈퍼클래스의 메소드의 이름, 매개변수 타입 및 갯수, 리턴 타입 등 모든 것을 동일하게 작성
  • 런타임시 바인딩을 결정하여 다형성을 실현시킬 수 있다.

부모클래스

public class Shape {
    public void draw(){
        System.out.println("Shape");
    }
}

 

자식클래스

class Line extends Shape{
    public void draw(){
        System.out.println("Line");
    }
}

class Rect extends Shape{
    public void draw() {
        System.out.println("Rect");
    }
}

class Circle extends Shape{
    @java.lang.Override
    public void draw() {
        System.out.println("Circle");
    }
}

 

public static void main(String[] args) {
        Line line = new Line();
        line.draw();

        Shape line2 = new Line(); //업캐스팅
        line2.draw();
    }

line은 Line을 출력한다는 것을 알 수 있다.

line2은 무엇을 출력할까?

 

line2 역시 Line을 출력한다.

  • 컴파일러 할때 Shape 클래스에 draw() 멤버가 있는지 확인하고 Shape의 draw()을 호출하도록 컴파일한다.
  • 하지만, line2.draw()의 실행 시 line2이 가리키는 객체에는 Shape의 draw()를 오버라이딩한 Line의 draw()가 존재하기 때문에
  • Line의 draw()가 실행된다. 
  • 동적 바인딩(dynamic biniding)이라고 부른다.

 

결론
Overload은 매개변수의 갯수와 타입이 같고 이름이 같은 메소드들을 말하며
Override은 부모클래스에 있는 메소드를 자식클래스에서 매개변수, 리턴타입, 이름 그대로인 메소드를 재정의하는 것을 의미합니다. 컴파일시 동적바인딩을 하며 다형성을 실현시킬 수 있습니다.

 

'CS' 카테고리의 다른 글

JVM의 힙 & 스택 메모리  (0) 2023.12.14
[Java] 컴파일되는 과정  (0) 2023.12.13
[JPA] 더티 체킹(dirty checking) 정리  (0) 2023.12.11
JPA의 필요성  (0) 2023.12.09
Call by Value / Call by Reference  (0) 2023.12.07