[Swift] 함수에 대해 알아보자!

zooneon·2020년 10월 10일
1

Swift 기본 문법

목록 보기
1/14
post-thumbnail
post-custom-banner

본 내용은 '스위프트 프로그래밍' 책을 학습한 후 이를 바탕으로 작성한 글입니다.

함수

기본적인 함수의 정의와 호출

  • Swift에서 함수를 정의하는 키워드는 func이다.
  • Swift 함수는 기본으로 함수의 이름과 매개변수, 반환 타입 등을 사용하여 함수를 정의한다.

함수의 기본 형태

func 함수이름(매개변수...) -> 반환타입 {
	실행 구문
    	return 반환 값
}
  • 함수 내부의 코드가 단 한 줄의 표현이고, 그 표현의 결괏값의 타입이 함수의 반환 타입과 같다면 return키워드를 생략할 수 있다.
func introduce(name: String) -> String {
	"안녕하세요, 저의 이름은 " + name + "입니다."
}

매개변수

  • 매개변수가 필요없다면 매개변수 위치를 비워두면 된다.
  • 매개변수가 여러 개 필요한 함수는 쉼표(,)를 사용하여 매개변수를 구분한다.
  • 함수를 호출할 때, 매개변수 이름을 붙여주고 콜론(:)을 적어준 후 전달인자를 보내준다.
  • 호출 시 매개변수에 붙이는 이름을 매개변수 이름이라고 한다.
//매개변수가 없는 경우
func helloWorld() -> String {
	return "Hello, world!"
}    

//매개변수가 여러 개인 경우
func sayHello(myName: String, yourName: String) -> String {
	return "Hello \(yourName)! My name is \(myName)"
}
print(sayHello(myName: "zooneon", yourName: "Mike"))	//Hello Mike! My name is zooneon

매개변수 이름과 전달인자 레이블

  • 전달인자 레이블을 매개변수 이름과 별도로 지정하면 외부에서 매개변수의 역할을 좀 더 명확히 할 수 있다.
  • 전달인자 레이블을 사용하려면 매개변수 이름 앞에 한 칸을 띄고 지정해주면 된다.
func 함수 이름(전달인자 레이블 매개변수 이름: 매개변수 타입, 전달인자 레이블 매개변수 이름: 
		매개변수 타입) -> 반환 타입 {
    실행 구문
    return 반환 값
}
  • 함수 내부에서 전달인자 레이블을 사용할 수 없으며, 함수를 호출할 때는 매개변수 이름을 사용할 수 없다.
func sayHello(from myName: String, to yourName: String) -> String {
	return "Hello \(yourName)! My name is \(myName)"
}
print(sayHello(from: "zooneon", to: "Mike"))	//Hello Mike! My name is zooneon
  • 전달인자 레이블을 사용하고 싶지 않으면 와일드카드 식별자를 사용하면 된다.
func sayHello(_ myName: String, _ yourName: String) -> String {
	return "Hello \(yourName)! My name is \(myName)"
}
print(sayHello("zooneon", "Mike"))	//Hello Mike! My name is zooneon

매개변수 기본값

  • 매개변수마다 기본값을 지정할 수 있다.
  • 매개변수가 전달되지 않으면 기본값을 이용한다.
func sayHello(_ name: String, _ times: Int = 2) -> String {
	var result: String = ""
    
    for _ in 0..<times {
    	result += "Hello \(name)!" + " "
    }
    
    return result
}
print(sayHello("zooneon"))	//Hello zooneon! Hello zooneon!
print(sayHello("zooneon", 3))	//Hello zooneon! Hello zooneon! Hello zooneon!
  • 기본값이 없는 매개변수를 기본값이 있는 매개변수 앞에 사용하는 것이 좋다.
  • 기본값이 있는지와 상관 없이 중요한 매개변수는 앞쪽에 배치하는 것이 좋다.

가변 매개변수

  • 매개변수로 몇 개의 값이 들어올지 모를 때, 가변 매개변수를 사용할 수 있다.
  • 가변 매개변수는 0개 이상의 값을 받아올 수 있고, 들어온 인자 값은 배열처럼 사용할 수 있다.
  • 함수마다 가변 매개변수는 하나만 가질 수 있다.
func deliciousFood(_ foods: String...) -> String {
    var result: String = ""
    
    for food in foods {
        result += "I like \(food). "
    }
    
    return result
}
print(deliciousFood("pizza", "sushi", "steak"))    //I like pizza. I like sushi. I like steak.

입출력 매개변수

  • 입출력 매개변수는 값이 아닌 참조를 전달할 때 사용한다.
  • 함수 외부의 값에 어떤 영향을 줄지 모르기 때문에 함수형 프로그래밍 패러다임에서는 지양하는 패턴이다.
  • 참조는 inout매개변수로 전달될 변수 또는 상수 앞에 앰퍼샌드(&)를 붙여서 표현한다.
  • 입출력 매개변수는 기본값을 가질 수 없으며, 가변 매개변수로 사용될 수 없다.
  • 상수는 변경될 수 없으므로 입출력 매개변수의 전달인자로 사용될 수 없다.
var numbers: [Int] = [1, 2, 3]

func referenceParameter(_ arr: inout [Int]) {
    arr[1] = 1
}

referenceParameter(&numbers)
print(numbers[1])	//1

반환이 없는 함수

  • 반환이 필요하지 않은 함수라면 반환 타입을 Void로 표기하거나 생략해도 된다.
func helloWorld() {
    print("Hello, world!")
}
helloWorld()	//Hello, world!

데이터 타입으로서의 함수

  • 스위프트의 함수는 일급 객체이므로 하나의 데이터 타입으로 사용할 수 있다.
  • 각 함수는 매개변수의 타입과 반환 타입으로 구성된 하나의 타입으로 사용할 수 있다.
    (매개변수 타입의 나열) -> 반환 타입
typealias Sentence = (String, String, String) -> String

func sentenceFunction(_ a: String, _ b: String, _ c: String) -> String {
    return a + b + c
}

var makeSentence: Sentence = sentenceFunction
print(makeSentence("I ", "love ", "sushi"))    //I love sushi
profile
블로그 이전했습니다. https://blog.zooneon.dev
post-custom-banner

0개의 댓글