Day19

피오·2021년 11월 25일
0
post-thumbnail

오버로딩

  • 메서드 오버로딩이란 같은 이름을 가진 메서드들을, 매개변수의 타입과 매개변수의 개수를 달리하여 선언하는 것이다.

public class OverLoad {
  public int add(int a, int b) {
    return a + b;
  }
  
  public int add(int a, int b, int c) {
    return a + b + c;
  }
  
  public double add(double a, double b) {
    return a + b;
  }
}

어느 클래스 안에 이름이 같은 메서드가 여러 개 오버로딩 되어있다 하더라도, 컴파일러가 컴파일 시점에 매개변수의 타입과 개수를 가지고 메서드 이름을 재정의한다.

ex)
add_int_int(int a, int b)
add_int_int_int(int a, int b, int c)
add_double_double(double a, double b)

우리가 보기에는 오버로딩된 메서드 이름이 다 같아보이지만, 컴파일러에게는 위와 같이 각각이 전혀 다른 메서드이다.

컴파일러가 각각 다른 메서드들이 호출될 것으로 매칭했기 때문에, 우리가 오버로딩된 메서드들을 호출하는 시점에는 어느 메서드를 호출했는지 일일이 구분하지 않는다.

이처럼 컴파일 시점에 어느 메서드를 호출하면 어느 메서드가 호출될 것이라고 바인딩이 되어 있기 때문에 오버로딩을 정적 바인딩이라고 부른다.



오버라이딩

  • 상속관계에서 상속받은 하위클래스가 상위 클래스의 동작을 수정하는 것
public class Animal {
  public void eat() {
    System.out.println("Animal eat");
  }
}

public class Dog extends Animal {
  @Override
  public void eat() {
    System.out.println("Dog eat");
  }
}

public class Cat extends Animal {
  @Override
  public void eat() {
    System.out.println("Cat eat");
  }
}

만약 Animal이라는 부모 클래스를 상속받은 자식 클래스의 행동(메서드)이 어떤 것이 있는 지 모르는 경우에, 부모 클래스가 어떤 행동을 할 수 있는지 아는 게 중요하다.

Animal dog = new Dog();
dog.eat(); // "Dog eat"

Dog클래스의 인스턴스를 받는 변수 타입이 Animal타입으로 선언되었다. 그럼에도 불구하고 dog.eat()을 호출하면 Animal 클래스의 eat()이 호출되지 않고 자식클래스인 Dog 클래스의 eat()이 호출되었다.

이는 부모 타입으로 업캐스팅된 인스턴스로 메서드를 호출할 때에는 항상 자식 클래스에 오버라이딩된 메서드가 있는지를 확인하고, 만약 오버라이딩 된 메서드가 존재한다면 그 메서드를 호출하기 때문이다.

즉 부모 클래스의 행동을 알면, 오버라이딩을 통해 하위 클래스에 접근하여 하위 클래스의 행동을 이끌어낼 수 있는 것이다.

그리고 오버라이딩의 이러한 동작원리를 보고 동적바인딩이라고 한다. 이는 호출될 메서드가 실행시점에 결정되는 바인딩방식이다.

오버라이딩은 프로그램의 속도가 떨어지는 원인이 될 수 있지만 이점이 더 많다.



회고

오늘 배운 것

  • 동적바인딩, 정적바인딩.
    오버로딩과 오버라이딩을 그냥 사용하기만 했었는데 컴파일시점에 어떤 일이 일어나며, 어떤 메서드가 실행될지를 결정하는 시점이 언제인지를 알게 되었다.

  • 부모타입으로 업캐스팅 된 변수의 메서드 호출 방식.
    지금까지 부모 클래스의 메서드가 실행되는 거라고 생각하고 있었다..



profile
블로그 이전했습니다. https://pzbg.tistory.com/

0개의 댓글