함수(Function) 1

zeStars Team·2021년 5월 27일
0

Swift_Study

목록 보기
5/5

함수(Function) 1

함수는 독립적으로 작성하여 다양한 곳에서 간단한 방식으로 여러번 호출하여 사용할 수 있어 같은 코드를 여러번 반복해 작성할 필요가 없음

Swift는 함수형 프로그래밍 언어로서 함수형 프로그래밍의 특성을 이해하는 것이 중요함.

함수의 기본개념

어떤 값(파라미터, 인자값)을 받아서 내부 과정을 거친후 결과값(리턴값, 반환값)을 반환하는 것이 함수라고 함

함수의 파라미터는 없을수도 있고, 1개일수도 있고 여러개일수도 있음

함수의 리턴값은 기본적으로 1개이며, 여러개의 값을 리턴해야 한다면 집단자료형(Array, Dict ...)에 담아 반환해야함

일반함수

프로그래밍 언어나 프레임워크에서 제공하는 함수

기본적인 데이터 처리나 연산등의 목적으로 사용됨

대표적으로 print() 함수가 있음

사용자 정의 함수

일반함수만으로 충분하지 않아 개인이 원하는 대로 직접 만든 함수

사용자 정의 함수의 정의는 아래와 값이 이루어짐

func 함수이름(매개변수1: 변수타입, 매개변수2: 변수타입, ...) -> 반환타입 {
	실행내용
	return 반환값
}

함수의 이름으로는 영어, 숫자, 한자, 한글, 이모지 등등 다양하게 사용할 수 있지만 첫글자는 반드시 문자나 언더바( _ )로 시작되어야함

또한 예약어나 연산자들은 함수의 이름으로 사용이 불가능함

함수의 이름을 아무렇게나 지어도 되지만 나중에 사용할 때 구분이 용이하기 위해 의미를 구분할 수 있을 정도로 이름을 지어주는 것이 필요!!!!

함수의 매개변수와 반환값은 있어도 되고 없어도 됨 그에 따라 함수의 선언이 달라짐

// 매개변수와 반환값이 모두 없는 경우
func func1() {
    print("func1")
}
// 매개변수가 없지만 반환값만 있는 경우
func func2() -> String{
    print("func2")
    return "func2"
}
// 매개변수가 있지만 반환값이 없는 경우
func func3(name: String) {
    print("func3 \(name) 출력")
}
// 매개변수와 반환값이 모두 있는 경우
func func4(name: String) -> String{
    print("func4")
    return "func4 \(name) 리턴"
}

함수의 호출

함수의 호출을 함수의 이름뒤에 ()를 붙여 호출함 이때 ()는 함수호출연산자로써 사용됨

위에 정의 해놓은 함수들을 호출하는 방법을 보여줌

func1() // func1

let name = "lee"
func3(name: name) // func3 lee 출력
func3(name: "kim") // func3 kim 출력

Swift에서 함수는 인자 레이블(파라미터의 값을 구분하기 위해 사용)을 명시해야만 사용이 가능

이부분은 Obj-C 와의 상호호환성을 위해서 어쩔수 없이 형식을 맞추다 보니 등장하게 된 개념임

따라서 함수는 함수의 이름과 함께 인자레이블까지 사용하여 구분되므로 함수를 호출할 때 인자레이블을 구분해서 호출하는 것이 중요

func func1() {
    print("func1")
}
func func1(a: Int) {
    print("func1 \(a)")
}
func func1(num: Int, char:String) {
    print("func1 \(num) \(char)")
}
// 세 함수가 모두 다른함수라고 생각하면됨
// 마지막 함수 기준으로

func1(num: 1, char: "test1") // 함수의 이름만으로 호출 func1 1 test1
func1(num:char:)(2, "test2") // 함수의 식별자를 사용하여 호출 func1 2 test2

함수의 반환값과 튜플

앞서 확인한 것과 같이 함수는 반드시 하나의 값만을 반환해야 함

여러개의 값을 반환해야하는 상황이 온다면 집단자료형에 담아서 반환해야함

집단자료형의 종류는 배열, 딕셔너리, 튜플, 구조체, 클래스가 있으며 이중에서 함수의 반환값으로서 활용도가 높은 자료형은 튜플이다

튜플을 활용하여 값을 반환하고 싶을 때는 반환 타입을 튜플의 형태로 정의해 주어야 함

func getMemberInfo1() -> (String, Int) {
    let name = "Lee"
    let age = 28
    return (name, age)
}

var info1 = getMemberInfo1()
info1.0 // "Lee"
info1.1 // 28

func getMemberInfo2() -> (n: String, a: Int) {
    let name = "Kim"
    let age = 30
    return (name, age)
}

var info2 = getMemberInfo2()
info2.n // "Kim"
info2.a // 30

func getMemberDetailInfo() -> (String, Character, Int) {
    let name = "Lee"
    let gender:Character = "M"
    let age = 28
    return (name, gender ,age)
}

var (n, g, _) = getMemberDetailInfo()
n // "Lee"
g // "M"

함수의 반환값으로 특정 튜플의 타입이 여러곳에서 사용될 경우 매번 정의 해주어야하는 번거로움이 발생할 수 있음

이런 번거로움을 해결하기 위해서 typealias 라는 축약형 타입을 활용함

typealias 를 활용하게 되면 전체적으로 소스코드가 간결해져 코드의 가독성을 높일 수 있음

// typealias 정의
typealias infoResult = (String, Int, Int)

func getMemberDetailInfo() -> infoResult {
    let name = "Lee"
    let height = 180
    let age = 28
    return (name, height ,age)
}

var info = getMemberDetailInfo()
info.0 // "Lee"
info.1 // 180
info.2 // 28
profile
zeStars 개발 블로그입니다

0개의 댓글