기본
⎮ 함수는 왜 쓸까?
1. 재사용 가능 : 한번 작성해두면 여러번 호출해서 쓸 수 있음
2. 가독성 향상 : 코드의 목적을 명확하게 함
3. 유지보수 용이 : 특정 기능을 수정할 때, 함수를 수정하면 전체 코드에 반영됨.
⎮ 반환값이 있는 함수
func multiply(a: Int, b: Int) -> Int {
return a * b
}
let result = multiply(a: 5, b: 3)
print(result)
// 15
⎮ 여러 개의 매개변수를 받는 함수
func introduce(name: String, age: Int) {
print("제 이름은 \(name)이고, 나이는 \(age)살입니다.")
}
introduce(name: "Tom", age: 25)
// 제 이름은 Tom이고, 나이는 25살입니다.
실습
⎮ 함수 실습하기
두 개의 정수를 입력받아 합을 반환하는 함수를 작성하세요.
함수 이름: addNumbers
매개변수: num1, num2 (정수)
반환값: 두 수의 합 (정수)
func addNumbers(num1: Int, num2: Int) -> Int {
return num1 + num2
}
let sum = addNumbers(num1: 10, num2: 26)
print(sum)
// 36
세 개의 점수를 입력받아 평균을 반환하는 함수를 작성하세요.
함수 이름: calculateAverage
매개변수: score1, score2, score3 (정수)
반환값: 평균 (실수)
func calculateAverage(score1: Int, score2: Int, score3: Int) -> Double {
return (score1 + score2 + score3) / 3
}
let scoreAverage = calculateAverage(score1: 95, score2: 84, score3: 77)
print(scoreAverage)
이렇게 작성을 하였는데 다음과 같은 에러가 발생했다.

⎮ 오류 해결 : 연산은 같은 Type끼리만 가능하다
Int Type의 반환 표현식을 Double Type으로 변환할 수 없다는 문제이다.
기본적으로 프로그램에서 연산은 같은 타입끼리만 할 수 있다.
(score1 + score2 + score3) / 3 은 정수끼리 나누는 연산이다.
따라서 함수에서 작성한 것처럼 Double이 나올 수 없어 에러가 발생한 것이다.
이를 해결하려면 (score1 + score2 + score3)을 Double Type으로 Type conversion 해줘야 한다.
func calculateAverage(score1: Int, score2: Int, score3: Int) -> Double {
return Double(score1 + score2 + score3) / 3.0
}
let scoreAverage = calculateAverage(score1: 95, score2: 84, score3: 77)
print(scoreAverage)
// 85.33333333
만약 여기서 소수점 첫째자리까지만 표현하고자 한다면
print문을 다음과 같이 수정하면 된다.
print(String(format: "%.1f", scoreAverage))
⎮ + 문자열 포매팅 문법
- 문자열 포매팅 : 포맷 코드로 문자열의 형식을 정해준 뒤 값을 넣는 것
1. 기본 문법
let formattedString = String(format: "형식 문자열", 값1, 값2, ...)
| 구 분 | 설 명 | 예 시 | 값 |
| %d | %i | 정수(int) | let age = 25 print(String(format: "%d", age)) |
25 |
| %f | 부동소수점(Float, Double) | let height = 171.19 print(String(format: "%f", height)) |
171.190000 |
| %.nf | 소수점 이하 n째 자리까지 표시(부동소수점) | let height = 171.19 print(String(format: "%.1f", height)) |
171.1 |
| %s | 문자열 | let name = "르탄" print(String(format: "%s", name)) |
르탄 |
| %x | %X | 16진수 | let num = 255 print(String(format: "%x", num)) |
ff |
| %e | 지수 표기법 | let number = 1234.567 print(String(format: "%e", number)) |
1.234567e+03 |
| %@ | 객체(주로 문자열이나 객체를 출력할 때) | let name = "르탄" print(String(format: "%@", name)) |
르탄 |
2. 예문
let name = "르탄"
let age = 25
let height = 175.567
let averageScore = 85.3333
let formattedString1 = String(format: "이름: %@", name)
let formattedString2 = String(format: "나이: %d", age)
let formattedString3 = String(format: "키: %.2f cm", height)
let formattedString4 = String(format: "평균 점수: %.1f", averageScore)
//이름: 르탄
//나이: 25
//키: 175.56cm
//평균 점수: 85.3
⎮ 구구단 만들기
특정 숫자를 입력하면 해당 숫자의 구구단을 출력하는 함수를 작성하세요.
함수 이름: printMultiplicationTable
매개변수: number (정수)
반환값: 없음 (출력만 수행)
//혼자 작성한 코드
var userInput = Int()
func gugudan() {
for num in 2 ... 9 {
for dan in 1 ... 9 {
print("\(num) x \(dan) = \(num * dan)")
}
}
}
func printMultiplicationTable(number: Int) {
}
문제를 읽고 userInput을 별도로 받고자 했고, 함수를 두번 사용해야하는 것으로 이해했다.
기초 뼈대를 작성했는데, 도무지 어떻게 해야할지 감이 오지 않았다.
어려운 문제인 것 같아 챗GPT를 통해 도움을 얻을 수 있었다.
var userInput = 0
func gugudan() {
for num in 2 ... 9 {
for dan in 1 ... 9 {
print("\(num) x \(dan) = \(num * dan)")
}
}
}
func printMultiplicationTable(number: Int) {
for dan in 1 ... 9 {
print("\(number) x \(dan) = \(number * dan)")
}
}
print("구구단을 출력할 숫자를 입력하세요: ", terminator: "")
if let input = readLine(), let number = Int(input) {
userInput = number
printMultiplicationTable(number: userInput)
} else {
print("잘못된 입력입니다. 숫자를 입력해 주세요.")
}
챗GPT는 다음과 같이 코드를 작성해주었는데, 내가 처음에 작성한 함수인 gugudan 함수는 아예 사용하지 않았다.
이를 통해, 구구단을 미리 작성하는 것은 의미가 없다는 것을 깨달았고, 코드를 분석하다가 힌트를 얻었다.
함수 사용(parameter 입력)에 초점이 맞춰진 이 과제에서는
어차피 함수의 parameter인 'number(숫자)'는 사용자가 입력하기 때문에 '단(dan)'만 for문으로 작성하면 된다는 점이다.
쉬운코드를 먼저 작성하고 난 뒤, 위의 코드를 뜯어보는 것은 아래에서 세부적으로 하도록 하자.
func printMultiplicationTable(number: Int) {
for i in 1...9 {
print("\(number) x \(i) = \(number * i)")
}
}
printMultiplicationTable(number: 3)
/*
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
*/
결국 오늘도 문제의 의도를 정확히 파악하는 게 얼마나 중요한 것인지 깨닫게 된다.
이제 학습을 위해 내 기준에서 어려운 코드를 뜯어보자.
⎮ 코드 뜯어보기
var userInput = 0
func printMultiplicationTable(number: Int) {
for dan in 1 ... 9 {
print("\(number) x \(dan) = \(number * dan)")
}
}
print("구구단을 출력할 숫자를 입력하세요: ", terminator: "")
if let input = readLine(), let number = Int(input) {
userInput = number
printMultiplicationTable(number: userInput)
} else {
print("잘못된 입력입니다. 숫자를 입력해 주세요.")
}
먼저 userInput의 값을 0으로 초기화한다.
var userInput = 0
함수를 작성한다.
func printMultiplicationTable(number: Int) {
for dan in 1 ... 9 {
print("\(number) x \(dan) = \(number * dan)")
}
}
print 함수를 통해 사용자 입력을 받는다. 여기서 terminator: ""은 사용자의 입력을 줄바꿈 없이 같은 줄에서 받기 위한 코드이다.
print("구구단을 출력할 숫자를 입력하세요: ", terminator: "")
if문의 코드를 분석해보자.
if let input = readLine(), let number = Int(input) {
userInput = number
printMultiplicationTable(number: userInput)
} else {
print("잘못된 입력입니다. 숫자를 입력해 주세요.")
}
input = readLine() 이 optional String Type이므로, optional Binding을 해준다.
그 후 String type이 된 input을 Int(input)으로 Type Conversion 해준다.
이때 number에 optional<Int>가 저장되기 때문에 얘도 optional Binding으로 처리해준다.
userInput을 number에 저장하고, 함수를 불러와 parameter에 userInput을 전달한다.
⎮ Terminator 이해하기
기본적으로 print 함수는 줄바꿈 문자(\n)를 포함하고 있다.
print("숫자를 입력해주세요: ")
// 숫자를 입력해주세요:
// (사용자가 입력하는 곳)
위의 코드는 "숫자를 입력해주세요: " 라는 문구를 출력하고, 사용자의 입력을 다음 줄에서 받는다.
이때, 사용자에게 더 직관적인 입력을 받으려면, terminator: "")를 추가하면 된다.
print("숫자를 입력해주세요: ", terminator: "")
// 숫자를 입력해주세요: (사용자가 입력하는 곳)
'스파르타코딩 클럽 > 사전 캠프' 카테고리의 다른 글
| 11. 스파르타 코딩클럽 [사전캠프 - Struct와 Class/Protocol] (1) | 2025.02.08 |
|---|---|
| 10. 스파르타 코딩클럽 [사전캠프 - 가위바위보 게임 만들기] (1) | 2025.02.07 |
| 8. 스파르타 코딩클럽 [사전캠프 - 함수의 선언과 사용 방법 이해하기] (0) | 2025.02.06 |
| 7. 스파르타 코딩클럽 [사전캠프 - 반복문 이해하기] (1) | 2025.02.05 |
| 6. 스파르타 코딩클럽 [사전캠프 - 조건문 이해하기] (0) | 2025.02.05 |