함수(Function)
- 프로그램의 실행 과정 중에서 독립적으로 처리될 수 있는 부분을 분리하여 구조화한 객체
- 외부에 의존하는 부분없이 툭 떼어 분리할 수 있는 실행 단위를 일종의 캡슐처럼 포장
함수의 인자값과 반환값
- 인자값 : 하나도 없을 수도 있고, 하나 이상일 수도 있음
- 반환값 : 특정값을 반환하는 형태와 값이 없는 형태
- 특정 값을 반환하더라도 그 값의 갯수는 일반적으로 하나
- 둘 이상의 값을 반환해야 할 필요가 있다면 반환할 값들을 집단 자료형 하나에 담아 반환해야 함
→ 반환하는 값이 여러 개더라도, 반환하는 단위는 하나
함수 : 일반함수, 사용자 정의 함수
일반함수 : 프로그래밍 언어나 프레임워크 수준에서 제공하는 함수, 기본적인 데이터의 처리나 연산 등을 수행하기 위한 목적
- 예) print()
사용자 정의 함수
- 언어나 프레임워크가 제공하는 함수만으로 충분하지 않는 경우가 많음 → 원하는 기능을 실행해 줄 함수를 직접 만들어 사용
함수의 이점
- 동일한 코드가 여러 곳에서 사용될 때 이를 함수화하면 재작성할 필요 없이 함수 호출만으로 처리할 수 있음
- 전체 프로세스를 하나의 소스 코드에서 연속적으로 작성하는 것보다 기능 단위로 함수화하면 가독성이 좋아지고, 코드와 로직을 이해하기 쉬움
- 비즈니스 로직을 변경해야 할 때 함수 내부만 수정하면 되므로 유지보수가 용이함
사용자 정의 함수
func 함수이름(매개변수1: 타입, 매개변수2: 타입, ...) -> 반환 타입 {
실행내용
return 반환값
}
// 매개변수(Parameter)가 생략된 함수
func 함수이름() -> 반환 타입 {
실행내용
return 반환값
}
// 반환값이 전혀 없는 함수, void 타입을 반환
func 함수이름(매개변수1: 타입, 매개변수2: 타입, ...) {
실행내용
}
- 함수의 이름 : +, -, *, / 와 같은 연산자나 예약어 사용 불가, 첫 글자는 반드시 영어 또는 _(언더바)로 시작
- 함수명은 함수의 기능을 명확하게 드러낼 수 있도록 짓기
- 매개변수 : 함수가 호출될 때 전달되는 입력값을 대입받기 위한 변수
- 반환 타입 : 함수 내부에서 생성된 값을 외부로 전달할 때의 타입
- 반환 타입이 지정되면 반드시 그 타입에 맞는 값을 반환해야 함
- 예) 반환 타입 : Optional → 반환 : nil(O), "Hello"(X)
- void : 반환값이 전혀 없는 함수
- return
- 함수 내부에 작성된 구문이 모두 실행되고 나면 처리 결과값을 반환 → return
- 함수는 값을 반환하고 나면 실행이 종료되므로 사실상 return 구문이 함수의 종료 구문
함수를 실제로 정의하는 모습
// 1. 매개변수와 반환값이 모두 없는 함수
// () : 매개변수를 선언하기 위한 영역 표시 기호
func printHello() {
print("안녕하세요")
}
// 2. 매개변수가 없지만 반환값이 있는 함수
func sayHello() -> String {
let returnValue = "안녕하세요"
return returnValue
}
// 3. 매개변수는 있으나 반환값이 없는 함수
func printHelloWithName(name: String) {
print("\(name)님, 안녕하세요")
}
// 4. 매개변수와 반환값이 모두 있는 함수
func sayHelloWithName(name: String) -> String {
let returnValue = "\(name)님, 안녕하세요"
return returnValue
}
- return 키워드에 의해 반환되는 값은 함수의 정의 부분에서 사용된 반환 타입과 일치해야 함
- 예) returnValue → String으로 반환되어야 함
- 반환값이 없는 함수일 경우에도 return 키워드를 사용하는 경우 → return 함수의 실행을 명시적으로 종료할 목적
- 옵셔널 바인딩이 실패했을 경우 return 구문을 호출하여 실행을 종료
func hello(name: String?) {
guard let _name = name else {
return
}
print("\(_name)님, 안녕하세요!")
}
함수의 호출
- 함수를 실행하는 것
printHello()
// () : 함수 호출 연산자
- 매개변수를 가지고 있는 함수를 호출할 때는 괄호 안에 인자값을 넣어서 호출해야 함
- 인자값은 앞에서 정의된 매개변수 타입과 일치해야 함
// 3번 함수 호출
let inputName = "홍길동"
printHelloWithName(name: inputName)
// 홍길동님, 안녕하세요
printHelloWithName(name: "홍길동")
// Literal : 인자값으로 변수나 상수 대신 넣어주는 실제 값
- 인자 레이블
- 함수 호출 시 인자값을 구분하기 위해 사용되는 레이블
- 스위프트에서 인자값이 잇는 함수를 호출할 때에는 인자값 앞에 인자 레이블을 붙여서 호출해야 함 (if X → 컴파일 오류)
예) name:
- 일반적으로 인자 레이블은 매개변수명과 동일
func incrementBy(amount: Int, numberOfTimes: Int) {
var count = 0
count = amount * numberOfTimes
}
// 함수 호출
incrementBy(amount: 5, numberOfTimes: 2)
// 매개변수명이자 동시에 인자 레이블로 간주
함수의 반환값과 튜플
- 함수는 반드시 하나의 값만을 반환
- 여러 개의 값을 반환해야 한다면, 해당 값들을 집단 자료형에 담아 반환해야 함
- 집단 자료형 : 딕셔너리, 배열, 튜플, 구조체, 클래스
// 함수의 반환 타입을 튜플 형태로 정의
func getIndvInfo() -> (Int, String) {
let height = 180
let name = "도마토"
return(height, name)
// 선언된 타입과 동일한 튜플 반환
}
func getUserInfo() -> (Int, Character, String) {
let gender: Character = "W"
// String으로 타입 추론 되는 것을 예방하기 위해 타입 어노테이션 선언
let height = 180
let name = "도마토"
return (height, gender, name)
}
// 튜플을 반환하는 함수의 반환값을 대입받은 변수나 상수는 튜플 인덱스를 이용, 튜플 내부 요소 사용 가능
var uInfo = getUserInfo()
uInfo.0 // 180
uInfo.1 // "W"
uInfo.2 // "도마토"
// 튜플 요소 각각을 변수로 직접 받을 수도 있음
var (a, b, c) = getUserInfo()
a // 180
b // "W"
c // "도마토"
// 필요하지 않은 튜플 항목은 언더바를 이용하면 변수 할당 없이 건너뛸 수 있음
var (height, _, name) = getUserInfo()
// 반환값 설정시 튜플 항목 하나하나에 미리 변수 정의할 수도 있음
func getUserInfo() -> (h: Int, g: Character, n: String) {
let gender: Character = "W"
// String으로 타입 추론 되는 것을 예방하기 위해 타입 어노테이션 선언
let height = 180
let name = "도마토"
return (height, gender, name)
}
// 튜플 인자 타입 앞에 각각의 변수를 붙여 주면,
// 함수의 결과값을 받은 변수에도 자동으로 바인딩
var result = getUserInfo()
result.h // 180
result.g // "W"
result.n // "도마토"
<참조> _ 를 이용하지 않고 임의로 변수 할당을 건너뛰면?
- 특정 튜플 타입이 여러 곳에서 사용될 경우 typealias를 통해 새로운 축약형 타입 정의
typealias <새로운 타입 이름> = <타입 표현>
typealias
- 이름이 길거나 사용하기 복잡한 타입 표현을 새로운 타입명으로 정의해주는 문법
- 타입에 대한 새로운 표현을 정의하는 역할을 하기 때문에 타입이 아닌 구체적인 값을 상수처럼 사용할 수는 없음
typealias infoResult = (Int, Character, String)
// infoResult는 (Int, Character, String) 튜플과 동일한 것으로 취급
func getUserInfo() -> infoResult {
let gender: Character = "W"
let height = 180
let name = "도마토"
return (height, gender, name)
}
let info = getUserInfo()
info.0 // 180
info.1 // "W"
info.2 // "도마토"
// typealias에도 변수를 지정하여 선언 가능함
typealias infoResult = (h: Int, g: Character, n: String)
func getUserInfo() -> infoResult {
let gender: Character = "W"
let height = 180
let name = "도마토"
return (height, gender, name)
}
let info = getUserInfo()
info.h // 180
info.g // "W"
info.n // "도마토"
[Day15] Function: 매개변수(4) (0) | 2024.05.02 |
---|---|
[Day14] Function : 매개변수(3) (0) | 2024.05.01 |
[Day11] Optional(2) (0) | 2024.04.22 |
[Day10] Optional (1) (0) | 2024.04.19 |
[Day9] Collective Types (4) : Dictionary (0) | 2024.04.17 |
댓글 영역