함수란 무엇인가?
함수는 특정 작업을 수행하기 위해 호출할 수 있게 이름 붙여진 코드 블록이다.
- 함수는 값을 받아(매개변수, parameter) 산술식을 수행하며, 계산 결과가 반환되도록 프로그래밍 할 수 있다.
메서드란 무엇인가?
본질적으로 메서드는 특정 클래스나 구조체 또는 열거형과 연관된 함수다. 예를 들어, 스위프트 클래스 내에서 함수를 선언했다면 이것은 메서드로 간주된다.
func sayHello() { print("Hello") } 위의 함수는 매개변수를 받지 않고, 결과를 반환하지도 않으며 메시지를 표기하기만 한다.
func buildMessageFor(name: String, count: Int) -> String { return("\(name), you are number \(count)) } 반면 위의 함수는 매개변수로 문자열 하나와 정수 하나를 받으며 문자열 결과를 반환한다.
- 함수가 단일 표현식을 가지고 있는 경우 return 구문을 생략하고 바로 "내용" 을 넣을 수 있다.
반환값 처리하기
스위프트로 개발할 때 메서드나 함수를 호출하여 반환된 결괏값을 사용하지 않는 경우가 생긴다. 이럴 때는 다음과 같이 반환값을 _ 에 할당하여 그 값을 버린다.
_ = buildMessageFor(name: "John", count: 100) 73페이지의 지역 매개변수명과 외부 매개변수명, 함수에 디폴트 매개변수 선언하기, 여러 결괏값 반환하기, 함수 매개변수의 변수 개수, 변수인 매개변수, 입출력 매개변수로 작업하기, 매개변수인 함수 -> 이 부분들은 훑듯이 읽기는 했는데 이해가 되지 않는다.
지역 매개변수명 VS 외부 매개변수명
func greet(person name: String) { print("Hello, \(name)!") } greet(person: "Jaehyeon") - person: 외부에서 호출할 때 사용하는 이름
- name: 함수 안에서 사용하는 이름(지역 매개변수명) -> 읽기 좋고 직관적으로 만들기 위한 스위프트 스타일.
왜 굳이 나눌까?
func move(from start: Int, to end: Int) - 이렇게 하면 move(from: 3, to: 5)처럼 문장처럼 읽혀서 가독성이 좋아진다.
함수에 디폴트 매개변수 선언하기
func sayHello(to name: String ="Guest") { print("Hello, \(name)!") } sayHello() /// Hello, Guest! sayHello(to: "Ted") /// Hello, Ted! - 디폴트값 덕분에 매개변수 생략이 가능해진다.
여러 결괏값 반환하기(튜플 사용)
func minMax(numbers: [Int]) -> (min: Int, max: Int) { let minVal = numbers.min()! let maxVal = numbers.max()! return (minVal, maxVal) } let result = minMax(numbers: [3, 7, 2, 9]) print(result.min) // 3 print(result.max) // 9 - 여러 값을 한 번에 리턴하고 싶을 땐 튜플을 사용한다.
함수 매개변수의 개수를 가변으로
func sum(_ numbers: Int...) { let total = numbers.reduce(0, +) print("Sum is \(total)") } sum(1, 2, 3, 4) // sum is 10 지금 시각 19:00. 여기까지가 오늘 공부의 한계다. 이어서 또 하자. 라고 하기엔 더 공부해야 한다는 생각이 든다. 좀만 더 버티자. 재미없어보이는 게 당연.
클로저 표현식
클로저 표현식은 독립적인 코드 블록이다. 예를 들어, 다음은 클로저 표현식을 선언하고 그것을 sayHello라는 이름의 상수를 할당한 다음에 상수 참조를 통해 함수를 호출한다.
let sayHello = {print("Hello")} sayHello() 와 이게 뭔소리지?
사실, 함수는 이름이 있는 클로저 표현식일 뿐이다. 일단 넘어간다 GPT 도움을 받아서 다시 정리해본다.
클로저는 함수랑 똑같은데 이름이 없는 익명 함수다. 나처럼 함수에 대해 이미 알고 있는 사람에겐 "아 이거 그냥 함수를 변수처럼 쓰려는 거구나" 하고 보면 이해가 쉽다.
클로저란?
클로저란 이름이 없는 일회용 함수다. 함수처럼 입력과 출력을 갖는다. 함수처럼 변수에 저장하거나, 다른 함수에 전달할 수 있다.
클로저 기본 예시
let sayHello = {print("Hello")} sayHello() // 실행 - sayHello()는 클로저다. 함수처럼 생겼지?
let greet: (String) -> Void = { name in print("Hello, \(name)!") } greet("재현") // Hello, 재현! - (String) -> Void: 클로저의 타입 -> String 받아서 반환 없음.
- name in: in 앞은 매개변수, 뒤는 클로저 본문
왜 쓰는가?
- 코드를 짧고 간결하게 쓰기 위해.
- 함수형 스타일에서 거의 필수
- 어떤 동작을 "나중에 실행하기 위해 저장"하고 싶을 때
요약
함수, 클로저, 그리고 클로저 표혀식은 독립된 코드 블록으로 특정 작업을 수행하기 위하여 호출될 수 있으며, 코드를 구조화하고 재사용하는 메커니즘을 제공한다.