Overloading, Overwriting and Polymorphism

Contents

  • Overloading
  • Overriding and Polymorphism

Overloading

메소드 이름과 매개변수 조합을 메소드 서명(signature)이라고 부른다. 메소드 서명은 유니크하며, 메소드 이름과 매개변수의 수, 타입, 매개변수의 순서 조합으로 구성된다. 그리고, 메소드의 반환값이나 파라미터명은 고려하지 않는다.

자바에서 한 클래스에 서명이 같은 메소드가 복수로 존재할 수 없다. 반면, 이름은 같지만 매개변수가 다른 메소드는 복수로 존재할 수 있는데, 이것을 메소드 오버로딩(overloading)이라고 한다. 메소드를 호출하게 되면, 자바는 복수의 메소드 중 매개변수 기반으로 적합한 메소드를 호출한다.

프로그래밍을 하며 오버로딩을 사용하기 적합하다고 판단될 때 사용하면 프로그래밍 상 편리함을 취할 수 있다. 여러 종류의 데이터 타입을 같은 이름의 메소드로 대응할 수 있기 때문에, 코딩 상 가독성이나 편리함이 있다. 또한, 우리가 만든 객체, 메소드를 사용하는 다른 프로그래머가 매개변수만 다르게 입력해서 사용하면 되기 때문에 해당 객체의 메소드를 사용하기에도 더 편리할 수 있다.

클래스 메소드에 오버로딩을 많이 사용하지만, 생성자도 타입별로 복수로 생성할 수 있어 타입에 따라 초기값을 설정할 수 있습니다.

위와 같이 매개변수 타입이 다른 생성자를 복수로 생성하고, 아래의 메인 함수에서 오버로딩 된 생성자 함수를 다르게 호출하고 터미널 출력을 확인해 볼 수 있습니다.

Overriding and Polymorphism

메소드 오버라이딩은 서브 클래스에서 슈퍼 클래스로부터 상속 받은 메소드의 몸체를 재정의 해 사용하는 것을 말한다. 오버라이딩을 할 때 몇 가지 지켜야 할 아래와 같은 조건이 있다.

  • 메소드의 서명이 같아야 한다.
  • 메소드의 접근제어자는 슈퍼 클래스의 것보다 좁은 범위로는 지정할 수 없다.
  • 슈퍼 클래스의 메소드보다 많은 예외를 선언할 수 없다.

오버라이딩도 오버로딩과 마찬가지로, 상황에 맞게 잘 활용하면 프로그래밍 상 여러 이점을 가질 수 있다. 다형성(Polymorphism)이 대표적인 특징이 될 수 있는데, 오버라이딩은 다형성을 이루는데 핵심적인 기능이다. 같은 슈퍼 클래스에서 상속 받은 메소드를 오버라이딩 하면, 각각의 서브 클래스에서 같은 메소드를 호출하지만 로직은 다르게 작동할 수 있도록 프로그래밍 할 수 있다. 이를 통해, generic하고 재사용성이 좋은 코드를 작성할 수 있다.

아래의 예시에서 먼너 슈퍼 클래스로 사용할 Product를 정희했다.

그리고 Product 클래스를 상속 받는 서브 클래스를 생성하고, getBillingItemName 메소드를 재정의 했다.

그리고, main 함수에서 각각의 서브클래스에서 오버라이딩한 함수를 호출할 수 있다.

같은 슈퍼 클래스를 상속 받았지만 getBillingItemName을 각각의 클래스에서 오버라이딩 해 사용하기 때문에, 아래와 같이 다르게 결과물이 출력되는 것을 확인할 수 있다.

만약 위와 같이 다형성을 지원되지 않는다면 아래와 같이 Product에서 분기를 추가해야 할 것이다.

Overloading vs Overriding

간단하게 Overloading과 Overriding의 차이는, 오버로딩은 기존에 없는 새 메소드를 생성하는 것이고, 오버라이딩은 상속받은 메소드의 본체를 재정의 하는 것을 말한다.