일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 커링
- 자고싶다
- 러닝자바스크립트
- 너무무서워
- 샐러드좋아
- 서브웨이
- Git
- 상수와변수
- 오늘양짱많음
- 찐대졸
- node version update
- 아이행복해
- 기본데이터타입
- 내일의주인공은나야나
- javascript
- 문자열보간법
- styled-components install error
- ERESOLVE
- 후록스
- GitLab
- 취미
- 카드지갑
- 프라모델
- 로스트치킨샐러드
- 면담끝
- 가죽공예
- useMemo
- 노드 버전
- 정처기
- 전복과붕어빵
- Today
- Total
당근농장
[Swift] 스위프트 기초 3 - 함수 기본, 함수 고급 본문
오랜만에 쓰는 포스팅! 오늘 정리할 내용은 함수(function)
이다.
함수.... 중요하지.....
사실 프로그래밍 === 함수 만들기
아닌가?
여러 개의 함수가 모여서 하나의 프로그램이 되는 거니까!
그런 의미에서.. 오늘은 조금 중요한 파트! 라고 보면 된다.~
하지만 내용은 크게 어렵지 않숨다~~😉
함수 기본
1️⃣ 함수선언의 기본형태
func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 ...) -> 반환타입 {
/* 함수 구현부 */
return 반환값
}
// 예시1)
// sum이라는 이름을 가지고
// a와 b라는 Int 타입의 매개변수를 가지며
// Int 타입의 값을 반환하는 함수
func sum(a: Int, b: Int) -> Int {
return a + b
}
매개변수는 다른 언어와 똑같이 있어도 되고 없어도 되는 option
이고,
반환 값이 없는 경우에는 반환타입(Void)을 생략
해줄 수 있다. (+ 함수 내에서 return문 또한 생략 가능 / 아니면 return 이라고 쓰던가...)
또한, 함수 구현이 짧은 경우 가독성을 해치지 않는 범위에서
줄바꿈을 하지 않고 한 줄에 표현해도 무관하다!
// 예시2)
// bye라는 이름을 가지고
// 매개변수를 가지지 않으며
// 반환값 또한 없는 함수
func bye() { print("bye") }
2️⃣ 함수의 호출
sum(a: 3, b: 5) // 8
bye() // bye
함수 고급
1️⃣ 매개변수 기본 값
매개변수에 기본적으로 전달될 값을 미리 지정해두는 것도 가능하다.
만약 기본값을 지정해두고자 한다면 매개변수 목록 중 뒤쪽에 위치하도록 하는 것이 좋음!
func 함수이름(매개변수1이름: 매개변수1타입, ❤매개변수2이름: 매개변수2타입 = 매개변수 기본값❤ ...) -> 반환타입 {
/* 함수 구현부 */
return 반환값
}
func greeting(friend: String, me: String = "yagom") {
print("Hello \(friend)! I'm \(me)")
}
// 매개변수 기본값을 가지는 매개변수는 호출시 생략할 수 있고,
// 다른 값을 사용하고 싶다면 별도로 지정해줘도 노상관!
greeting(friend: "hana") // Hello hana! I'm yagom
greeting(friend: "john", me: "eric") // Hello john! I'm eric
2️⃣ 전달인자 레이블(Argument Label)
전달인자 레이블은 함수를 호출할 때 함수 사용자의 입장
(<<< 중요!) 에서 매개변수의 역할을 좀 더 명확하게 표현
하고자 할 때 사용한다.
동일한 이름의 함수를 만들더라도 해당 레이블만 변경
해서 만들면 중복으로 생성 가능!
func 함수이름(❤전달인자 레이블❤ 매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입 ...) -> 반환타입 {
/* 함수 구현부 */
return
}
// 함수 내부에서 전달인자를 사용할 때에는 매개변수 이름을 사용한다.
func greeting(to friend: String, from me: String) {
print("Hello \(friend)! I'm \(me)")
}
// 함수를 호출할 때에는 전달인자 레이블을 사용해야 한다.
greeting(to: "hana", from: "yagom") // Hello hana! I'm yagom
그런데 왜!!! 전달인자 레이블을 사용하는 게 좋을까? 왜!!! 이게 명확하다는 걸까?
그 이유는 바로! !! !!!
Swift API 가이드라인에 그렇게 서술되어 있으니까..?
도 맞긴 하지만..
Swift에서 강조하는 것 중 하나가 Strive for Fluent Usage
이기 때문!
다시 말해 자연스럽게, 말하는 것처럼 작성되어 있을 수록 좋다.
그러면 메소드나 함수를 사용할 때 영어 문장을 작성하는 것처럼 느껴지기 때문에
사용자 입장에서는 훨씬 더 명확하다고 느낄 수밖에 없다. 👍🏻👍🏻
아 그리고, 그냥 갑자기 매개변수와 전달인자의 차이가 궁금해져서 검색해본 결과도 공유할게요 ~~
종종 매개변수(parameter)와 전달인자(argument)는 적당히 섞어서 쓰이기도 하는데, 이 경우 문맥에 따라 의미를 달리해서 해석되기도 한다. 하지만 엄밀히 말해서 매개변수는 함수의 정의부분에 나열되어 있는 변수들을 의미하며, 전달인자는 함수를 호출할때 전달되는 실제 값을 의미한다. 이같은 의미를 명확히 하기 위해 매개변수는 변수(variable)로, 전달인자는 값(value)으로 보는 것이 일반적이다.
3️⃣ 가변 매개변수
가변 매개변수는 전달받을 값의 개수를 알기 어려울 때 사용한다.
사용 방법은 간단! 전달받을 값의 개수를 알기 어려운 변수의 타입 뒤에 ...
을 붙여주기만 하면 된다.
함수당 하나
만 가질 수 있으며, 가변 매개변수 역시 매개변수 목록 중 뒤쪽
에 위치하는 것이 좋다.
(물론 앞쪽에 위치해도 상관은 없다. 하지만... 굳이...?? ㅎㅎ;; 그냥 뒤쪽에 넣자 ㅎㅎ;;)
//func 함수이름(매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입...) -> 반환타입 {
// /* 함수 구현부 */
// return
//}
func sayHelloToFriends(me: String, friends: String...) -> String {
return "Hello \(friends)! I'm \(me)!"
}
print(sayHelloToFriends(me: "yagom", friends: "hana", "eric", "wing"))
// Hello ["hana", "eric", "wing"]! I'm yagom!
// friends에 아무 것도 적지 않으면 빈 배열이 출력된다.
print(sayHelloToFriends(me: "yagom"))
// Hello []! I'm yagom!
4️⃣ 데이터 타입으로서의 함수
음... 이전 포스팅에서 따로 언급한 적은 없었지만...
스위프트는 함수형
프로그래밍 패러다임을 포함하는 다중 패러다임
언어이므로 스위프트의 함수는 일급객체
이다.
일급 객체(영어: first-class object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 매개변수로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다.
그래서 함수를 변수, 상수
등에 할당이 가능하고 매개변수
를 통해 전달할 수도 있다!! (JS랑 똑같다 😮)
기존 변수, 상수를 선언하는 것과 같이 타입만 제대로 적어주면 되는데, 여기서 중요한 점은 함수의 타입을 표현할 때 반환 타입을 생략할 수는 없다
는 것!! 반드시!! 명시해줘야 한다.
함수 기본에서 반환 값이 없는 경우에는 반환 타입(Void)을 생략해줘도 된다고 했는데, 그건 함수를 선언할 때고... 이렇게 변수, 상수, 매개변수에 사용하고자 하는 경우에는 꼭~~ 반환 타입을 명시해주어야 한다.
var someFunction: (String, String) -> Void = greeting(to:from:) // 이렇게 타입을 표현할 때는 반환 타입이 필수!
someFunction("eric", "yagom") // Hello eric! I'm yagom
someFunction = greeting(friend:me:)
someFunction("eric", "yagom") // Hello eric! I'm yagom
// 타입이 다른 함수는 할당할 수 없다 - 컴파일 오류 발생
//someFunction = sayHelloToFriends(me: friends:)
// 이렇게 매개변수를 통해서도 전달 가능!
func runAnother(function: (String, String) -> Void) {
function("jenny", "mike")
}
runAnother(function: greeting(friend:me:)) // Hello jenny! I'm mike
runAnother(function: someFunction) // Hello jenny! I'm mike
출처:
iOS 프로그래밍을 위한 스위프트 기초
매개변수(parameter)와 전달인자(argument)
일급 객체 - 위키백과, 우리 모두의 백과사전
'개발 > Swift' 카테고리의 다른 글
[Swift] 스위프트 기초 4 - 조건문, 반복문 (0) | 2021.06.07 |
---|---|
[Swift] 스위프트 기초 2 - Any/AnyObject/nil, 컬렉션 타입(Array/Dictionary/Set) (0) | 2021.03.31 |
[Swift] 스위프트 기초 1 - 문자열 보간법, 상수와 변수, 기본 데이터 타입 (0) | 2021.03.10 |