본문 바로가기

Swift 문법

[Swift] 함수

코딩에서 가장 많이 사용하는,
그리고 오류도 많이 발생하는,
하지만 가끔은 편리한,

코딩의 꽃!

함수에 대해 알아보자

 

함수의 장점

  • 반복되는 코드 재사용 가능
  • 미리 함수를 정의하고 나면, 쉽게 사용만 하면 됨

 

함수의 기본 형태

함수를 활용하기 위해서는 정의와 호출을 알고 있어야 한다.

기본적인 함수 정의와 호출정의한 함수를 호출하면 함수 내부의 실행문이 실행된다.

// 정의 
func someFunction() { 
	print("이 형식이 기본적인 함수 정의이다.") 
} 

// 호출 
someFunction()

 

 

함수의 Input과 Output

함수는 Input 값과 Output 값을 가질 수 있는데, 각 경우에 따라서 코드 형식이 약간 달라진다.

 

1. Input 값과 Output 값 모두 없는 경우

// 정의 
func someFunction() { 
	print("이 형식이 기본적인 함수 정의이다.") 
} 

// 호출 
someFunction()

 

2. Input 값만 있는 경우

// 정의
func someFunction(name: String) {
	print("안녕, \(name)"
}

// 호출
someFunction(name: "홍길동")

함수 정의에서 name을 파라미터 또는 매개변수라고 한다.

함수 호출에서 실제로 name에 전해주는 값(”홍길동”)을 아규먼트(Argument)라고 한다.

 

Input 값이 있는 함수는 호출 시에 반드시 아규먼트를 전해주어야 한다.

 

3. Output 값만 있는 경우

// 정의
func someFunction() -> Int {
	return 3
}

// 호출
someFunction()

// 활용
print(someFunction())

var a = someFunction()

Output 값이 있는 함수는 Output 값의 타입을 화살표와 함께 파라미터 뒤에 명시해주어야 한다.

함수의 Output 값을 반환할 때 return 키워드를 사용한다.

 

4. Input 값과 Output 값 모두 있는 경우

// 정의
func someFunction(a: Int, b: Int, c: Int) -> Int {
	return a + b + c 
}

// 호출
someFunction(a: 1, b: 2, c: 3)

Void 타입

Output 값(리턴값, 반환값)이 없는 함수에 표시한다.

아래의 세 함수는 모두 같은 의미이다.

func someFunction1() {
	print("홍길동")
}

func someFunction2() -> Void {
	print("홍길동")
}

func someFunction3() -> () {
	print("홍길동")
}

Output 값이 없다는 타입인 Void 키워드나 같은 의미인 ()을 명시한다.

 

 

함수의 여러 형태

Swift에서는 가끔 이상하고 복잡한 형태의 함수를 볼 수 있다.

하지만 그 함수들은 오히려 개발자들의 편의를 위해 정의된 모습이다.

아래 정리 내용을 살펴보면 이제 모든 함수를 이해할 수 있을 것이다.

 

1. 아규먼트 레이블 (Argument Label)

// 정의
func someFunction(writeFirstName name: String, writeCountry address: String) {
	print("\(name)님, \(address)에 살고 계시군요?"
}

// 호출
someFunction(writeFirstName: "홍길동", writeCountry: "조선")

파라미터 앞에 키워드가 있는데, 이를 아규먼트 레이블이라고 한다.

보통 길게 입력하여 요구하는 파라미터에 대하여 더욱 명확하게 설명할 수 있다.

주의할 점은, 함수를 정의할 때의 실행문 내에서는 파라미터를 사용하여 작성한다.

그리고 함수 호출 시 아큐먼트와 함께 아규먼트 레이블를 명시한다.

 

2. 와일드카드 패턴

// 정의
func someFunction(_ name: String, _ address: String) {
	print("\(name)님, \(address)에 살고 계시군요?"
}

// 호출
someFunction("홍길동", "조선")

와일드카드 패턴은 _(언더바)를 아규먼트 레이블의 위치에 작성한다.

가장 큰 특징은 호출 시 아규먼트 앞에 그 어떤 키워드도 넣지 않는다는 것이다.

 

 

3. 파라미터 기본값

// 정의
func someFunction(name: String, address: String = "한국") {
	print("\(name)님, \(address)에 살고 계시는군요?")
}

// 호출
someFunction(name: "홍길동") // "홍길동님, 한국에 살고 계시는군요?"
someFunction(name: "홍길동", address: "미국") // "홍길동님, 미국에 살고 계시는군요?"

함수 정의 시, 파라미터에 값을 미리 할당하여 기본값을 설정할 수 있다.

함수 호출 시, 아규먼트를 넣지 않았을 때 해당 파라미터에는 자동으로 기본값이 할당된다.

 

 

4. 가변 파라미터

// 정의
func someFunction(_ numbers: Double...) -> Double {
	var total = 0.0
	for i in numbers {
		total += i
	}
	return total
}

// 호출
someFunction(1.5, 2, 3.4, 1)

가변 파라미터란 갯수가 정해지지 않는 배열 형식의 값이다.

함수 정의 시, 타입 표현은 ‘Input 타입…’으로 표시한다.

각 함수 당 가변 파라미터 하나만 사용이 가능하다.

가변 파라미터는 기본값을 갖지 못한다.

배열 형식의 아규먼트이다보니 실행문에서 보통 반복문을 자주 활용한다.

 

 

함수의 지칭과 할당

함수를 호출시키지 않고 표기만 할 수도 있다.

말이 어려운데 코드를 보면 쉽게 이해할 수 있다.

func someFunction() {
	print("홍길동")
}

// 함수 표기
someFunction

// 함수를 변수에 할당
var a = someFunction

// 할당된 변수 활용
a() // "홍길동"

위와 같이 새로운 변수에 함수를 할당할 수 있다.

그러나 파라미터가 있는 함수는 할당의 형식이 약간 달라진다.

func someFunction(firstName name: String, _ address: String, age: Int) {
	print(name, address, age)
}

// 할당
var a = someFunction(firstName:_:age:)

// 변수 활용
a("홍길동", "한국", 20)

할당을 할 때에는 함수명 뒤의 파라미터가 들어가는 가로 안에서의 형식이 다르다.

파라미터와 콜롬을 입력한 뒤, 바로 다음 파라미터와 콜롬을 입력하는 방식이다.

이 때 아규먼트 레이블이나 와일드카드 인자가 있을 경우, 그것들을 작성한다.

할당된 변수를 활용할 때에는 아규먼트 값만 넣어주면 된다.

함수도 타입추론이 되기 때문에 할당할 때 타입을 명시하지 않아도 된다.

 

참고로 함수의 타입은 다음과 같이 작성한다.

// (String, String, Int)이 Input 값, Output 값은 없음
var a: (String, String, Int) -> () = someFunction(firstName:_:age:)

// (Int)이 Input 값, Output 값은 없음
var b: (Int) -> Void = someFunction(firstName:_:age:)

// 타입 주석 시, Input 부분은 가로작성이 필수이고, Output은 하지 않아도 된다.

 

 

함수 사용 시 주의점

  • 함수의 파라미터는 상수(let)이다. 따라서 실행문에서 수정이 불가능하다.
  • 함수 내에서 선언한 변수(let, var)는 해당 함수의 실행문(Scope)에서만 사용가능하다.
  • Output 타입이 없어도 return 키워드를 사용하는 경우가 있다.
func someFunction(number: Int) {
	if number > 100 {
		return
	} else {
		print("100 미만")
	}
}

위 함수의 아규먼트로 101을 넣어주면 함수가 종료되며 아무 일도 벌어지지 않는다.

이처럼 return 키워드는 함수를 종료시키는 성질이 있다.

따라서 단순히 특정 상황에서 함수를 종료시키고 싶은 때, return 키워드를 사용할 수 있다.

단, 오로지 ‘return’만 작성해야한다.

 

'Swift 문법' 카테고리의 다른 글

[Swift] 클래스와 구조체  (0) 2022.07.17
[Swift] Enum(열거형)  (0) 2022.07.16
[Swift] 튜플  (0) 2022.07.14
[Swift] Switch문  (0) 2022.07.13
[Swift] 연산자 팁  (0) 2022.07.12