반응형

함수는 처리를 모와서 호출할 수 있게 하는 것이다. 프로그램을 구조화하는 중요한 기능이다. Swift의 함수는 상세한 점까지 사용하기 쉽게 되어있다. 매우 독특한 기능이다.


함수 정의 및 사용

지금까지는 단지 작성한 프로그램을 순차적으로 실행하는 것만 예제만 있었지만, 프로그램이라는 것은 물론 그렇게 간단한 것은 아니다.

사용성이 높은 처리는 하나의 묶음으로 만들어 언제 어디서라도 호출할 수 있도록 해야 한다. 이를 위해 준비되어 있는 것이 "함수"이다.

Swift는 많이 사용되는 처리는 함수로 정의하고, 호출할 수 있다. 이것은 다음과 같은 형태로 작성한다.

func 함수명(인수) -> 반환 값 {
    ...... 수행할 작업 ......
    return 값
}

함수명 다음에 ()로 인수의 지정한다. 이 인수는 "변수명:유형"과 같이 이름과 유형을 세트로 작성한다. 복수의 인수가 있는 경우 쉼표로 구분하여 작성한다.

-> 다음에는 그 함수의 반환 값의 유형을 작성한다. 값을 반환하지 않는 경우에는 "Void"를 지정한다. 또는 반환 값의 지정을 생략해도 자동으로 Void 판단한다.

반환 값은 return을 사용하여 작성한다. Void가 지정된 경우는 return는 필요없다.

아래에 간단한 함수의 예제를 보도록 하자.

func calc(num:Int) -> Int {
    var total:Int = 0
    for i in 1...num {
        total += i
    }
    return total
}
 
calc(100)

여기서는 정수를 인수로 호출하면 1부터 입력된 인수값까지의 합을 계산하여 반환하는 함수 calc를 선언하고 이를 호출한다. 여기에서는 calc(num : Int)와 같은 형태로 작성하고 Int형의 값을 하나 인수에 전달하고 있다. 또한 -> Int라고 지정되어 있기에, Int 형의 값이 반환되는 것을 알 수 있다.


인수의 외부명

인수는 가인수이 되는 변수명 외에 외부명을 가질 수 있다. 이는 아래와 같이 작성한다.

(외부명 변수명:유형)

이 외부명이라는 것은 그 함수를 호출할 때 인수에 이름을 지정하는데 사용한다. 이는 실제 예제을 보면 알 수 있다.

아래에 간단한 함수의 사용 예제가 있다.

func tax(price p:Int, rate r:Double) -> Int {
    return Int(Double(p) * (1.0 + r))
}
 
var res:Int = tax(price:10000, rate:0.08)

tax는 가격과 세율을 인수로 지정해 호출하면 세금 포함 가격을 계산하여 반환하는 함수이다. 여기에서는 다음과 같이 인수 부분을 정의하고 있다.

tax(price p:Int, rate r:Double)

인수명은 p와 r이다. 함수 내부에서는 이러한 변수를 사용하여 계산하고 있다. 그럼 이를 호출하는 부분을 살펴 보자.

tax(price : 10000 rate : 0.08)

외부명으로 price과 rate를 지정하고 값을 작성하고 있다. 이렇게 하면 각각 인수의 역할은 명확하다.

복수의 인수를 가지는 함수의 경우, 어떤 인수가 무슨 역할을 하는지 외형으로는 알 수 없다. 그 함수의 레퍼런스 등으로 조사해 확인하고, 호출해 보지 않으면 쉽게 알 수 없다. 이 외부명을 사용하면, 하나씩 하나의 인수 역할을 한눈에 알 수 있다. 이렇게 함으로써 함수 호출에 관련하는 버그를 최초화 할 수 있다. 외부명을 사용하지 않으면 함수 호출은 아래 같다.

tax(10000, 0.08)

이 작성을 하면 코드를 작성한 본인 이외는 무슨 일을 하고 있는지 모른다. 외부명은 코드를 보다 알기 쉽게하는데 필수적인 기능이라고 할 수 있다.

숏헤드(shorthand)에 대해

외부명이 중요하다는 것을 알았다. 그렇지만 "일일이 외부명과 변수명을 2개나 이름을 작성하는 것은 귀찮은 일이다"라고 생각하는 사람도 많을 것이다. 이 경우는 변수명을 그대로 외부명으로 사용할 수 있도록 할 수 있다. 예를 들어, 예제 tax 함수라면 이렇게 작성한다.

func tax(price:Int, rate:Double) -> Int {
    return Int(Double(price) * (1.0 + rate))
}

var res:Int = tax(10000, rate:0.08)

인수의 변수명에 외부명만 사용하였다. 이것은 숏헤드(shorthand)라는 설정이다. 이렇게 하면 변수명이 그대로 외부명으로 사용할 수있게 된다. 함수 내에서 사용할 변수명과 외부명이 같기 때문에 소스 코드도 깔끔해지고 가독성 높아진다.



여러 반환값와 튜플(tuple)

Swift 함수는 매우 재미있는 특징을 가지고 있다. 그 중에서도 중요한 것은 여러 값을 반환하는 기능이다.

이것은 사실 Swift 함수에 비밀이 있는 것은 아니다. Swift 준비되어 있는 "튜플(tuple)"값에 비밀이 있다.

튜플은 여러 값을 한곳에 모아 처리하는 것이다. 이는 ()를 사용하여 쉽게 작성할 수 있다.

(이름:값, 이름:값, ...)

이렇게 생성된 튜플은 그것을 할당한 변수 등에서 이름을 지정하고 값을 얻어 낼 수 있다. 예를 들어, 이런한 형태이다.

var person = (name:"Taro", age:35)
person.name
person.age

여기에서 name과 age라는 값으로부터 튜플로 변수 person에 대입하고 있다. 이 값은 person.name과 person.age 형태로 꺼낼 수 있게 된다.

튜플(tuple)을 반환 값으로 사용

이 튜플의 개념을 알면 "여러 값을 반환"하는 함수도 간단하게 만들 수 있다.

아래 예제를 살펴 보도록 하겠다.

func tax(price:Int) -> (kakaku:Int, zei:Int) {
    let zei:Int = Int(Double(price) * 0.08)
    let kakaku:Int = price - zei
    return (kakaku:kakaku, zei:zei)
}

var res = tax(10000)
res.kakaku
res.zei

여기에서는 다음과 같이 반환 값을 지정할 수 있다.

-> (kakaku:Int, zei:Int)

이것으로 kakaku과 zei 두 값을 되는 튜플을 반환 값으로 지정된다. 그 후로는 함수의 반환값을 할당한 변수에서 kakaku과 zei값을 꺼내 사용하면 된다.


인수의 기본값

함수의 인수에 대해서 이 외에도 배워 두어야 하는 기능이 있다. 여기서는 "기본(default)값"에 대해 설명한다.

함수의 인수에는 미리 기본값을 지정해 둘 수 있다. 이는 인수에 마련한 변수에 등호(=)로 값을 대입하는 것만으로 가능하다. 아래와 같이 작성한다.

func 함수명(인수명:유형 = 기본값)

기본값을 지정하면 인수명은 자동으로 외부명이 되고, 외부에서 지정할 수 있게 된다. 그래서 샵(#)을 붙여 숏헤드 지정을 할 필요가 없다.

기본값을 지정하는 것은 "인수는 생략해도 좋다"라는 것이 된다. 결국은 함수를 호출 할 때, 그 인수가 있는지 없는지 몰라도 된다는 것이다 (없어도 상관없으니까). 이를 위해 기본값을 지정한 인수는 반드시 외부명을 지정해서 그것이 어떤 인수 값인지 알 수 있게 한다.

아래에 기본값의 이용 예제를 보도록 하자.

func tax(#price:Int, rate:Double = 0.08) -> Int {
    return Int(Double(price) * (1.0 + rate))
}
 
var res:Int = tax(price:10000, rate:0.08)
var res3:Int = tax(price:12300)

rate 인수를 생략하면 자동으로 0.08이 사용된다.



가변 인수

인수로 전달되는 항목이 몇개 인지 모르다......라는 경우에 사용되는 것이 가변 인수이다. 이것은 다음과 같이 작성한다.

(인수명:유형 ...)

이렇게 작성된 인수는 여러 값을 쉼표(,)로 연결해 쓸 수 있다. 호출된 함수 측에서는 이러한 값은 배열에 모은다. 즉, 가변 인수는 "배열을 인수로 지정하는 것"이라고 생각하면 좋을 것이다.

아래에 가변 인수의 예제를 보도록 하자.

func calc(nums:Int...) -> Int {
    var total:Int = 0
    for num in nums {
        total += num
    }
    return total
}
calc(1,2,3,4,5)

여기에서는

calc(nums:Int...) 

이와 같이 인수를 지정하고 있다. 그 호출 부분을 보면 아래와 같이 되어 있다.

calc(1,2,3,4,5) 

보면 알 수 있듯이, nums에 여러 값이 작성되어 있다. 이런 식으로 많은 값을 인수로 전달할 수 있는 것이 가변 인수이다. 함수의 처리를 보면,

for num in nums {...

이와 같이 인수 값을 for로 반복 처리하고 있다. 가변 인수의 값은 요소 수가 일정하지 않은 배열로, 이 같이 for문으로 처리하는 것이 기본이다.


INOUT 인수

Swift의 함수에서 다른 하나 더 알아야 하는 것이 "INOUT"인수이다. 이는 전달된 인수 자체를 다시 작성할 수 있는 특수 인수이다. 이것은 인수 전에 "inout"을 붙여야 한다.

(inout 인수명:유형)

이 INOUT 인수에 지정된 변수는 변수명 앞에 "&"를 붙인다. 또한, 당연하지만 리터럴 인수에 지정할 수 없다 (왜냐하면 리터럴은 고쳐 쓸 수 없기 때문이다).

아래에 INOUT 인수에 대한 예제를 보도록 하자.

func tax(inout price:Int, rate:Double = 0.08) -> Void {
    price = Int(Double(price) * (1.0 + rate))
}

var num = 12300
tax(&num)

여기에서는 함수의 정의를 다음과 같이 작성하고 있다.

tax(inout price:Int, rate:Double = 0.08)

첫 번째 price가 INOUT 인수로 되어 있다. 반환 값은 Void이다. 이 함수의 호출을 보면 이렇게 되어 있다.

tax(&num)

이것으로 변수 num의 값이 직접적으로 변경된다. 값을 돌려주는 것이 함수의 기본이지만, 이렇게 직접 고쳐 쓰는 것이 가능하게 된 것으로, 값 자체를 변경하는 변수를 사용할 수 있다.

반응형

'Swift' 카테고리의 다른 글

[Swift] 배열과 사전  (0) 2017.12.09
[Swift] 클래스 기본  (0) 2017.12.09
[Swift] 함수  (0) 2017.12.09
[Swift] 제어 구문  (0) 2017.12.09
[Swift] 값, 변수, 연산  (0) 2017.12.09
[Swift] Swift 사용 준비하기  (0) 2017.12.09

+ Recent posts