이번 시간에는 Swift에서 함수에 대해서 간단히 알아보고 함수를 어떻게 사용하는지와 예시를 통해서 살펴보도록 하겠습니다.
함수란?
먼저 함수를 사용하려면 함수에 대해서 알아야겠죠? 프로그래밍을 배우신 분이라면 잘 알고 계실 겁니다. 다른 언어와 마찬가지로 Swift에서의 함수도 크게 다른 부분은 없습니다.
Swift에서 함수는 특정 작업을 수행하는 코드 블록으로 실행시 데이터를 제공해야 하거나, 함수를 호출한 코드에 작업한 결과를 반환할 수도 있습니다.
함수를 제대로 이해하려면 parameter(매개변수)와 argument(인수)의 차이점에 대해서 알아야 합니다. 쉽게 정리해보자면 함수 정의부의 값을 매개변수, 호출시의 값은 아규먼트라고 부릅니다.
func fun(param: Int) {
print(param) // 매개변수 값 출력
}
fun(param: 10) // 함수 호출과 함께 인자 전달
메서드(method)
메서드는 특정 클래스, 구조체, 열거형 내의 함수로, 함수를 클래스 내에 선언하면 메서드라고 부릅니다.
함수를 선언하는 방법
함수를 선언하는 방법을 이해하기 위해 함수의 구조에 대해서 소스로 살펴보겠습니다.
func <함수명> (<매개변수 이름>: <매개변수 타입>, <매개변수 이름>: <매개변수 타입>,... ) -> <반환값 타입> {
// 함수 코드
}
소스를 살펴보면서 각 키워드의 기능에 대해서 알아보겠습니다.
func : 함수라는 것을 스위프트 컴파일러에게 알려주는 키워드
함수명 : 함수에 할당되는 이름
매개변수 이름 : 함수 코드 내에서 참조되는 매개변수의 이름
매개변수 타입 : 함수에 전달되는 매개변수의 타입
반환값 타입 : 함수가 반환하는 결과에 대한 데이터 타입. 반환하지 않으면(Void) 반환값 타입(Void)과 ->는 생략 가능
함수의 구조에 대해서 알아봤으니 이제 예시와 함께 알아보겠습니다.
저는 Hello를 출력하는 함수를 한 번 만들어보겠습니다.
func sayHello() { //리턴값 없으면( -> Void ) 지정하지 않아도 됨
print("Hello")
}
이렇게 함수를 선언하면 해당 함수를 호출할 때마다 Hello라는 키워드가 출력되게 됩니다.
만약 하나의 문자열과 하나의 정수를 매개변수로 받아서 문자열을 반환한다면
func message(name: String, age: Int) -> String {
return("\(name) \(age)")
}
이렇게 소스를 만들면 되겠죠?
함수 정의와 호출
// 함수 정의
func functionName(parameter1: Type1, parameter2: Type2, ...) -> ReturnType {
// 함수 내부에서 수행할 작업들
return returnValue // 반환 값 (optional)
}
// 함수 호출
let result = functionName(argument1, argument2, ...)
함수를 호출할 때에는 함수 이름 뒤에 괄호를 열고 인자(argument)를 전달합니다. 전달되는 인자는 매개변수와 순서 및 타입이 일치해야 합니다. 필요한 경우 변수나 상수로 선언하여 인자로 전달할 수도 있습니다.
호출된 결과값은 필요한 변수나 상수에 할당하여 활용할 수 있습니다.
함수의 자료형
func add(x: Int, y: Int) -> Int {
return(x+y)
}
add(x:10, y:20)
위 소스는 Swift언어로 만든 함수입니다. 함수도 자료형을 가지고 있는데 위에서 add 함수는 과연 어떤 함수를 가지고 있을까요?
add 함수의 자료형을 알아보려면 add 함수를 type(of:)으로 감싸고 print()로 한 번 더 감싸면 됩니다. print(type(of:add)) 이렇게요.
add 함수의 자료형을 출력해보면 아래와 같은 결과가 나타나게 됩니다.
즉, (Int, Int) -> Int가 add 함수의 자료형이 되는 것이죠. (Int, Int) -> Int 함수의 자료형은 괄호 열고 매개변수의 자료형을 콤마(,)로 나열하고 괄호 닫고 리턴형을 쓰게 되어 있습니다.
내부 매개변수 이름과 외부 매개변수 이름
Swift에서는 함수의 매개변수에 대해 내부 매개변수 이름과 외부 매개변수 이름을 사용할 수 있습니다. 이 두 가지 이름은 함수를 호출할 때 인자를 전달하거나 함수 내부에서 해당 값을 참조할 때 사용됩니다.
- 내부 매개변수(Parameter Name): 함수 내부에서 해당 값을 참조하기 위해 사용되는 변수명입니다. 기본적으로 모든 매개변수는 내부 매개변수 이름을 가져야 합니다. 함수 내에서 해당 변수를 사용하여 작업을 수행하거나 값에 접근할 수 있습니다.
- 외부 매개변수(Argument Label): 함수를 호출할 때 인자를 전달하는 데 사용되는 레이블입니다. 외부 매개변수는 호출자가 어떤 값을 전달해야 하는지 명확하게 표시하기 위해 사용됩니다. 기본적으로 외부 매개변수와 내부 매개변수의 이름은 동일합니다.
함수 정의 시에 각각의 역할과 목적에 따라서 내부와 외부 매개변수 이름을 다르게 지정할 수도 있습니다. 이렇게 하면 함수 호출 시에 가독성이 좋아지고, 의도가 명확해진다는 장점이 있습니다.
*만약 외부 매개변수명을 생랴하면 내부 매개변수명이 외부 매개변수명까지 겸한다는 특징이 있습니다.
소스 코드를 보면서 살펴보겠습니다.
func greet(personName name: String, from city: String) {
print("안녕하세요! \(city)에서 온 \(name)님!")
}
greet(personName: "Purple", from: "Seoul")
위의 소스 코드에서 greet라는 함수가 정의되었습니다. 이 함수는 personName과 from이라는 외부 매개변수 이름을 가진 두 개의 문자열 타입 인자를 받습니다.
함수 정의 시에 각각의 외부 매개변수 앞에 내용: 형식으로 지정하여 각각 다른 외부 레이블을 부여했습니다. 이렇게 함으로써, 함수를 호출할 때 인자로 전달하는 값들이 어떻게 해석되어야 하는지 명확하게 알 수 있습니다.
함수 호출 시에는 greet(personName: "Purple", from: "Seoul")와 같이 각각의 외부 레이블과 함께 값을 전달합니다.
컴파일을 해보면 "안녕하세요! Seoul에서 온 Purple님!" 이렇게 출력이 되겠죠?
위 소스는 함수를 사용하는 4가지 방법을 모아둔 소스입니다.
위 사진에 있는 소스 코드에서 and 함수의 타입은 무엇일까요?
아까 배운 것처럼 이것 역시 print(type(of:add)) 이렇게 출력을 해보면 해당 함수의 자료형이 나오게 됩니다.
(저는 이해를 돕기 위해 위 소스에서 살짝 변형해서 했으니 참고하시길 바랍니다.)
위 소스에서 add 함수들의 자료형은 모두 (Int, Int) -> Int로 출력 되는 것을 확인할 수 있습니다. 즉, add 1, 2, 3의 자료형은 모두 같을 것을 알 수 있죠. 그리고 각 add 함수별로 코드 스타일은 다르지만 실행에는 아무 문제 없기에 모두 사용할 수 있지만 주로 add3과 같은 방법을 선호한다고 합니다.
이번 시간에는 함수의 개념과 사용하는 방법에 대해서 알아보고 소스와 함께 살펴보았습니다. 함수와 관련된 다른 내용은 곧 정리해서 올리도록 하겠습니다!
감사합니다.
틀린 부분이 있거나 더 좋은 내용 훈수 환영합니다!
공감과 댓글 부탁드립니다.
'Apple > Swift' 카테고리의 다른 글
[Swift] 델리게이트 패턴(Delegate Pattern) (2) | 2023.10.08 |
---|---|
[Swift] 지연 저장 프로퍼티(Lazy Stored Properties) (0) | 2023.10.05 |
[Swift] 제어문과 다양한 예제 정리 (0) | 2023.09.26 |
[Swift] 업캐스팅과 다운캐스팅, Swift와 Kotlin 옵셔널의 차이 (0) | 2023.09.25 |
[Swift] 옵셔널과 Nil합병 연산자 (0) | 2023.09.23 |