Function(함수)
-
독립적으로 수행되는 코드 블록. 클로저는 이름 없는 코드 블럭.
-
함수라고 할 때는 일반적으로 클래스나 구조체 외부에 생성.
-
클래스나 구조체 같은 형식 내부에 함수를 만들면 메소드라고 함.
-
함수 종류
-
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에서는 매개변수이름을 항상 기재해야 함.
-
내부와 외부에서 사용하는 이름을 다르게 설정
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
-
return: 함수의 수행을 중단하고 함수를 호출하는 곳으로 제어권을 이동.
-
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 |