You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
함수(Function)은 특정 기능을 실행하기 위한 코드의 덩어리
함수가 어떤 일을 하는지 식별하기 위해 네이밍 가능
함수명을 통해 필요한 시점에 호출하여 실행
Swift의 통합 함수 구문은 매개변수 이름이 없는 간단한 C 스타일 함수에서
각 매개변수에 대한 이름과 인수 레이블이 있는 복잡한 Objective-C 스타일 메서드에 이르기까지
모든 것을 표현할 수 있을 만큼 충분히 유연
인자와 반환 값을 포함하여, 함수는 내/외부로 타입을 가짐
이러한 타입을 Swift의 다른 타입들처럼 활용 가능
ex. 다른 함수에 인자로 함수가 들어갈 수 있고, 다른 함수로부터 함수를 반환받을 수도 있음
함수는 중첩된 함수 범위 내에서 유용한 기능을 캡슐화하기 위해 다른 함수 내에 작성도 가능
함수의 정의 및 호출
함수를 정의할 때, 선택적으로 하나 이상의 매개변수와 반환 타입을 정의 가능
모든 함수는 이름을 갖고 있으며, 이를 통해 함수를 호출하고 매개변수의 타입에 맞는 값을 인수로 전달 가능
함수의 인수는 반드시 매개변수와 같은 순서로 제공되어야 한다
argument = 전달인자 = 값 = 인수
parameter = 매개변수 = 변수 = 인자
func greet(person:String)->String{letgreeting="Hello, "+ person +"!"return greeting
}func greetAgain(person:String)->String{return"Hello again, "+ person +"!"}print(greet(person:"Anna"))
// Prints "Hello, Anna!"
print(greet(person:"Brian"))
// Prints "Hello, Brian!"
print(greetAgain(person:"Anna"))
// Prints "Hello again, Anna!"
함수를 선언할 때는 가장 앞에 func 키워드를 붙이고
(person: String) 매개변수 이름과 타입
-> String 형태로 반환 타입을 정의
이러한 정의는 함수가 무엇을 하는지, 어떤 것을 받게 되는지, 수행되었을 때 무엇을 반환하는지를 기술
함수의 본문을 더 짧게 만들기 위해 메시지 생성과 return 문을 한 줄로 결합 가능
ex. print(_:separator:terminator:) 함수는 첫 번째 매개변수인 _(String 메세지)는 인수 라벨과 파라미터 이름이 존재하지 않는다
또한, 다른 매개변수들은 기본 값이 존재하기 때문에 Optional이다
함수의 매개변수와 반환 값(Function Parameters and Return Values)
Swift의 매개변수는 극단적으로 플렉서블하다
이름이 없는 단일 매개변수가 있는 단순한 유틸리티 함수에서 부터
표현적인 매개변수 이름과 다양한 매개변수 옵션이 있는 복잡한 함수에 이르기까지 무엇이든 정의 가능
1) 매개변수가 없는 함수(Functions Without Parameters)
함수는 매개변수를 반드시 필요로 하지는 않음
func sayHelloWorld()->String{return"hello, world"}print(sayHelloWorld())
// Prints "hello, world"
2) 매개변수가 있는 함수(Functions With Multiple Parameters)
함수는 소괄호 안에 쓰여지는 여러 개의 매개변수를 가지는 것이 가능
매개변수는 콤마로 분리
func greet(person:String){print("Hello, \(person)!")}greet(person:"Dave")
// Prints "Hello, Dave!"
// 반환 값이 필요 없기 때문에, 함수의 정의는 반환 화살표(->)나 반환 타입을 포함하지 않는다.
명백히 말하자면, greet(person:) 함수는 반환 값이 정의되지 않았음에도 불구하고 값을 반환
정의된 반환 값이 없는 함수는 Void 타입이라는 특수한 값을 반환
간단히 말하자면 이것은 빈 튜플이며, ()로 표현
호출할 때 반환 값을 무시할 수도 있다
반환 값을 할당하면서 _ 와일드 카드를 통하여 해당 반환 값을 무시
func printAndCount(string:String)->Int{print(string)return string.count
}func printWithoutCounting(string:String){let _ =printAndCount(string: string)}printAndCount(string:"hello, world")
// prints "hello, world" and returns a value of 12
printWithoutCounting(string:"hello, world")
// prints "hello, world" but does not return a value
반환 값이 무시되어도 함수는 항상 값을 반환
정의된 반환 타입이 있는 함수는 반환 값이 없는 상태를 허용하지 않으며, 없을 경우 컴파일 에러를 발생시킨다
4) 여러 값을 반환하는 함수(Functions with Multiple Return Values)
튜플을 사용해 여러가지 값을 묶어서 반환 가능
func minMax(array:[Int])->(min:Int, max:Int){varcurrentMin=array[0]varcurrentMax=array[0]forvalueinarray[1..<array.count]{if value < currentMin {
currentMin = value
}elseif value > currentMax {
currentMax = value
}}return(currentMin, currentMax)}letbounds=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"
튜플의 원소는 함수 반환 타입의 일부분으로써 이름이 붙여지기 때문에,
점 문법(.)을 사용해 각각의 튜플 값에 접근 가능
튜플 멤버의 이름은 이미 함수의 반환 값 타입의 일부분으로써 명명되었기 때문에,
튜플의 원소는 함수가 반환될 때 별도로 멤버 이름을 붙여 줄 필요가 없다
5) 옵셔널 튜플 반환 타입
만약 함수로부터 반환되는 튜플이 값을 갖지 않을 가능성이 있을 경우
옵셔널로 반환 타입을 선언 가능(전체 튜플이 nil이 될 수 있음)
튜플의 닫는 소괄호 뒤에 ?를 붙임
(Int, Int)?와 (Int?, Int?)는 엄연히 다르다
전자는 튜플이 옵셔널인 것이고, 후자는 튜플 안의 원소가 옵셔널인 것
위의 minMax(array:) 함수는 만약 인자로 빈 배열이 들어온다면 런타임 에러가 발생할 것
따라서, 옵셔널 튜플 타입을 반환하도록 수정
func minMax(array:[Int])->(min:Int, max:Int)?{if array.isEmpty {returnnil}varcurrentMin=array[0]varcurrentMax=array[0]forvalueinarray[1..<array.count]{if value < currentMin {
currentMin = value
}elseif value > currentMax {
currentMax = value
}}return(currentMin, currentMax)}iflet 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"
// 옵셔널 바인딩을 통해 nil이 반환될 경우에 대처 가능
6) 암시적 반환을 하는 함수
만약 전체 표현식이 한 줄이라면, 해당 표현식을 반환 가능
축약형 Getter 선언 등 해당 기능에서 암시적 반환 활용 가능
암묵적인 반환 값으로 작성하는 코드는 일부 값을 반환 필요
ex. print(13)를 암묵적인 반환 값으로 사용 불가능
그러나, swift가 암묵적 반환이 발생하지 않는다는 것을 알고 있는 경우엔 사용 가능
ex. fatalError("Oh no!")와 같이 절대 반환되지 않는 함수를 암묵적 반환 값으로 사용 가능
func greeting(for person:String)->String{"Hello, "+ person +"!"}print(greeting(for:"Dave"))
// Prints "Hello, Dave!"
func anotherGreeting(for person:String)->String{return"Hello, "+ person +"!"}print(anotherGreeting(for:"Dave"))
// Prints "Hello, Dave!"
함수 인자 라벨과 매개변수 이름(Function Argument Labels and Parameter Names)
함수의 각 매개변수는 인자 라벨과 매개변수 이름을 갖고 있다
인자 라벨은 주로 함수를 외부에서 호출할 때 이용
매개변수 이름은 함수의 내부에서 구현에 사용
인자 라벨의 기본 값은 매개변수 이름으로 구성된다
func someFunction(firstParameterName:Int, secondParameterName:Int){
// In the function body, firstParameterName and secondParameterName
// refer to the argument values for the first and second parameters.
}someFunction(firstParameterName:1, secondParameterName:2)
모든 매개변수는 반드시 고유한 이름을 가져야 한다
서로 다른 매개변수가 동일한 라벨을 가질 수 있긴 하지만,
고유한 인자 라벨을 붙이는 것이 가독성 측면에 더 좋음
1) 인자 라벨 설정
매개변수 이름 앞에 인자 라벨을 작성
func someFunction(argumentLabel parameterName:Int){
// In the function body, parameterName refers to the argument value
// for that parameter.
}
2) 인자 라벨 생략
매개변수의 인자 라벨을 사용하고 싶지 않을 경우, 언더스코어(_)를 매개변수 앞에 작성하여 생략할 수 있다.
func someFunction(_ firstParameterName:Int, secondParameterName:Int){
// In the function body, firstParameterName and secondParameterName
// refer to the argument values for the first and second parameters.
}someFunction(1, secondParameterName:2)
만약 매개변수가 인자 라벨을 갖고 있다면, 함수를 호출할 때 반드시 인자를 라벨로 표기해야 한다
3) 매개변수의 기본 값(Default Parameter Values)
함수의 매개변수를 정의할 때, 매개변수 타입 다음에 기본 값을 설정 가능
기본 값을 설정했다면, 함수를 호출할 때 매개변수를 생략 가능
기본값이 없는 매개변수는 기본값이 있는 매개변수보다 함수 매개변수 목록의 시작 부분에 배치
보통 기본 값을 설정하지 않는 매개변수는 함수에게 더 중요한 의미를 가진다
func someFunction(parameterWithoutDefault:Int, parameterWithDefault:Int=12){
// If you omit the second argument when calling this function, then
// the value of parameterWithDefault is 12 inside the function body.
}someFunction(parameterWithoutDefault:3, parameterWithDefault:6) // parameterWithDefault is 6
someFunction(parameterWithoutDefault:4) // parameterWithDefault is 12
4) 임의의 갯수의 인수를 받을 수 있는 매개변수(Variadic Parameters)
해당 매개변수는 0개 이상의 값을 허용한다
함수가 호출될 때 변화하는 입력 값을 받을 수 있을 때 해당 매개변수를 사용
매개변수에 특정 타입을 명시하고 온점 셋(...)을 붙임으로써 작성하며, 메서드가 호출될 때 전달되어 사용
가변할 수 있는(Variadic) 매개변수로서 전달 되는 매개변수는
메서드 블럭 내에서 적절한 타입의 배열로서 구성
함수는 여러 가변 매개변수를 가질 수 있음
가변 매개변수 다음에 오는 첫 번째 매개변수에는 인수 레이블이 반드시 있어야 함
인수 레이블은 가변 매개변수에 전달되는 인수와 가변 매개변수 다음에 오는 매개변수에 전달되는 인수를 명확하게 구분짓는 역할
func arithmeticMean(_ numbers:Double...)->Double{vartotal:Double=0fornumberin 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
5) 인-아웃 매개변수
함수의 매개변수는 기본적으로 상수
함수 안에서 매개변수를 바꾸려고 할 경우, 컴파일 에러가 발생 - 실수에 의해 매개변수의 값이 바뀌는 것을 방지
만약 매개변수의 값을 함수에서 수정하고, 호출이 끝난 뒤에도 수정 값을 유지하고 싶다면 인-아웃 매개변수를 사용
매개변수 타입 앞에 inout 키워드를 덧붙임으로써 인-아웃 매개변수를 작성
인-아웃 매개변수는 함수 안에서 수정될 수 있는 값을 갖는다
오직 변수만 인-아웃 매개변수에 넣을 수 있으며, 상수나 리터럴 값은 불가능
함수 호출 시 매개변수 앞에 & 기호를 붙임으로써 해당 매개변수가 함수 안에서 수정될 수 있음을 표시
func swapTwoInts(_ a:inoutInt, _ b:inoutInt){lettemporaryA= a
a = b
b = temporaryA
}varsomeInt=3varanotherInt=107swapTwoInts(&someInt,&anotherInt)print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"
인-아웃 매개변수는 기본 값을 가질 수 없으며
또한, Variadic 매개변수는 inout 키워드로 선언될 수 없다
함수의 타입
모든 함수는 매개변수 또는 반환 값 타입으로 사용될 수 있는 특정한 타입을 가진다
func addTwoInts(_ a:Int, _ b:Int)->Int{return a + b
}func multiplyTwoInts(_ a:Int, _ b:Int)->Int{return a * b
}
// 위 두 함수는 모두 두 개의 Int 타입 매개변수를 인자로 받아 Int 값을 반환한다.
// 함수들의 타입은 (Int, Int) -> Int가 된다.
func printHelloWorld(){print("hello, world")}
// 이 함수의 타입은 () -> Void이다.
1) 함수 타입 사용하기
함수 타입을 다른 타입과 같이 사용 가능하다
ex. 함수 타입으로 상수 또는 변수를 정의하고 적당한 함수를 할당 가능
func addTwoInts(_ a:Int, _ b:Int)->Int{return a + b
}func multiplyTwoInts(_ a:Int, _ b:Int)->Int{return a * b
}varmathFunction:(Int,Int)->Int= addTwoInts
// addTwoInts(_:_:) 함수는 mathFunction과 같은 타입이기 때문에 Swift의 타입 체커에 의해 할당이 허용
print("Result: \(mathFunction(2,3))")
// Prints "Result: 5"
// mathFunction으로 할당된 addTwoInts 함수를 다음과 같이 사용
mathFunction = multiplyTwoInts
print("Result: \(mathFunction(2,3))")
// Prints "Result: 6"
// mathFunction으로 다시 할당된 multiplyTwoInts 함수를 다음과 같이 사용
// 같은 타입을 갖는 다른 함수를 비함수 타입과 동일하게 같은 변수에 할당할 수 있다
letanotherMathFunction= addTwoInts
// anotherMathFunction is inferred to be of type (Int, Int) -> Int
// Swift의 다른 타입처럼, 함수를 상수/변수에 할당할 때 타입 추론을 적용
함수(Function)은 특정 기능을 실행하기 위한 코드의 덩어리
함수가 어떤 일을 하는지 식별하기 위해 네이밍 가능
함수명을 통해 필요한 시점에 호출하여 실행
Swift의 통합 함수 구문은 매개변수 이름이 없는 간단한 C 스타일 함수에서
각 매개변수에 대한 이름과 인수 레이블이 있는 복잡한 Objective-C 스타일 메서드에 이르기까지
모든 것을 표현할 수 있을 만큼 충분히 유연
인자와 반환 값을 포함하여, 함수는 내/외부로 타입을 가짐
이러한 타입을 Swift의 다른 타입들처럼 활용 가능
ex. 다른 함수에 인자로 함수가 들어갈 수 있고, 다른 함수로부터 함수를 반환받을 수도 있음
함수는 중첩된 함수 범위 내에서 유용한 기능을 캡슐화하기 위해 다른 함수 내에 작성도 가능
함수의 정의 및 호출
함수를 정의할 때, 선택적으로 하나 이상의 매개변수와 반환 타입을 정의 가능
모든 함수는 이름을 갖고 있으며, 이를 통해 함수를 호출하고 매개변수의 타입에 맞는 값을 인수로 전달 가능
함수의 인수는 반드시 매개변수와 같은 순서로 제공되어야 한다
argument = 전달인자 = 값 =
인수
parameter =
매개변수
= 변수 = 인자함수를 선언할 때는 가장 앞에 func 키워드를 붙이고
(person: String) 매개변수 이름과 타입
-> String 형태로 반환 타입을 정의
이러한 정의는 함수가 무엇을 하는지, 어떤 것을 받게 되는지, 수행되었을 때 무엇을 반환하는지를 기술
함수의 본문을 더 짧게 만들기 위해 메시지 생성과 return 문을 한 줄로 결합 가능
함수의 매개변수와 반환 값(Function Parameters and Return Values)
Swift의 매개변수는 극단적으로 플렉서블하다
이름이 없는 단일 매개변수가 있는 단순한 유틸리티 함수에서 부터
표현적인 매개변수 이름과 다양한 매개변수 옵션이 있는 복잡한 함수에 이르기까지 무엇이든 정의 가능
1) 매개변수가 없는 함수(Functions Without Parameters)
함수는 매개변수를 반드시 필요로 하지는 않음
2) 매개변수가 있는 함수(Functions With Multiple Parameters)
함수는 소괄호 안에 쓰여지는 여러 개의 매개변수를 가지는 것이 가능
매개변수는 콤마로 분리
3) 반환 값이 없는 함수(Functions Without Return Values)
함수는 반환 값을 반드시 필요로 하지는 않는다 - Just 로직 실행
호출할 때 반환 값을 무시할 수도 있다
반환 값을 할당하면서 _ 와일드 카드를 통하여 해당 반환 값을 무시
4) 여러 값을 반환하는 함수(Functions with Multiple Return Values)
튜플을 사용해 여러가지 값을 묶어서 반환 가능
튜플의 원소는 함수 반환 타입의 일부분으로써 이름이 붙여지기 때문에,
점 문법(.)을 사용해 각각의 튜플 값에 접근 가능
튜플 멤버의 이름은 이미 함수의 반환 값 타입의 일부분으로써 명명되었기 때문에,
튜플의 원소는 함수가 반환될 때 별도로 멤버 이름을 붙여 줄 필요가 없다
5) 옵셔널 튜플 반환 타입
만약 함수로부터 반환되는 튜플이 값을 갖지 않을 가능성이 있을 경우
옵셔널로 반환 타입을 선언 가능(전체 튜플이 nil이 될 수 있음)
튜플의 닫는 소괄호 뒤에 ?를 붙임
위의 minMax(array:) 함수는 만약 인자로 빈 배열이 들어온다면 런타임 에러가 발생할 것
따라서, 옵셔널 튜플 타입을 반환하도록 수정
6) 암시적 반환을 하는 함수
만약 전체 표현식이 한 줄이라면, 해당 표현식을 반환 가능
축약형 Getter 선언 등 해당 기능에서 암시적 반환 활용 가능
함수 인자 라벨과 매개변수 이름(Function Argument Labels and Parameter Names)
함수의 각 매개변수는 인자 라벨과 매개변수 이름을 갖고 있다
인자 라벨은 주로 함수를 외부에서 호출할 때 이용
매개변수 이름은 함수의 내부에서 구현에 사용
인자 라벨의 기본 값은 매개변수 이름으로 구성된다
모든 매개변수는 반드시 고유한 이름을 가져야 한다
서로 다른 매개변수가 동일한 라벨을 가질 수 있긴 하지만,
고유한 인자 라벨을 붙이는 것이 가독성 측면에 더 좋음
1) 인자 라벨 설정
매개변수 이름 앞에 인자 라벨을 작성
2) 인자 라벨 생략
매개변수의 인자 라벨을 사용하고 싶지 않을 경우, 언더스코어(_)를 매개변수 앞에 작성하여 생략할 수 있다.
만약 매개변수가 인자 라벨을 갖고 있다면, 함수를 호출할 때 반드시 인자를 라벨로 표기해야 한다
3) 매개변수의 기본 값(Default Parameter Values)
함수의 매개변수를 정의할 때, 매개변수 타입 다음에 기본 값을 설정 가능
기본 값을 설정했다면, 함수를 호출할 때 매개변수를 생략 가능
기본값이 없는 매개변수는 기본값이 있는 매개변수보다 함수 매개변수 목록의 시작 부분에 배치
보통 기본 값을 설정하지 않는 매개변수는 함수에게 더 중요한 의미를 가진다
4) 임의의 갯수의 인수를 받을 수 있는 매개변수(Variadic Parameters)
해당 매개변수는 0개 이상의 값을 허용한다
함수가 호출될 때 변화하는 입력 값을 받을 수 있을 때 해당 매개변수를 사용
매개변수에 특정 타입을 명시하고 온점 셋(...)을 붙임으로써 작성하며, 메서드가 호출될 때 전달되어 사용
가변할 수 있는(Variadic) 매개변수로서 전달 되는 매개변수는
메서드 블럭 내에서 적절한 타입의 배열로서 구성
함수는 여러 가변 매개변수를 가질 수 있음
가변 매개변수 다음에 오는 첫 번째 매개변수에는 인수 레이블이 반드시 있어야 함
인수 레이블은 가변 매개변수에 전달되는 인수와 가변 매개변수 다음에 오는 매개변수에 전달되는 인수를 명확하게 구분짓는 역할
5) 인-아웃 매개변수
함수의 매개변수는 기본적으로 상수
함수 안에서 매개변수를 바꾸려고 할 경우, 컴파일 에러가 발생 - 실수에 의해 매개변수의 값이 바뀌는 것을 방지
만약 매개변수의 값을 함수에서 수정하고, 호출이 끝난 뒤에도 수정 값을 유지하고 싶다면 인-아웃 매개변수를 사용
매개변수 타입 앞에 inout 키워드를 덧붙임으로써 인-아웃 매개변수를 작성
인-아웃 매개변수는 함수 안에서 수정될 수 있는 값을 갖는다
오직 변수만 인-아웃 매개변수에 넣을 수 있으며, 상수나 리터럴 값은 불가능
함수 호출 시 매개변수 앞에 & 기호를 붙임으로써 해당 매개변수가 함수 안에서 수정될 수 있음을 표시
함수의 타입
모든 함수는 매개변수 또는 반환 값 타입으로 사용될 수 있는 특정한 타입을 가진다
1) 함수 타입 사용하기
함수 타입을 다른 타입과 같이 사용 가능하다
ex. 함수 타입으로 상수 또는 변수를 정의하고 적당한 함수를 할당 가능
2) 매개변수로 사용되는 함수 타입
(Int, Int) -> Int와 같은 함수 타입을 다른 함수의 매개변수로써 사용
3) 반환 타입으로 사용되는 함수 타입
다른 함수의 반환 타입으로써 함수 타입을 사용
함수 타입을 화살표(->) 뒤에 작성함으로써 사용
중첩 함수
지금까지의 모든 함수는 전역 범위에서 정의된 전역 함수였음
함수 안에 다른 함수를 선언할 수도 있는데, 이를 중첩 함수라 함
중첩 함수는 바깥으로부터는 숨겨져 있으며,
함수 내부에서만 호출되고 사용 가능 - 같은 블록 레벨에서 사용 가능
함수 내부에서 중첩 함수 중 하나를 바깥 다른 범위에서 사용될 수 있게 반환 값으로 전달 가능
The text was updated successfully, but these errors were encountered: