Burt.K

Awesome Discovery

[SE-0004] ++와 -- 연산자 제거

작성일 — 2025년 3월 8일

Table of Contents

++-- 연산자 제거

소개

Swift의 증가/감소 연산자는 C 언어에서 이어받은 기능으로, Swift 개발 초기에 추가되었다. 이 연산자들은 깊이 고려하지 않고 도입되었으며, 이후로도 별다른 검토 없이 남아 있었다. 이 문서에서는 이 연산자들을 다시 살펴보고, 결국에는 혼란을 초래하고 그만큼의 가치를 제공하지 못한다는 이유로 완전히 제거할 것을 권장한다.

간단히 복습해 보면, 이 연산자 계열에는 네 가지가 있다:

let a = ++x  // 전위 증가 - 뮤테이션 후 입력 값을 반환
let b = x++  // 후위 증가 - 뮤테이션 전 입력 값의 복사본을 반환
let c = --x  // 전위 감소 - 뮤테이션 후 입력 값을 반환
let d = x--  // 후위 감소 - 뮤테이션 전 입력 값의 복사본을 반환

그러나 이 연산자들의 결과 값은 자주 무시된다.

연산자의 장점

이 연산자들의 주요 장점은 표현력이다. 예를 들어 숫자 타입에서 x += 1이나 반복자와 같은 값에서 x.advance()와 같은 작업을 간단하게 표현할 수 있다. 반환 값이 필요한 경우, Swift의 += 연산자는 C와 달리 Void를 반환하기 때문에 인라인에서 사용할 수 없다.

Swift가 이러한 연산자 패밀리를 지원하는 두 번째 장점은 C와 C 확장 패밀리(C++, Objective-C, Java, C#, Javascript 등)의 다른 일반적인 언어들과의 연속성이다. 이러한 다른 언어에서 Swift로 넘어오는 사람들은 이 연산자들이 존재할 것이라고 합리적으로 기대할 수 있다. 하지만 Python과 같이 C 연산자의 대부분을 유지하면서도 이러한 연산자를 제외한 인기 있는 언어들도 있다.

이 연산자들의 단점

  1. 이 연산자들은 Swift를 처음 배우는 프로그래밍 언어로 선택한 경우, 또는 다른 언어에서 이러한 연산자를 이미 알고 있지 않은 경우 학습 부담을 증가시킨다.

  2. 표현력 측면에서 이점이 거의 없다. x++x += 1보다 크게 짧지 않다.

  3. Swift는 이미 C와 달리 =, += 및 기타 할당 연산이 Void를 반환한다(여러 가지 이유로). 이 연산자들은 그 모델과 일관성이 없다.

  4. Swift는 다른 언어에서 ++i를 사용하는 일반적인 이유를 제거하는 강력한 기능을 제공한다. 따라서 잘 작성된 Swift 코드에서는 이 연산자를 상대적으로 적게 사용한다. 이러한 기능에는 for-in 루프, 범위, enumerate, map 등이 포함된다.

  5. 이 연산자의 결과값을 실제로 사용하는 코드는 종종 코드를 읽거나 유지보수하는 사람에게 혼란스럽고 미묘하다. 이 연산자들은 “지나치게 까다로운” 코드를 유도하며, 이는 귀여울 수 있지만 이해하기 어렵다.

  6. Swift는 평가 순서가 잘 정의되어 있지만, foo(++a, a++)와 같이 평가 순서에 의존하는 코드는 잘 정의되어 있더라도 바람직하지 않다.

  7. 이 연산자들은 비교적 적은 타입에만 적용된다. 정수와 부동소수점 스칼라, 그리고 반복자와 유사한 개념에만 적용되며, 복소수나 행렬 등에는 적용되지 않는다.

마지막으로, “이 연산자들이 없었다면 Swift 3에 추가했을까?“라는 기준에서 이 연산자들은 통과하지 못한다.

제안하는 접근 방식

이 연산자를 완전히 제거해야 한다. 출시 측면에서 보면, Spring Swift 2.x 버전에서 이 연산자를 사용 중단(deprecate) 처리하고 (일반적인 경우를 다루는 Fixit 힌트를 함께 제공), Swift 3에서는 완전히 제거해야 한다.

고려했던 대안들

가장 단순한 대안은 현재 방식을 유지하는 것이다. 더 흥미로운 대안으로는, 이 연산자들이 Void를 반환하도록 변경하는 방법이 있다. 이 방법은 위에서 언급한 문제 중 일부를 해결하지만, 새로운 문제를 야기한다. 결과 값이 사라지면 전위와 후위 형태의 차이도 사라진다. 이 경우 다음과 같은 불편한 선택을 해야 한다:

  1. x++++x를 모두 언어에 유지하되, 둘이 동일한 기능을 수행하도록 한다.

  2. x++ 또는 ++x 중 하나를 제거한다. C++ 프로그래머들은 일반적으로 전위 형태를 선호하지만, 다른 프로그래머들은 후위 형태를 더 많이 사용한다. 둘 중 하나를 제거하는 것은 C 언어와의 상당한 차이를 만든다.

이러한 옵션을 신중히 고려했음에도 불구하고, 이 연산자들이 Swift에 추가하는 복잡성을 정당화하기에는 충분하지 않다.