Swift5.0 SE-0225 배수 구하기 isMultiple(of:)

안녕하세요~! 오늘은 isMultiple(of:)에 대해서 소개해 드리겠습니다.

isMultiple(of:)는 배수인지 판단하는 메서드입니다.

 

여기서 배수는 어떤 정수와 다른 정수를 곱했을 때 나오는 수입니다. 

예를 들어 6 = 2 * 3이므로 63의 배수입니다.

 

아래 코드 처럼 이전에는 % 연산자를 사용해서 배수를 판단하는 코드를 작성했었죠

그렇다면 isMultiple(of:)와 어떤 문제를 해결 할 수 있길래 애플에서 공식적으로 제공하고 있을까요?

let number = 6
if number % 3 == 0 {
    print("6은 3의배수")
}

 

 

첫 번째로, 0으로 나누는 상황을 볼 수 있는데요. number % 0 == 0 은 무조건 참 입니다.

number.isMultiple(of: 0)은 number가 0이면 , 아니라면 거짓입니다.

0.isMultiple(of: 0) // true
1.isMultiple(of: 0) // false

% 연산자로 배수 판단을 할 때, 0을 예외처리 하던 불편함을 해소할 수 있습니다.

 

두번째로 오버플로우에 대한 문제 인데요.

여기서 오버플로우는 '강물이 범람하다' 또는 '물이 흘러 넘치다' 라는 사전적 정의를 갖고 있습니다. 

컴퓨터에서는 정수 연산의 계산 결과가 허용 범위를 초과할 때 발생하는 오류 입니다.

예를 들어 컴퓨터의 메모리가 8비트의 데이터를 저장할 수 있다고 가정 했을때

2의 8승 즉 256까지 숫자를 표현할 수 있습니다.

이 이상의 숫자를 표현하게 되면 오버플로우가 발생했다 라고 표현합니다.

 

다시 본론으로 들어가 보겠습니다.

Int.min.isMultiple(of: -1)은 True입니다.

하지만 Int.min / -1은 오버플로우로 인해 컴파일 에러가 발생합니다.

컴파일러가 에러를 잡아주지만 사전에 에러 발생 가능성을 줄일 수 있습니다.

print(Int.min) // -9223372036854775808
print(Int.max) // 9223372036854775807
Int.min.isMultiple(of: -1)
Int.min / -1 // Division '-9223372036854775808 / -1' results in an overflow

 

아래 예제 코드와 같이 배수를 판단해서 위에서 언급한 2가지 이슈들에 대해 대응이 가능합니다.

 

let number = 6
if number.isMultiple(of: 3) {
    print("6은 3의 배수")
}

 

오늘은 여기까지 입니다. 감사합니다~!!

 

참조:

https://github.com/apple/swift-evolution/blob/main/proposals/0225-binaryinteger-iseven-isodd-ismultiple.md