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)
이 연습 문제에서는 프리랜서가 고객과 특정 프로젝트의 가격에 대해 이야기할 수 있도록 돕는 코드를 작성해요. 고객을 위한 비용을 빠르게 계산하는 몇 가지 유틸리티 함수를 만들 거예요.
고객이 프리랜서에게 연락해 요금을 문의해요. 프리랜서는 하루에 8시간을 일한다고 설명해요. 그런데 프리랜서는 프로젝트의 시급만 알고 있어요. 시급이 주어졌을 때 일당을 추정할 수 있도록 도와줘요.
프리랜서의 시급을 담은 인자 hourlyRate를 받는 dailyRateFrom(hourlyRate:) 함수를 구현해요.
이 함수는 시급을 기준으로 일당을 반환해야 해요.
dailyRateFrom(hourlyRate: 60)
// Returns 480.0
반환되는 일당은 Double이어야 해요.
때로는 고객이 프리랜서를 더 오랜 기간 고용하는 데 관심을 보여요. 프리랜서는 고객에게 할인을 제공할 의향이 있지만, 고객이 최소 한 달 이상 고용할 때만 그래요. 한 달에는 총 **근무일 22일**이 있어요. 시급과, 정가에 적용하려는 할인율이 주어졌을 때 월당을 계산하도록 도와줘요. 결과는 가장 가까운 정수로 반올림해요.
프리랜서의 시급을 담은 hourlyRate와, 프리랜서가 고객에게 제공하려는 할인을 담은 withDiscount 인자를 받는 monthlyRateFrom(hourlyRate:withDiscount:) 함수를 구현해요.
이 함수는 가장 가까운 정수로 반올림한 월당을 반환해야 해요.
monthlyRateFrom(hourlyRate: 77, withDiscount: 10.5)
// Returns 12129
어느 날, 프로젝트 관리자가 프리랜서에게 고정 예산이 있는 프로젝트를 제안해요. 고정 예산과 프리랜서의 시급이 주어졌을 때, 예산이 모두 소진될 때까지 며칠을 일하게 되는지 계산하도록 도와줘요. 이 경우 프리랜서는 고용 기간과 상관없이 항상 할인을 제공할 의향이 있다는 점을 고려해요. 결과는 반드시 가장 가까운 정수로 내림해야 해요.
다음 인자들을 받는 workdaysIn(budget:hourlyRate:withDiscount:) 함수를 구현해요:
budget은 프로젝트의 예산을 담고 있어요.hourlyRate는 프리랜서의 시급을 담고 있어요.withDiscount는 프리랜서가 고객에게 제공하려는 할인을 담고 있어요.이 함수는 프리랜서가 프로젝트에서 일하게 될 근무일 수를 내림해서 반환해야 해요.
workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0
Exercism에 가입하고 Swift 트랙을 개념 35개연습 문제 116개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.