func 키워드를 사용하여 함수를 만들고, 어떻게 동작할 것인지 정의// 1. 함수 정의
func sayHello() {
print("Hello, Swift!")
}
// 2. 함수 호출
sayHello() // Hello, Swift!
func 함수이름(파라미터: 파라미터타입) -> 반환타입 {
// 실행할 코드
return 결과값
}
Void 또는 () 사용)return: 결과를 반환할 때 사용 (반환 타입이 Void인 경우 생략 가능)()를 사용한다// 함수 정의
func sayHello() {
print("Hello, Swift!")
}
// 함수 호출
sayHello() // Hello, Swift!
// 함수 정의
func greet(name: String) {
print("안녕하세요, \(name)님!")
}
// 함수 호출
greet(name: "지수") // 안녕하세요, 지수님!
// 함수 정의: 두 개의 정수를 받아서 더한 값을 반환
func add(a: Int, b: Int) -> Int {
var c = a + b
return c // 아웃풋이 있는 경우, return 키워드를 사용해야 한다
}
// 함수 호출: 호출할 때는 add(a: 3, b: 5)처럼 파라미터 값(Argument)을 전달
let result = add(a: 3, b: 5)
print(result) // 8
| 용어 | 설명 |
|---|---|
| Parameter(파라미터) | 함수를 정의할 때 입력을 받을 변수 |
| Argument(아규먼트) | 함수를 호출할 때 실제로 전달하는 값 |
즉, 파라미터는 함수 선언 시 정의되는 변수, 아규먼트는 함수 호출 시 전달하는 실제 값이다
// 함수 정의 (파라미터: "name")
func greet(name: String) {
print("안녕하세요, \(name)님!")
}
// 함수 호출 (아규먼트: "Royce")
greet(name: "Royce")
// 실행 결과
안녕하세요, Royce님!
name: String -> 파라미터(Parameter) (함수를 정의할 때 사용)"Royce" -> 아규먼트(Argument) (함수를 호출할 때 전달하는 값)func add(a: Int, b: Int) -> Int {
return a + b
}
let result = add(a: 3, b: 5) // 아규먼트: 3, 5
print(result) // 8
a: Int, b: Int -> 두 개의 파라미터add(a: 3, b: 5) -> 아규먼트: 3, 5 전달func introduce(name: String, age: Int = 20) {
print("이름: \(name), 나이: \(age)")
}
// 기본값을 사용하여 age 생략 가능
introduce(name: "Royce") // 이름: Royce, 나이: 20
introduce(name: "Steve", age: 25) // 이름: Steve, 나이: 25
age: Int = 20 -> 기본값 20을 설정introduce(name: "Royce") 처럼 호출 시 age를 생략하면 기본값 20이 사용된다func sum(numbers: Int...) -> Int {
var total = 0
for num in numbers {
total += num
}
return total
}
print(sum(numbers: 1, 2, 3, 4, 5)) // 15
number: Int... -> 여러 개의 Int 값을 받을 수 있다sum(numbers: 1, 2, 3, 4, 5) 처럼 여러 개의 아규먼트를 전달할 수 있다func greetUser(to name: String) {
print("안녕하세요, \(name)님!")
}
// 함수 호출 시 "to"를 사용
greetUser(to: "Royce") // 호출 방식
to -> 아규먼트 레이블name: String -> 파라미터 이름greetUser(to: "Royce") 처럼 더 자연스러운 문장 구조로 만들 수 있다_ 사용(와일드 카드 패턴))_ 를 사용해 생략할 수 있다func greetUser(_ name: String) {
print("안녕하세요, \(name)님!")
}
greetUser("Royce") // 호출 방식
_ name: String 처럼 _ 를 사용하면 함수 오출 시 "Royce"만 전달하면 된다func calculateSum(of a: Int, and b: Int) -> Int {
return a + b
}
let total = calculateSum(of: 3, and: 5) // 호출 방식
print(total) // 8
of a: Int, and b: Intof, and -> 아규먼트 레이블 (함수 호출 시 사용)a, b -> 파라미터 (함수 내부에서 사용)func someAdd(a: Int) -> Int { // 여기서 파라미터 a는 let a: Int로 선언된 것과 동일하므로 값의 변경이 불가능하다
a += 1 // 따라서 이와 같이 변수처럼 사용할 수 없다
return a
}
someAdd(a: 5)
func sumOfNum(a: Int) -> Int {
var sum = 0
sum += a
return sum
}
sum = 10 // 이와 같이 함수 바깥에서 함수 내에서 정의한 sum의 값을 변경하는 것은 불가능하다
sumOfNum(a: 3)
return 키워드의 정확한 이해return 키워드의 역할return키워드 다음의 표현식을 평가한 다음, 그 결과를 리턴하면서 함수를 벗어난다// 리턴 타입이 있는 경우
func addFunction(num1: Int, num2: Int) -> Int {
var result = num1 + num2
return result
}
addFunction(num1: 3, num2: 4)
// 리턴 타입이 있는 경우
func valuationFuncton(num: Int) -> Int {
if num >= 5 {
return num
}
return 0
}
valuationFunction(num: 3)
valuatonFunction(num: 5)
// 리턴 타입이 없는 경우
func numberPrint(n num: Int) {
if num >= 5 {
print("숫자가 5 이상입니다.")
return // 리턴 타입이 없으므로 함수의 실행을 중지하고 함수를 벗어난다는 의미이다
}
print("숫자가 5 미만 입니다.")
}
numberPrint(n: 4)
numberPrint(n: 5)
func chooseStepFunction(backward: Bool, value: Int) -> Int {
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
if backward {
return stepBackward(input: value)
} else {
return stepForward(input: value)
}
}
var value = 7
// case1
chooseStepFunction(backward: true, value: value)
// case2
chooseStepFunction(backward: false, value: value)
()를 삭제func doSomething() {
print("출력")
}
doSomething // 함수 호출
numberPrint(n:) // numberPrint n 함수이다
chooseStepFunction(backward:value:)
addPrintFunction(_:_:)
(파라미터 타입) -> 반환 타입
// 예를 들어
func add(a: Int, b: Int) -> Int
// 는 아래처럼 함수 타입을 가진다
(Int, Int) -> Int
func multiply(a: Int, b: Int) -> Int {
return a * b
}
// 함수 타입을 변수에 저장
var mathFunction: (Int, Int) -> Int = multiply
// 변수로 함수 호출 가능
print(mathFunction(3, 4)) // 12
multiply 함수는 (Int, Int) -> Int 타입mathFunction 변수에 할당하여 함수처럼 호출 가능func applyFunction(_ operation: (Int, Int) -> Int, a: Int, b: Int) -> Int {
return operation(a, b)
}
// 함수 호출 시 다른 함수를 전달
print(applyFunction(multiply, a: 3, b: 4)) // 12
applyFunction 함수는 operation 이라는 함수를 파라미터로 받는다applyFunction(multiply, a: 3, b: 4) 처럼 다른 함수를 전달 가능하다func chooseOperation(isAdd: Bool) -> (Int, Int) -> Int {
func add(a: Int, b: Int) -> Int { return a + b }
func multiply(a: Int, b: Int) -> Int { return a * b }
return isAdd ? add : multiply
}
// add를 반환받음
let operation = chooseOperation(isAdd: true)
print(operation(3, 4)) // 7
chooseOperation 함수는 다른 함수를 반환하는 함수isAdd: true 면 add 함수를 반환, false 면 multiply 반환※ 단, 반환타입만 다르면 오버로딩이 불가능하다!
func greet() {
print("안녕하세요!")
}
func greet(name: String) {
print("안녕하세요, \(name)님!")
}
// 함수 호출
greet() // 안녕하세요!
greet(name: "Royce") // 안녕하세요, Royce님!
greet() -> 파라미터가 없음greet(name: String) -> 파라미터가 하나 있음greet() 이름이지만, 파라미터 개수가 다르므로 오버로딩 가능 ✅func printValue(value: Int) {
print("정수 값: \(value)")
}
func printValue(value: String) {
print("문자열 값: \(value)")
}
// 함수 호출
printValue(value: 10) // 정수 값: 10
printValue(value: "Hello") // 문자열 값: Hello
printValue(value: Int) -> 정수를 받음printValue(value: String) -> 문자열을 받음func describe(person name: String) {
print("이 사람의 이름은 \(name)입니다.")
}
func describe(job name: String) {
print("이 직업의 이름은 \(name)입니다.")
}
// 함수 호출
describe(person: "Royce") // 이 사람의 이름은 Royce입니다.
describe(job: "개발자") // 이 직업의 이름은 개발자입니다.
description(person name: String) -> 아규먼트 레이블이 persondescription(jop name: String) -> 아규먼트 레이블이 jobfunc getNumber() -> Int {
return 10
}
func getNumber() -> Double {
return 10.5
}
// ❌ 컴파일 에러 발생: "Invalid redeclaration of 'getNumber()'"
getNumber()만 사용하면 Swift가 어떤 함수를 실행할지 모호해지기 때문func square(_ value: Int) -> Int {
return value * value
}
func square(_ value: Double) -> Double {
return value * value
}
// 함수 호출
print(square(4)) // 16 (Int)
print(square(3.5)) // 12.25 (Double)
square(Int) 와 square(Double) 을 따로 정의하면 같은 함수 이름을 유지하면서도 다른 타입 지원 가능func introduce(name: String, age: Int = 20) {
print("이름: \(name), 나이: \(age)")
}
func introduce(name: String) {
print("이름: \(name)")
}
// 함수 호출
introduce(name: "Royce") // introduce(name: String) 실행
introduce(name: "Steve", age: 25) // introduce(name: String, age: Int) 실행
introduce(name: String) 함수가 존재하므로, introduce(name: "Royce") 호출 시 기본값이 설정된 함수 (age: Int = 20) 가 아니라 단순한 name 만 받는 함수가 실행된다