Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

상황에 따른 세밀한 제어

앞서 살펴본 overflow-checks 설정은 프로그램 전체에 영향을 미치는 다소 투박한 도구입니다. 하지만 실제 개발을 하다 보면, 어떤 상황에서는 래핑(Wrapping)이 정답이고, 또 어떤 때는 패닉(Panic)이 더 적절할 수 있습니다. 즉, 문맥에 따라 오버플로우를 다르게 처리하고 싶을 때가 많죠.

wrapping_ 메서드

특정 연산에서 오직 래핑 방식만 사용하고 싶다면 wrapping_ 메서드1를 쓰면 됩니다. 예를 들어 wrapping_add를 사용하면 다음과 같이 래핑 덧셈을 수행할 수 있습니다.

let x = 255u8;
let y = 1u8;
let sum = x.wrapping_add(y);
assert_eq!(sum, 0);

saturating_ 메서드

혹은 **포화 연산(Saturating arithmetic)**을 선택할 수도 있습니다. saturating_ 메서드를 사용하면 되는데요, 포화 연산은 값이 한계를 넘어섰을 때 다시 처음으로 돌아가는(래핑) 대신, 해당 타입의 최대값이나 최소값에서 멈추는 방식입니다.

예를 들어 다음과 같이 동작합니다.

let x = 255u8;
let y = 1u8;
let sum = x.saturating_add(y);
assert_eq!(sum, 255);

255 + 1은 원래 256이지만, u8 타입의 최대값인 255를 넘을 수 없으므로 결과는 255가 됩니다. 언더플로우의 경우도 마찬가지입니다. 0 - 1의 결과는 u8의 최소값인 0에서 멈추게 됩니다.

포화 연산은 프로필 설정(overflow-checks)으로는 지정할 수 없습니다. 따라서 포화 연산이 필요한 곳마다 직접 메서드를 호출해서 명시적으로 선택해 주어야 합니다.

Exercise

The exercise for this section is located in 02_basic_calculator/09_saturating


  1. 메서드(Method)는 특정 타입에 “연결된” 함수라고 생각하시면 됩니다. 메서드와 그 정의 방법은 다음 장에서 자세히 다룰 예정입니다.