-
5.1 오버로딩 - 메서드 오버로딩프로그래밍 언어 속 타입 2022. 5. 17. 14:54
이 글은 인사이트 출판사의 제안으로 작성 중인 책 『프로그래밍 언어 속 타입』 원고의 일부입니다.
함수 오버로딩을 이해했다면 메서드 오버로딩은 쉽다. 오버로딩의 대상이 함수에서 메서드로 바뀌었을 뿐이다. 메서드 오버로딩은 한 클래스에 이름이 같은 메서드를 여럿 정의하는 것을 말한다. 물론 이름이 같은 메서드들은 매개변수 타입이 서로 달라야 한다. 가령 스프레드시트 편집 프로그램에서 write를 Cell 클래스의 메서드로 다음처럼 구현할 수 있다.
class Cell { ... void write(String str) { ... } void write(Int num) { ... } }
오버로딩 여부에 상관없이 함수를 그냥 호출하면 되는 것처럼, 메서드 역시 오버로딩되었든 아니든 그냥 평소처럼 호출하면 된다.
Cell c1 = ...; Cell c2 = ...; c1.write("Hello"); c2.write(42);
그러면 메서드 선택method dispatch을 통해 실제로 호출될 메서드가 정해진다.
메서드 선택 규칙은 함수 선택 규칙과 거의 같다. (무엇이 다른지는 다음 절에서 보게 될 것이다.) 세 규칙 모두 그대로 적용된다. 인자의 타입에 맞는 메서드를 고르며, 이때 인자의 타입에 맞는 메서드가 여럿이면 가장 특화된 메서드를 고른다. 또한, 메서드를 고를 때는 인자의 정적 타입만을 고려한다. 그렇기에 메서드 오버로딩은 특화된 동작을 정의하는 데 함수 오버로딩만큼이나 별 도움이 되지 않는다. 물론 위의 예시가 보여 주듯, 전혀 다른 타입들의 값을 인자로 받고 싶을 때는 함수 오버로딩만큼이나 메서드 오버로딩도 유용하다.
자바
class Cell { void write(String str) { ... } void write(int num) { ... } } Cell c = new Cell(); c.write("Hello"); c.write(42);
C++
class Cell { public: void write(string str) { ... } void write(int num) { ... } }; Cell *c = new Cell(); c->write("Hello"); c->write(42);
C#
class Cell { public void write(string str) { ... } public void write(int num) { ... } } Cell c = new Cell(); c.write("Hello"); c.write(42);
코틀린
class Cell { fun write(str: String): Unit { ... } fun write(num: Int): Unit { ... } } val c: Cell = Cell() c.write("Hello") c.write(42)
스칼라
class Cell: def write(str: String): Unit = ... def write(num: Int): Unit = ... val c: Cell = Cell() c.write("Hello") c.write(42)
'프로그래밍 언어 속 타입' 카테고리의 다른 글
5.2 메서드 오버라이딩 - 메서드 선택의 한계 (0) 2022.05.17 5.2 메서드 오버라이딩 (0) 2022.05.17 5.1 오버로딩 - 가장 특화된 함수 (0) 2022.05.17 5.1 오버로딩 (0) 2022.05.17 4.3 가변성 - 사용할 때 가변성 지정하기 (0) 2022.05.16