[F-Lab 모각코 챌린지] 22일차 - 오버로딩은 왜 다형성이 아닐까

F-Lab 모각코 챌린지 21일차. 오버로딩은 왜 다형성이 아닐까? 에 대한 내용을 정리하였습니다 다형성 부정 파 와 긍정 파 의 각각의 의견을 제시 하였으며, 이들의 논리를 통해 '다형성' 이 무엇인지 에 대해 고민하고 스스로 답을 내리도록 유도하였습니다. 반박시 여러분들 말이 맞다.

[F-Lab 모각코 챌린지] 22일차 - 오버로딩은 왜 다형성이 아닐까

Java 개발자 중 '다형성' 에 대해 깊이있게 생각 해 본 일부 개발자는 말한다

💡
오버로딩은 다형성이 아니다.

이 말을 들은 '다른 의견을 가진 사람' 들은 이렇게 생각한다

Java 에서는 '다형성' 을 지원하기 위해 Overload 와 Override 가 있다

국내에 존재하는 이러한 주장을 하는 사람들은 명확한 근거가 있는데, 그것은 바로 '책' 이다

책에서는 다형성의 방법으로 '오버로딩' 과 '오버라이딩' 을 제시하고 있다

그런데 왜 일부 개발자는 '오버로딩은 다형성이 아니다' 라고 말을 하는걸까?

다형성이란?

가장 주된 논쟁거리가 바로 '다형성 이 무엇인가?' 이다

다형성이라는 말은 이렇게 표현될 수 있다

유형 A 가 다른 유형B 처럼 표현되고 사용될 수 있는 능력
(혹은, "형태 A 가 다른 형태 B 처럼 표현되고 사용될 수 있는 능력)

유형이란?
"성질이나 특징 따위가 공통적인 것끼리 묶은 하나의 틀. 또는 그 틀에 속하는 것"
-by 위키피디아

형태란?
1. 사물의 생김새나 모양
2. 어떠한 구조나 전체를 이루고 있는 구성체가 일정하게 갖추고 있는 모양.
3. (심리) 부분이 모여서 된 전체가 아니라, 완전한 구조와 전체성을 지닌 통합된 전체로서의 형상과 상태.
-by 네이버 사전-표준 국어 대사전

'다형성이 아니다' 라고 주장하는 사람들의 말

이 사람들은 이렇게 말한다

"유형은 class 이다."

객체지향을 공부 한 사람들은 위 말이 어떤 말인지 쉽게 이해할 수 있을 것이다
(이애하기 쉽게 정의하자면 객체란, '현존하는 어떠한 대상의 특징이나 성질을 추상화한 것' 이다)

그럼 위의 '다형성' 에 대한 설명을 아래와 같이 풀이할 수 있다

Class A 가 다른 Class B 처럼 표현되고 사용될 수 있는 능력

와닿는가?

이 설명에서는 '유형' 을 'Class' 라고 단정하고 있다.

그렇기 때문에 '재정의(Override)' 만이 '다형성' 이라고 말하고 있다.

좀 더 쉽게 코드로 이야기 해보자면 이렇다

public class Animal {
  public String name;
  
  public Animal(String name) {
    this.name = name;
  }
  
  public void showName() {
    System.out.printf("My name is %s", this.name);
  }
}

public class Cat extends Animal {
  
  public Cat(String name) {
    super(name);
  }
  
  public void showName() {
    System.out.printf("Meow Meow Meowwww(My name is %s)", this.name);
  }
}
// psvm(public static void main) 생략

// Class A 가 다른 Class B 처럼 표현되고
Animal persianCat = new Cat("Pollra");

// 사용될 수 있는 능력
persianCat.showName();

이처럼 '오버라이딩' 은 위의 설명을 충족하게 된다

하지만 이들의 관점에서 '오버로딩' 은 어떻게 될까?

간단히 말하자면 이렇다

'메서드 시그니쳐' 가 '유형' 이나 '형태' 혹은 그와 비슷한 말로 표현되는 대상이  될 수 없으므로 '다형성'이 성립될 수 없다

생각해보자. Overload 은 정말 '다형성' 일까?

'Overlode 는 다형성이다' 라고 주장하는 사람들의 말

이들의 주장은 다음과 같은 키워드를 포함한다

  • 정적 다형성
  • 동적 다형성
  • 시그니쳐는 유형이다

정적 다형성과 동적 다형성은 논쟁의 중심이 되는 용어는 아니지만, 다형성에 대한 논의에서 자주 나올 수 있는 용어이기에 포함하였다.

시그니쳐는 유형이다

이 말을 살펴보자

위에서 설명했듯, 유형은 이렇게 설명 할 수 있다

유형이란?
"성질이나 특징 따위가 공통적인 것끼리 묶은 하나의 틀. 또는 그 틀에 속하는 것"
-by 위키피디아

객체의 성질이나 특징을 표현한 것은 클래스이다.

하지만 클래스의 성질이나 특징을 묘사하여 외부로 표현하는 것은 '시그니쳐' 라는 것이다.

코드로 확인해보자

public class PrintStream { // extends, implements 생략
  ...
  public void println(boolean x) { ... }
  public void println(char x) { ... }
  public void println(int x) { ... }
  public void println(long x) { ... }
  ...
}
// psvm(public static void main) 생략

// 시그니쳐 A 가 다른 시그니쳐 B 처럼 표현되고 사용될 수 있는 능력
System.out.println(1);
System.out.println('A');
System.out.println(true);
System.out.println(1L);

이렇게 설명하면 "'다형성 아니다' 파" 가 이렇게 말 할 것이다.

"애초에 저건 각각의 다른 함수들이잖아? 그럼 어떠한 '유형' 으로 정의될 수 없을텐데? 그렇기 때문에 이건 유형이 아니야.'


여기서 좀 더 들어가면 '형태' 를 객체로서 바라볼 것이냐, 런타임 시 교체될 수 있는 대상으로 바라 볼 것이냐, 유형은 어떤 의미로 해석될 수 있느냐 에 대한 고찰로 넘어간다.

하지만 그 논의는 필자가 적는 이 글의 표현하는 목적에서 필요 이상의 지식을 표현하게 되니, 따로 적지는 않겠다.

자세한 내용은 "Is Method Overload considered polymorphism?" 이라고 구글에 검색하면 나오는 stackoverflow 와 위키피디아 에서 살펴볼 수 있다.


마무리

사실 Overload 가 다형성이냐, 아니냐 는 개발하는데 전혀 중요하지 않다

다형성이라는 사실을 알아서 어떠한 성능적 이점을 얻을 수 있는 것도 아니고 대단한 통찰력으로 이 논쟁을 끝맺을 수 있더라도 얻는 것은 크지 않다.

이 글을 보고 다형성에 대한 스스로의 정의를 고민해보면 좋겠다.

나는 물론 "'다형성이 아니다' 파" 이지만, 반박시 여러분들의 말이 맞다.