본문 바로가기

Swift

Swift - Function(함수)

Function(함수)

  • 독립적으로 수행되는 코드 블록. 클로저는 이름 없는 코드 블럭.

  • 함수라고 할 때는 일반적으로 클래스나 구조체 외부에 생성. 

  • 클래스나 구조체 같은 형식 내부에 함수를 만들면 메소드라고 함. 

  1. 함수 종류 

  • Maker Function: 애플이 제공하는 함수. 

  • User Define Function : 개발자가 만든 함수. 

  • 3rd Party Function : 다른 개발자가 만든 함수. 

* swift에서는 3rd party function을 잘 사용하지 않음. 

 

2. 함수를 만드는 이유 

  • 코드중복을 제거해서 유지보수를 편리하게 하기 위해서. 

  • 프로그램의 작업단위가 함수인데, 함수는 메모리 크기가 정해져 있어서 너무 많은 양의 코드를 하나의 블럭에 만들면 stack overflow가 발생할 수 있기 때문에. 

  • 코드의 가독성을 높이기 위해서. 

 

3. 함수 생성 

func 함수이름 (매개변수이름: 자료형,....) -> 리턴타입 { 

함수의 내용 

 

⇒ 리턴타입이 없으면, 생략이 가능하고, Void라고 써도 됨. Void사용시 대소문자 주의.

 

4. 함수 호출 

함수 이름(매개변수이름: 데이터…) 

⇒ 기본적으로 매개변수 이름은 반드시 기재해야 함. 

 

//매개변수 없는 함수

func noArg() {

    print("매개변수가 없는 함수")

}

 

//매개변수가 있는 함수

func oneArg(n:Int) {

    print("매개변수:", n)

}

 

//매개변수가 없는 함수 호출

noArg()

//매개변수가 있는 함수를 호출할때 매개변수 이름을 기재해서 데이터를 넘겨야 함.

//oneArg(10) // error

oneArg(n: 10) // ok

 

5. 매개변수(Argument)

⇒ 함수를 호출하는 쪽에서 함수에게 넘겨주는 데이터.

⇒ 매개변수는 없을 수도 있음. 

⇒ swift에서는 매개변수이름을 항상 기재해야 함. 

  1.  내부와 외부에서 사용하는 이름을 다르게 설정 

func 함수이름(외부에서사용할이름 내부에서사용할이름 : 자료형,...) { 

내부코드… 

⇒ 애플은 함수를 만들때 함수이름을 보면 어떤일을 할 수 있을지 파악할 수 있도록 이름을 길게 만들고, 매개변수이름도 어떤 종류의 데이터를 대입해야 하는지 길게 만듬. 

  • 매개변수 이름이 너무 길면 내부에서 코드를 작성할때 불편하기 때문에, 내부에서는 매개변수의 이름을 간략하게 만들어서 사용하려고 이 방법을 제공.

ex) 정수 2개를 더해서 리턴해주는 함수 

func add(n1:Int, n2:Int){

 

애플의 경우:

func integerAddWithInteger(firstOpertaor n1 : Int, secondOperator n2 : Int) { 

 

}

2) 매개변수 이름 생략 가능

=> 매개변수 이름을 생략하고 대입받고자 하는 경우에는 이름 대신에 _ (언더바)만 기재하면 됨.

  • 이기능도 보통 첫번째 매개변수에만 적용. 

  • 누구나 예측 가능한 매개변수인 경우 이름을 생략하는 경우가 있음. 

ex: 테이블 뷰의 셀의 개수를 설정해주는 함수, 데이터를 받아서 그래프를 그려주는 함수 .

  • 매개변수 순서도 중요. 보통 필수적으로 꼭필요한 매개변수를 앞에 사용.

 

//내부와 외부에서 매개변수 이름을 다르게 설정

// 함수를 호출할 때는 integer 내부에서 사용할 때는 n 

func aliasArg(integer n: Int) {

    print("대입한 값:", n)

}

//함수를 호출할 때는 앞에 있는 이름으로 대입. 

// aliasArg(n: 5) //error

aliasArg(integer: 5) //ok

 

//매개변수를 생략하는 함수를 만들 때는 반드시 별명을 사용해야 함. 

// error

func hiddenArg(_ : Int) {

    print("매개변수 생략")

}

hiddenArg(100)

// ok

func hiddenArg(_ n: Int) {

    print("매개변수 생략", n)

}

hiddenArg(100)

 

3) 매개변수에 기본값 대입

func 함수이름(매개변수이름:자료형 = 기본값,...) 

⇒ 매개변수를 생략하면 기본값을 가지고 함수를 수행.

⇒ 매개변수를 대입해주면 그 값을 가지고 함수를 수행. 

 

//두번째 매개변수는 생략하면 50으로 간주

func intAdd(n1 : Int, n2 : Int = 50) {

    print("더한 결과:", n1+n2)

}

 

intAdd(n1:100, n2:200) // 결과값: 300

intAdd(n1:300) // 결과값: 350

 

4) 매개변수의 개수를 가변으로 설정 

func 함수이름(매개변수이름:자료형... ) 

=> 매개변수 이름 뒤에 몇개의 데이터를 입력해도 됨. 

=> 내부에서는 list로 처리함. 

//매개변수의 개수를 가변

//내부에서는 list로 사용.

func avg(_ n1 : Int...){

    for x in n1 {

        print(x)

    }

}

 

avg(10, 20)

avg(10, 20, 40)

avg(5)

 

5) 함수의 매개변수는 기본적으로 let 

  • 내부에서 데이터를 변경할 수 없음. 

  • 자료형 앞에 inout을 붙이면 변수의 참조가 전달되서, 내부에서 변경이 가능. 

  • 매개변수를 대입할 때는 &변수명의 형태로 전달해야 함. 

 

// 스위프트에서는 함수의 매개변수를 넘길 때 let으로 설정.

//함수 내부에서 외부 매개변수의 값을 수정할 수 없음.

//매개변수의 자료형 앞에 inout을 붙이면 참조가 전달되서, 수정이 가능.

//함수를 호출할 때는 &변수의 형태로 데이터를 전달.

// 아래는 에러

var x : Int = 10

func inc(n : Int) {

    n = n + 1

    print(n)

}

//아래와 같이 해야함. 

var x : Int = 10

func inc(n : inout Int) {

    n = n + 1

    print(n)

}

//참조를 넘겼기 때문에 함수 내부에서 데이터를 변경할 수 있음.

//함수의 매개변수가 &를 붙여서 요청하면 이 함수는 내부에서 데이터를 변경하려고 하는 것임. 

inc(n : &x)

print(x)

 

6. return 

  1. return: 함수의 수행을 중단하고 함수를 호출하는 곳으로 제어권을 이동. 

  2. return type: 함수의 수행이 종료될 때 함수를 호출한 곳으로 넘겨주는 데이터의 자료형. 

func 함수이름(매개변수) -> return type { 

return 데이터 

  • 리턴할 데이터가 없다면 return type에 Void라고 적어도 되고, 생략해도 됨. 

  • return Void이면, return도 생략 가능. 

 

7. 스위프트에서는 함수가 일급객체

  • 함수를 변수나 상수에 대입이 가능. 

  • 함수 이름만 사용하면 함수가 저장된 곳의 참조임. 

  • 스위프트는 이방법을 이용해서 delegate패턴의 이벤트 처리를 함.  

 

//함수의 결과 저장이 아닌 함수 자체를 저장

//inc의 참조를 f에 대입.

var f = inc

//함수 이름만 기재하면 함수의 참조를 출력

print(inc)

f(&x)

print(x)

 

8. 함수 안에 함수를 생성할 수 있음. 

 

'Swift' 카테고리의 다른 글

Swift - Optional(옵셔널)  (0) 2020.03.20
Swift - First Class Citizen  (0) 2020.03.19
Swift - Closure(클로저)  (0) 2020.03.19
Swift - Collection(배열,딕셔너리, 셋)  (0) 2020.03.17
Swift - 변수와 상수(Constant and Variables in Swift)  (0) 2020.03.16