Swift는 숫자를 크게 두 가지로 나눠요. 정수와 실수예요.
숫자 리터럴에 밑줄을 넣으면 읽기 쉬워져요. 1_000_000은 1000000과 같아요.
실수 리터럴은 소수점 표기법이나 지수 표기법으로 쓸 수 있어요.
대부분의 경우 정수에는 Int를, 실수에는 Double을 사용해요:
let speed: Int = 42 // Explicit Int
let pi: Double = 3.14 // Explicit Double
let giga: Double = 1_000_000_000 // Double with readability underscores
let plancksConstant: Double = 6.62607015e-34 // Double in scientific notation
Swift는 숫자 계산을 위한 표준 산술 연산자를 제공해요:
| Operator | Description | Example |
|---|---|---|
+ |
덧셈 |
4 + 6의 결과는 10이에요 |
- |
뺄셈 |
15 - 10의 결과는 5예요 |
* |
곱셈 |
2 * 3의 결과는 6이에요 |
Swift는 타입에 안전해서, 산술 연산에서 서로 다른 숫자 타입을 섞을 수 없어요.
Int와 Double을 바로 더하거나 곱할 수 없고, 먼저 한쪽 타입을 다른 쪽에 맞게 변환해야 해요.
/ 연산자는 나눗셈을 해요.
두 피연산자가 모두 정수이면, 정수 나눗셈은 소수 부분을 잘라내요:
5.0 / 2.0 // 2.5 (Double division)
5 / 2 // 2 (integer division truncates the remainder)
0이 아닌 실수를 0으로 나누면 inf 또는 -inf가 돼요.
0.0을 0.0으로 나누면 nan(Not a Number)이 돼요.
반대로 정수를 0으로 나누면 컴파일 시점이나 실행 시점에 오류가 발생해요:
print(5.0 / 0.0) // Prints inf
print(-5.0 / 0.0) // Prints -inf
print(0.0 / 0.0) // Prints nan
// The following line will not compile:
// print(5 / 0) // Error: Division by zero
나머지 연산자 (%)는 두 정수를 나눈 뒤 남는 나머지를 계산해요:
5 % 2 // 1
-5 % 2 // -1
// Dividing by zero produces an error:
// 5 % 0 // Error: Division by zero
Swift에서 %는 모듈로 연산자가 아니라 진짜 나머지 연산자예요.
결과는 두 번째 피연산자의 부호와 상관없이 항상 첫 번째 피연산자(피제수)의 부호를 따라요:
5 % -2 // 1
-5 % 2 // -1
rounded() 메서드로 실수를 반올림할 수 있어요.
기본적으로 rounded()는 가장 가까운 정수로 반올림해요.
.up이나 .down처럼 특정 반올림 규칙을 지정할 수도 있어요:
let x = 3.14
let y = x.rounded() // 3.0
let w = x.rounded(.down) // 3.0
let z = x.rounded(.up) // 4.0
타입 표기 없이 숫자 상수나 변수를 선언하면, Swift가 그 타입을 추론해요:
Int가 돼요.Double이 돼요.let x = 42 // Inferred as Int
let y = 42.0 // Inferred as Double
let z: Double = 42 // Explicitly typed as Double
서로 다른 타입의 값끼리 연산하려면, Double(_:)이나 Int(_:) 같은 타입 이니셜라이저로 한쪽 값을 변환해요:
let integerCount = 42
let floatingCount = Double(integerCount)
print(floatingCount) // Prints 42.0
let pi = 3.14
let integerPi = Int(pi)
print(integerPi) // Prints 3 (fractional part is truncated)
이 연습 문제에서는 프리랜서가 프로젝트 관리자와 소통할 수 있도록 돕는 코드를 작성해요. 이 과제에서는 일당과 월당을 빠르게 계산하는 몇 가지 유틸리티를 만들어요. 필요에 따라 주어진 할인을 적용할 수도 있어요.
먼저 프리랜서와 프로젝트 관리자 사이에 몇 가지 규칙을 정해요:
때로는 프리랜서가 일당에 할인을 적용하기도 해요 (가장 충성도 높은 고객이나 비영리 고객을 위해서요).
할인은 백분율을 나타내는 소수로 표현해요. 예를 들어 25.0은 25%예요.
매개변수로 시급이 주어졌을 때 일당을 계산하는 dailyRateFrom 함수를 구현해요.
계약상 하루는 청구 가능한 8시간이에요.
dailyRateFrom(hourlyRate: 60)
// Returns 480.0
반환되는 일당은 Double이어야 해요.
할인이 적용된 월당을 계산하는 monthlyRateFrom 함수를 구현해요.
이 함수는 시급과 백분율로 나타낸 할인, 두 가지 매개변수를 받아요.
monthlyRateFrom(hourlyRate: 77, withDiscount: 10.5)
// Returns 12129
반환되는 월당은 가장 가까운 정수로 올림해야 해요.
예산, 시급, 할인을 받아서 그 예산으로 며칠을 온전히 일할 수 있는지 계산하는 workdaysIn 함수를 구현해요.
workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0
반환되는 일수는 다음 정수로 내림해야 해요.
Exercism에 가입하고 Swift 트랙을 개념 35개연습 문제 116개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.