함수
Swift의 함수는 기본적으로 1. 함수이름, 2. 매개변수, 반환타입을 사용하여 함수를 정의합니다
//매개변수란 = 함수를 호출할 때 인수로 전달된 값을 함 수 내부에서 사용할 수 있게 해주는 변수입니다.
//반환타입이란 = 원하는 타입을 받는 것
func 함수이름(매개변수...) -> 반환 타입 {
실행 구문
return 반환 값
}
swift에서 원하는 타입을 받기 위해서는 →를 사용합니다
func printName() {
print("my name")
}
printName()
함수에는 매개변수와 반환타입이 없어도 사용가능 합니다
func printName(age: Int, Name: String) {
print("my age is \\(age) and my name is \\(Name)")
}
printName(age: 17, Name: "박준하")
기본적인 함수의 구조이며 함수를 사용시 정했던 타입형식에 맞게 작성해야 오류를 피할 수 있다
func printName(나이 age: Int, 이름 Name: String) {
print("my age is \\(age) and my name is \\(Name)")
}
printName(나이: 17, 이름: "박준하")
위처럼 전달인자가 있는 경우에는 다른 누군가가 코드를 볼떄 가독성이 높아질 것입니다
//전달인자란 = 매개변수 앞에 붙는 것 (위코드의 전달인자는 ‘나이’와 ‘이름’이 전달인자다
func printName(나이 age: Int = 17, 이름 Name: String) {
print("my age is \\(age) and my name is \\(Name)")
}
//나이는 defaultValue
printName(이름: "박준하")
//나이 변경이 가능함 어디까지나 default임
printName(나이: 18, 이름: "박준하")
함수에도 defaultValue를 정해서 아무것도 입력하지 않았을 경우를 대비할 수 있다 하지만 defaultValue를 적었다고 해서 변경이 불가한 것은 아니다 물론 defaultValue를 사용하면 swfit에서 함숫값에 default값을 안주지만 우리가 손수 다시 쓰면 값을 다시 바꿀 수 있다
func printName(age: Int, Name: String) -> String {
let userName = "나이는 \\(age) 이름은 \\(Name)"
return userName
}
let junhaName = printName(age: 17, Name: "박준하")
//junhaName //"나이는 17 이름은 박준하"
함수를 변수 안에 담아서도 출력할 수 있다 하지만 함수를 담으려면 꼭 return 값이 있어야 한다
// In-out paramter
var age = 4
func printAge(_ age: inout Int) {
age += 1
print(age)
}
printAge(&4)
//출력 5
기존 우리는 함수 내부의 파라미터를 바꿀 수 없었다, 만약 우리가 실수를 해서라도 변경할 수 없다는 뜻이다 하지만 파라미터의 값을 변경하고 싶거나 변경된 값이 종료 후에도 계속 지속되기를 바란다면 inout파라미터를 사용하면 된다)
in-out 파라미터는 함수 정의 시 파라미터의 타입 전에 inout 키워드를 추가하면 된다. in-out 파라미터는 변수(variable)만을 취급하며 함수의 인자로 전달할 때 & 를 사용하여 해당 값이 함수내부에서 변경될 것임을 나타내야 한다.
inout의 원리는
- 함수가 호출되면, 매개변수로 넘겨진 변수가 복사된다.
- 함수 몸체에서, 복사한 값을 수정한다.
- 함수가 반환될 때, 변화된 값을 원본 변수에 재할당한다.
//Function as a paramter
func add(a: Int, b: Int) {
return a + b
}
func subtract(a: Int, b: Int) {
return a - b
}
var function = add
function(5, 2) // 7
function = subtract
function(5, 2) // 3
//함수 타입이 같아야함
func printResult(_ function: (Int, Int) -> _ a: Int, _ b: Int) {
let result = function(a,b)
print(result)
}
printResult(add, 10, 5) // 15
printResult(subtract, 10, 5) // 5
위 같은 경우 함수를 변수나 데이터 구조로 담는 것을 “일급 객체"라고 하는데 5가지를 충족해야지 1급 객체가 될 수 있다
- 변수나 데이터 구조 안에 담을 수 있습니다.
- 리턴 값으로 사용할 수 있습니다.
- 전달 인자 (Argument)로 전달이 가능합니다.
- 동적 프로퍼티 할당이 가능합니다.
- 할당할 때 사용된 이름과 관계없이 고유한 객체로 구별 가능합니다.