Day 5
함수
- 함수는 항상 2단계로 실행됨
- 정의
- 소문자로 시작되는 게 일반적
- 호출(또는 실행)
- 정의
- 왜 쓰는 가?
- 반복되는 동작을 단순화해서 재사용 가능
- 코드를 논리적 단위로 구분 가능
- 코드 길이가 긴 것을 단순화해서 사용 가능
- 미리 함수를 잘 만들어 놓으면, 개발자는 사용만 하면 됨
- 소문자로 시작, 뒤에 ( ) 소괄호가 온다면, 이것이 함수의 실행이라는 것을 알아야 함.
// Input 존재
func saySomething(name: String) {
print("안녕하세용 \(name) 님")
}
saySomething(name: "Foden")
// Output 존재
func sayHello() -> String {
return "Hello World!"
}
var word = sayHell()
print(word)
// Input, Output 모두 존재
func plusFunction(a: Int, b: Int) -> Int {
let c = a + b
return c
}
print(plusFunction(a: 1, b: 2))
- 리턴 타입이 없는 함수 → 결과는 Void 타입
- 리턴 타입이 있는 함수 → 결과로 “값”이 있는 것 → (일반적으로)사용
- 파라미터(매개변수/인자)
- 함수의 정의에 입력값으로 사용되는 변수(상수)
- 인수
- 함수의 호출에 사용되는 실제 값
함수의 응용
1. 아규먼트 레이블
- 겉에서 볼 땐 first, 내부에선 name으로 사용
func printName1(first name: String) {
print("나의 이름은 \(name) 입니다.")
}
printName1(first: "뉴턴")
- 일반적으로 함수를 사용할때 더 명확하게 무엇을 요구하는 지 알려줄 수 있음
- 겉바속촉같은 느낌!
func someFunction1(writeYourFirst a: Int, writeYourSecondNumber b: Int) {
print(a+b)
}
someFunction(writeYourFirst: 1, writeYourSecondNumber: 2)
// 3
- 아규먼트 레이블을 생략해서 사용하는 것도 가능 (와일드카드 패턴)
func addintFunction(_ firstNum: Int, _ secondNum: Int) {
print(firstNum + secondNum)
}
addintFunction(1, 2)
// 3
// 만약 와일드카드 패턴을 사용하지 않았다면(의미가 명확함에도 불구)
// addintFunction(firstNum: 1, secondNum: 2)와 같이 번거롭게 사용
2. 가변파라미터
- 함수의 파라미터에 정해지지 않은, 여러개의 값을 넣는 것도 가능(Variadic Parameters)
- 하나의 파라미터로 2개 이상의 아규먼트를 전달할 수 있다.
- 배열형태로 전달됨.
- 가변 파라미터는 개별함수마다 하나씩만 선언할 수 있다. (선언 순서는 상관없음)
- 가변 파라미터는 기본값을 가질 수 없다.
func arithmeticAverage(_ numbers: Double...) -> Double {
var total = 0.0
for n in numbers {
total += n
}
return total / Double(numbers.count)
}
print(arithmeticAverage(1.5, 2.5))
// 2.0
// arithmeticAverage(numbers: 1.5, 2.5) 에서 numbers를 생략
3. 함수의 파라미터에 기본값(디폴트) 정하는 것도 가능
func numFunction(num1: Int, num2: Int = 5) -> Int {
var result = num1 + num2
return result
}
numFunction(num1: 3) // num2를 선언해주지 않으면 자동으로 5로 사용
numFunction(num1: 3, num2: 7)
- 아규먼트값이 항상 필요한 것이 아닐 수도 있음.
- 실제 애플이 미리 만들어 놓은 함수에는 기본값이 들어 있는 경우가 꽤 있음.
print("안녕하세요", "잡스", "님", separator: "", terminator: "\n")
// -> 안녕하세요잡스님
print("안녕하세요", "잡스", "님", separator: " ", terminator: "\n")
// -> 안녕하세요 잡스 님
// print(items: Any..., separator: String, terminator: String)
함수 사용시 주의점
- 파라미터의 이해
- 파라미터는 변수가 아닌 상수(let)이고, 함수 내부적으로만 쓰이므로 값의 변경이 불가능
- 변경을 하려면 새로운 변수를 선언해야함
- Scope(범위)
- 함수 내에서 선언한 변수는 함수 내에서 밖에 사용하지 못함
- 외부 변수는 함수 내에서 접근 가능
- return 키워드
- 리턴타입이 있는 함수의 경우
- : 리턴 키워드 다음의 표현식을 평가한 다음에 그 결과를 리턴하면서 함수를 벗어남
- 리턴타입이 없는 함수의 경우
- : 함수의 실행을 중지하고 함수를 벗어남
- → return 키워드의 역할
- 함수의 실행문
- 리턴 타입이 있는 함수를 호출하는 경우, 함수를 호출하는 것은 자체로 표현식(결과는 함수가 리턴하는 값)이라는 것을 인지하고 사용할 필요가 있음
- 함수의 중첩 사용
- 함수 내부에서 함수를 작성하여 사용하는 것도 가능
- 다만, 외부에서 내부 함수는 접근 불가능
함수의 표기법(지칭)
func doSomething() {
print("Hello")
}
// 함수의 표기법(함수를 지칭시)
// 1. 파라미터가 없는 경우, ()를 삭제
var some = doSomething
// some이라는 변수도 doSomething 함수를 가리킴
// 가리킨다 -> some도 실행할 수 있음 : some()
// 2. 아규먼트 레이블이 있는 경우, 아규먼트 레이블까지를 함수의 이름으로 봄
numberPrint(n:)
// 3. 파라미터가 여러개인 경우, 콤마없이 아규먼트이름과 콜론을 표기
chooseStepFunction(backwrd:value:)
// 아규먼트 레이블이 생략된 경우, 아래와 같이 표기
addPrintFunction(_:_:)
- 함수의 이름을 이야기할 땐, 파라미터의 이름까지를 말하는 것
- e.g : chooseStepFunction backward value.
- 함수를 지칭하는 것이 왜 필요하지?
- 함수를 실행하는 것 외에, 함수를 가리키는 것이 필요한 경우가 존재
- 개발자 문서를 읽기 위해
함수 타입의 표기
// 변수에 정수를 저장하는 경우에 타입 표기
var num: Int = 5
// 함수이 타입 표기 방법
var function1: (Int) -> () = numberPrint(n:)
var function2: (Int, Int) -> () = addPrintFunction(_:_:)
함수의 오버로딩
- 함수에 매개변수(파라미터)를 다르게 선언하여, 하나의 함수 이름에 실제 여러개의 함수를 대응 시키는 것
- 함수 이름의 재사용
- 스위프트는 오버로딩을 지원하는 언어
- 함수이름, 파라미터 수/자료형, 아규먼트 레이블, 리턴형을 모두 포함해서 함수를 식별
func doSomething(value: Int) {
print(value)
}
func doSomething(value: Double) {
print(value)
}
func doSomething(value: String) {
print(value)
}
func doSomething( value: String) {
print(value)
}
func doSomething(value1: String, value2: Int) {
print(value1, value2)
}
// doSomething(value: 5)
// doSomething(value: 3.4)
// doSomething(value: 3)
범위(Scope)에 대한 이해
- 중괄호 내에서 밖의 변수는 접근 가능, 중괄호 밖에서 중괄호 내의 변수는 접근 불가능
// E.g 1
func greeting1() {
print("Hello")
var myName = "Foden"
print(myName)
print(name) // Error!
if true {
print(myName)
print(name)
}
}
print(myName) // Error!
// E.g 2
func sayGreeting1() {
print("Hello")
func sayGreeting2() {
print("Hey")
if true {
}
}
sayGreeting2()
}
sayGreeting2() // Error!
반응형
'iOS > Swift' 카테고리의 다른 글
Swift No.8 (1) | 2024.01.09 |
---|---|
Swift Day 6 (0) | 2024.01.09 |
Swift Day 4 (0) | 2024.01.09 |
Swift Day 3 (0) | 2024.01.09 |
Swift Day 2 (0) | 2024.01.09 |