기초

11.Functions & Closures

섭섭's 2024. 6. 2. 20:18

함수

 

함수를 가장 단순하게 정의해보면 특정 기능을 수행하는 코드조각 입니다.

 

프로그래밍은 수학에서 많은 개념을 가지고 왔는데 함수도 마찬가지 입니다.

 

parametor이라 부르는 입력값이 있고

 

특정 기능을 수행하는 code가 있고

 

Return Value라고 하는 결과도 있습니다.

 

코드로 Hello라는 문자열을 출력해보겠습니다.

 

print("Hello")

 

이 코드에서 print가 바로 함수입니다.

 

print 함수는 우리가 적은 값을 콘솔에 출력해 줍니다.

 

함수의 장점

자주 사용하는 기능을 함수로 구현해 놓으면 

 

언제든지 반복해서 사용할 수 있습니다.

 

Swift Standard Library

스위프트에는 swift standard library 가 내장되어 있습니다.

 

여기에는 다양한 기본함수가 구현되어 있습니다.

 

해당 라이브러리에서 포함된 함수는 오래 사용해왔던 함수들이고

 

그만큼 안전하며, 검증되었습니다.

 

함수호출

함수를 사용하는것을 함수를 호출한다 라고 표현합니다.

 

문법의 예제를 들어보면

 

functionName(parameters)

 

예제를 보면 함수의 이름과 파라미터가 있는데

 

파라미터는 함수로 전달하는 값 입니다.

 

함수선언

함수선언의 예제를 적어보겠습니다.

 

func name(parameters) -> ReturnType {
	statements
}

 

중간에 -> 는 Return Arrow라고 부릅니다.

 

함수선언은 func 키워드로 시작합니다.

 

함수의 코드블록은 보통 function body 라고 부릅니다.

 

return문

간단한 예제를 하나 적겠습니다.

 

func add() -> Int {

}

 

이런 식으로 컴파일을 하게 된다면

 

스위프트는 Missing return in global function expected to return 'Int' 라는 

 

오류메세지를 출력하게 됩니다.

 

이런 오류가 나오는 이유는

 

리턴 타입을 선언했으면 반드시 같은 타입의 값을 리턴해야 하기 때문입니다.

 

func add() -> Int {
	return 1 + 2
    
}

 

이런식으로 리턴값을 넣는다면

 

함수가 끝날 때 3 이 리턴되게 됩니다.

 

이번에는 리턴문에서 표현식을 빼고 리턴키워드만 사용하는 코드를 보겠습니다.

func printRandomEvennumber(){
	let rnd = Int.random(in:1...100)
    
    if !rnd.isMultiple(of: 2){
    	return
    }
    
    print(rnd)
}

 

랜덤 숫자를 만든 후 짝수면 출력하고 홀수면 끝내는 예제 코드 입니다.

 

위 코드에서 return만 사용하면 함수의 실행이 if문에서 바로 끝나게 됩니다.

 

함수의 실행이 if문에서 끝나니까 뒤에있는 print 문이 실행되지 않습니다.

 

Parameters

파라미터는 함수에서 입력에 해당하는 값 입니다.

 

입력이 없으면 파라미터를 쓰지 않아도 되고 

 

파라미터를 여러개 사용할 수 있습니다.

 

add(a :12, b:34 )

func add(a: Int, b: Int) ->Int{
	return a + b
}

 

예제를 보면 add 키워드에 있는 전달하는 실제값을 파라미터 라고 부릅니다.

 

또한 func 키워드에 있는 add 의 값도 파라미터라고 부릅니다.

 

하지만 간혹 이 둘을 정확히 구분해야하는 경우가 있습니다.

 

func 키워드의 add는 Formal Parameter이라고 부릅니다.

 

add 키워드의 파라미터는 Actual parameter라고 부릅니다.

실제로 argument라고 부르는 경우가 더 많습니다.

 

이번에는 파라미터의 기본값을 선언하겠습니다.

 

문법을 예제로 들면

 

(name: Type = Value)

입니다. 

 

새로운 함수를 하나 선언해서 다른 예제로 기본값 선언을 보여드리겠습니다.

 

func sayHello(to: string = "stranger"){
	print("Hello, \(to)")
}

 

이 함수를 호출하면서 스위프트를 전달할 때 

 

say를 치기만 해도 자동완성이 표시됩니다.

 

만약 자동완성이 나왔을때 엔터를 치면

sayHello()

 

이런식으로 파라미터가 생략됩니다.

 

만약에 파라미터를 전달하고 싶다면

 

자동완성에서는 sayHello(to:) 라는 단어가 회색으로 나오는데

 

입력할때 sayto라고 입력을 하고 자동완성을 선택하면

 

sayHello(to: String)

 

이렇게 파라미터를 전달할 수  있습니다.

 

Argument Label

 

예시 사진의 파라미터 선언 문법을 다시보면

 

위의문법을 보면  파라미터 이름은 파라미터 이름인 동시에 아규먼트 레이블입니다.

 

아래쪽 문법을 보면 이름이 두개입니다. 파리마터 이름과 아규먼트 레이블을 따로 선언할 수 있습니다.

 

이때는 아그먼트 레이블이 앞에 옵니다.

 

아규먼트 레이블은 함수 이름의 가독성을 높이기 위해 사용합니다.

 

다시 예제를 가져와서

 

func sayHello(name: String){
	print("Hello, \(name)")
}

sayHello(name:"Swift")

 

이 예제에서 name은 파라미터 이름이며, 동시에 아규먼트 레이블 입니다.

 

이번에는 위의 예제에서 to 하나만 추가해보겠습니다.

func sayHello(to name: String){
	print("Hello, \(name)")
}

 

이 소스에서는 to가 아규먼트 레이블 이고 name이 파라미터 이름입니다.

 

우리가 스코프에서 복습했듯이 하나의 스코프에 같은 이름을 가진 변수나 상수는 존재할 수 없다

 

라고 공부했었습니다.

 

함수도 마찬가지로 하나의 스코프에 같은 이름을 가진 함수가 존재할 수 없습니다.

 

하지만 위의 두 예제 코드를 하나의 파일에 넣고 실행시키면 정상적으로 컴파일 됩니다.

 

왜그러냐면 함수 이름에 아규먼트 레이블이 포함되기 때문입니다.

 

첫번째 함수는 sayHelloname 이라고 인식합니다.

 

두번째 함수는 sayHelloto 라고 인식하기 때문에 정상 실행이 가능한 것 입니다.

 

 

'기초' 카테고리의 다른 글

13.string Editing  (0) 2024.06.02
12. string  (0) 2024.06.02
10.Optionals  (0) 2024.06.02
9.control Tranfer Statements  (0) 2024.06.02
8.Range Operators  (0) 2024.06.02