연산자 오버로딩
C에서 *는 곱하기일까, 다른 무엇일까?
되짚기
+ 하나가 두 가지 덧셈을 합니다
+ 같은 연산자 하나에 뜻을 여러 개 주는 것이 연산자 오버로딩(operator overloading)입니다. 1강에서 본 말입니다. 정수 덧셈과 소수 덧셈은 컴퓨터 안에서 서로 다른 계산이지만 둘 다 +로 씁니다. 이 정도는 자연스럽습니다.
int는 정수, float는 소수점이 있는 수의 타입입니다. 숫자는 예시입니다.
문제가 되는 경우
C의 *는 다른 일 둘을 합니다
포인터는 메모리 칸의 위치를 담은 변수입니다. C와 C++에서 *는 곱하기이기도 하고, 포인터가 가리키는 칸의 값을 꺼내는 역참조(dereferencing)이기도 합니다. 서로 상관없는 두 일에 같은 기호를 씁니다.
포인터와 역참조는 5강에서 봤습니다. 숫자는 예시입니다.
잃는 것
빠뜨린 실수를 못 잡습니다
a를 빠뜨리고 x = * b라고 써도 컴파일러는 *를 역참조로 읽을 수 있어서 오류로 잡지 못합니다. *가 곱하기뿐이었다면 바로 잡혔을 실수입니다. 읽는 사람도 *를 볼 때마다 어느 뜻인지 따져야 합니다.
예시 코드입니다. b가 포인터라서 * b는 b가 가리키는 칸의 값입니다. 컴파일러는 소스를 기계어로 번역하는 프로그램입니다.
직접 정하는 오버로딩
잘 쓰면 식이 읽기 쉽습니다
C++, C#, F#에서는 프로그래머가 연산자의 뜻을 직접 정할 수 있습니다. 행렬 타입에 +를 정해 두면 메서드를 부르는 것보다 식이 자연스럽게 읽힙니다.
행렬은 수를 가로세로로 늘어놓은 것이고, 메서드는 객체에 딸린 함수입니다. 예시 코드입니다. Ruby에서는 연산자가 모두 메서드라서 프로그램이 다시 정할 수 있습니다.
지나치면
뜻 없는 연산도 만들어집니다
직원 객체끼리 곱하는 것처럼 뜻이 통하지 않는 연산도 정의할 수 있습니다. 뜻이 합리적이어도 읽는 사람은 그 연산자가 무슨 일을 하는지 매번 확인해야 합니다. 그만큼 가독성이 떨어질 수 있습니다.
가독성은 1강에서 본, 읽고 이해하기 쉬운 정도입니다. 예시입니다.
다음 편