맛동산이

스위프트 스터디 5탄) 함수 (Functions) 본문

앱/Swift 문법

스위프트 스터디 5탄) 함수 (Functions)

진ddang 2023. 7. 8. 16:14

 

스위프트 공식문서를 참조하였습니다.



정의와 호출

스위프트는 c를 기반으로 하기 때문에, c와 비슷하게 함수를 정의할때는, 인풋 파라미터의 타입과, 리턴 타입을 선언해 줘야 하고, 만약 리턴타입이 void가 아닌 string이나 bool 혹은 int 와 같은 hashable한 데이터 타입이라면, return 값을 설정해 줘야한다.

모양은 다음과 같다.

func greet(person: String) -> String{  	let greeting = "hellow" + person + "!" 	return greeting } print(greet(person: "Sujin")  // person 이라는 전달 파라미터를 받아서 string값으로 출력해주는 함수 // 출력 : hellow Sujin!  //리턴은 합쳐서 생성이 가능하다.  func greet(person:String) ->String{ 	return "hellow" + person + "!" }

 

함수 파라미터와 반환 값

void의 경우에 대하여 생각해야하지만, 간단하게 void라면 그냥 작성을 안하면 된다.

파라미터가 없는 함수

func hellow()-> String{ 	return "hellow"} print(hellow()) // hellow

복수의 파라미터를 쓰는 함수

func multi(a:Int, b:String)->String{ 	return " number is \(a) and string is \(b)" } print(multi(3,hi)) // number is 3 and string is hi

반환값이 없는 함수

func printA(){ 	print("hellow world")} printA() // hellow world
  • 스위프트에서 알아야 하는 점은 이렇게 void값을 반환하는것은 빈 튜플을 반환하는것이라는것을 알고 있어야 한다!!

 

복수의 값을 반환하는 함수(튜플)

func minMax(array: [Int]) -> (min: Int, max: Int) {     var currentMin = array[0]     var currentMax = array[0]     for value in array[1..<array.count] {         if value < currentMin {             currentMin = value         } else if value > currentMax {             currentMax = value         }     }     return (currentMin, currentMax) }  let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) print("min is \(bounds.min) and max is \(bounds.max)") // Prints "min is -6 and max is 109"

반환값을 접근자로 사용할수 있다. 튜플이기 때문에

 

옵셔널 튜플 반환형

func minMax(array: [Int]) -> (min: Int, max: Int)? {     if array.isEmpty { return nil }     var currentMin = array[0]     var currentMax = array[0]     for value in array[1..<array.count] {         if value < currentMin {             currentMin = value         } else if value > currentMax {             currentMax = value         }     }     return (currentMin, currentMax) }

반환형 뒤에 ? 를 붙여서 반환값을 옵셔널을 줄수 있다.

따라서 리턴값에 nil값이 들어갈수 있는것을 알려주는 것이다.

 

옵셔널(optional)이란?????

처음 옵셔널이라는 단어가 나왓을때 무슨뜻인지 전혀 이해를 할수 없어서 검색 해보았다.

옵셔널이란 ? 를 통해서 해당 값에 nil값이 들어갈수 있는지를 암시적으로 표현하는것이다. 일반적인 변수랑 다르기 때문에 기존변수처럼 다른 변수들과 연산이 불가능 하다.

즉 nil값이 들어갈수 있는 옵셔널 변수를 만들어 주는것이다.

 

파라미터와 라밸 지정

func greet(person: String, from hometown: String) -> String {     return "Hello \(person)!  Glad you could visit from \(hometown)." } print(greet(person: "Bill", from: "Cupertino")) // Prints "Hello Bill!  Glad you could visit from Cupertino."

인자 파라미터로 from을 통해 함수 외부에서 값을 받고, hometow이라는 라벨을 이용해서 함수 내부에서 사용 가능하다.

 

기본 파라미터 값

인자 = hashable 값

을 통해서 default로 선언을 하면서 줄수가 있다.

이러한 경우에는 파라미터를 넣어주지 않으면 기본값으로 함수내부에서 돌아간다.

func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {     // 함수 호출시 두번째 인자를 생략하면 함수안에서     // parameterWithDefault값은 12가 기본 값으로 사용됩니다. } someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault는 6 someFunction(parameterWithoutDefault: 4) // parameterWithDefault는 12

 

집합 파라미터

인자 값으로 특정 type의 집합값을 사용 가능하다.

범위값을 파라미터로 넣어줄수 있다.

func arithmeticMean(_ numbers: Double...) -> Double {     var total: Double = 0     for number in numbers {         total += number     }     return total / Double(numbers.count) } arithmeticMean(1, 2, 3, 4, 5) // returns 3.0, which is the arithmetic mean of these five numbers arithmeticMean(3, 8.25, 18.75) // returns 10.0, which is the arithmetic mean of these three numbers

 

in out 파라미터 (매우중요!!)

인아웃 파라미터는 인자 값을 직접 변경하는 파라미터이다. 파라미터 앞에 inout을 통해서 call by reference를 통해 직접 인자를 변경한다. c++에서의 포인터라고 생각하면 된다.

in out 파라미터는 &(참조값)으로 파라미터를 넘겨 받는다는것을 의미한다.

  • 스위프트는 기본적으로 call by value이다.
  • 따라서 앞에서 말했지만, substring으로 저장하게 되면, call by value기 때문에 계속해서 값이 메모리상에 존재해야 하기 때문에, substring자체는 reference로 값이 저장되기에 새로 string값으로 저장하는게 메모리에 이득인것이다.
var myvalue = 10  func doubleValue(value: inout Int)->Int{ 		value+=value 		return value }  print(doubleValue(&myvalue) // 20 print(myvalue) // 20

위와 같은 경우에 실제로 myvalue값을 참조값으로 변경해 주기 때문에 함수내부에서 value가 20이 된것을 따로 value로 반환하는것이 아닌 실제 myvalue값을 변경해준다.

따라서 이후의 코드에서는 myvalue는 20이 된다.

진짜 그렇게 됨!

함수 형의 사용

함수는 입력파라미터, 리턴값 이렇게 두개가 있는데 위에서도 이야기 했지만, void가 존재할수도 있다.

중요한점은 스위프트에서는 콜백함수를 지원하고 있다. 즉 파라미터로 함수를 받을수 있다는 뜻이다. 함수를 변수처럼 지정하여 파라미터로 넣어줄수 있다는 말이다.

예제코드는 다음과 같다.

import UIKit  func addTowInt(_ x: Int, _ y: Int)->Int{     return(x + y) } var mathFunction: (Int,Int)->Int = addTowInt  func printMath(_ mathFunction:(Int,Int)->Int, _ a:Int, _ b:Int){     print("Result: \(mathFunction(a,b))") } printMath(addTowInt,10,20) //Result: 30

 

 

중첩 함수

함수내부에 함수를 계속해서 체인형태로 선언해 가면서 동작하게 할수 있다.

func chooseStepFunction(backward: Bool) -> (Int) -> Int {     func stepForward(input: Int) -> Int { return input + 1 }     func stepBackward(input: Int) -> Int { return input - 1 }     return backward ? stepBackward : stepForward } var currentValue = -4 let moveNearerToZero = chooseStepFunction(backward: currentValue > 0) // moveNearerToZero는 이제 중첩 돼 있는 stepForward() 함수를 가르킵니다. while currentValue != 0 {     print("\(currentValue)... ")     currentValue = moveNearerToZero(currentValue) } print("zero!") // -4... // -3... // -2... // -1... // zero!

 


매우중요!!

_ 를 사용하는 방법에 대하여

스위프트에서는 내부 매개변수 이름과 외부 매개변수의 이름을 정해주고 그것을 통해서 인자를 받게 된다.

예를들어

func add(first x: Int, second y:Int)->Int{ 	return(x+y) }  add(first: 10,second: 20)

이렇게 이름을 통해서 파라미터 인자를 보내줘야 하는데

이를 파라미터 값을 보내줄때 c++ 처럼 이름을 생략하고 싶을때 _를 사용하게 된다.그렇게 되면 코드는 다음과 같이 사용할수 있다.

func add(_ x: Int, _ y:Int)->Int{ 	return( x+y)} add(10,20)

매우 중요하고 편리한 기능이기 때문에 잘 숙지하는게 좋다.

 


Uploaded by

N2T
반응형