No.9
- 스터디 준비 자료
함수
- 정의 → 호출
- 호출은 함수명 + ( ) 를 해준다
- 이는 다양한 컬렉션 메서드 에서도 볼 수 있음. e.g : “let emptyarr2 = Array()”
- 호출은 함수명 + ( ) 를 해준다
- Argument Label
- 좀 더 확실한 의미를 전달하기 위해 사용하는 거 같음. 코드 의미 전달 Up
- WildCard Pattern
- 그럴 필요 없을 때, 간단하게 사용하고 싶을 때
- 가변 파라미터 사용 시 주의할 점
- 가변 파라미터는 기본값을 가질 수 없고, 하나의 파라미터에서밖에 사용을 못함
func ari(_num1: Int..., _ num: Int, _ numbers: Int...) { print(numbers.count) } // Error! -> 가변 파라미터 뒤에는 레이블을 반드시 사용해야 함.
- 함수 사용시 주의점
- 함수 표기법
- 파라미터가 없는 경우, ()를 삭제
- 아규먼트 레이블이 있는 경우, 아규먼트 레이블까지를 함수의 이름으로 봄
- 파라미터가 여러개인 경우, 콤마없이 아규먼트이름과 콜론을 표기
- 아규먼트 레이블이 생략된 경우, 아래와 같이 표기
- 함수 타입의 표기
- 변수에다가 함수를 대입하면 그 변수는 함수 타입(Function Type)을 가지는 변수.
- 함수 타입을 사용할 수 있어 우리는 고차함수, 콜백 함수를 사용할 수 있다 → 추후에 문법 강의에서 다룸
- 자세한 설명은 해당 블로그 글을 참고함수 (Functions)
- Swift) 함수(Function) 정복하기 (3/3) - 함수 표기법 / 함수 타입 / 일급 객체 함수
- 일급 객체(First Class Object)란?
- ⭐️ 함수이름, 파라미터 수/자료형, 아규먼트 레이블, 리턴형을 모두포함해서 함수를 식별
- throw
- inout
- Like 포인터, 직접 reference에 접근해서 해당 value를 바꿈
- 상수(let)나, 리터럴 전달하는 것 불가능
- 파라미터의 기본값 선언을 허용하지 않음
- 가변파라미터(여러개의 파라미터)로 선언하는 것 불가능
- Like 포인터, 직접 reference에 접근해서 해당 value를 바꿈
함수 실행의 메모리 구조
- 우리가 작성한 로직을 컴퓨터가 수행하기 위해서는 수 많은 단계로 쪼개서 생각을 해야한다.
- 이때, 함수를 실행하는 과정에선 스택에 함수를 실행한다~ 라고 말해주는 주문서를 넣어주는 과정이 필요함.
- 해당 주문서를 수행하는 와중에 다른 함수를 실행하게 된다면 우선순위가 더 높다고 판단하여 이전 주문보다 빠르게 처리한다.
iOS) 메모리 구조 (Code, Data, Stack, Heap)
- 참고하기 좋은 글 같아서 첨부했습니다.
옵셔널
- 옵셔널 타입 선언의 기본 규칙
- nil 대입 가능
- 자동 초기화 (값을 넣지 않을 시에 nil로 초기화) ⭐️
- 왜 대입했을까?
- 흔히… 다른 언어에서 이런 상황을 많이 맞이해봤을 거다.
var myVlue: Int print(myValue)
// Error!!! // 값을 저장하지 않았다면 메모리에 저장된 값이 없는데 접근하므로 에러 발생a
- nil
- 값이 없음을 나타내는 키워드 (실제 값이 없음이 아님)
- 예를 들어… 어떤 땅이 있는데, 팻말로 “주인 없는 나라 땅” 이다라고 하는 것과 같음. 실제로 주인이 없는 건 아님.(나라가 주인이잖아!)
- 아님 예약 대기 걸어놓은, 찜! 해놓은 상황을 의미하는 거라고 생각할 수도 있겠다. 그럼 다른 사람이 볼 땐 누가 주인인진 모르지만, 소유는 있는 것
- 어라? 그러면 메모리 공간에 “임시적인 타입”을 넣어놓으면 어떨까?
- 따라서, 에러가 나지 않도록 임시적인 타입을 담아두는 개념으로, 포장지로 둘러쌓인 느낌이라고 볼 수 있음.
- 결국, Optional 타입을 Unwrapping해서 ‘실제 값없음’을 한 번 걸러주는 역할을 진행해야 함.
- == nil : 포장지로 둘러쌓여서 값이 없음을 표현
var optionalExample: String? print(optionalExample) // "nil" 값
- 옵셔널값 추출 방법 중 하나인 옵셔널 바인딩 (if let 바인딩)
- 바인딩이 된다면, { } 중괄호 안의 코드를 실행하면서, 특정 작업을 하겠다는 의미
- 조건문이 아님. optional값이 name에 담긴다면, 즉 새로운 변수에 담아진다면 내부에 있는 걸 실행 (벗겨서 담을 수 있다면)
if let s = str { // s라는 상수에 담긴다면 -> nil 아님, 안 담기면 nil
print(s)
}
var optionalName: String? = "홍길동"
if let name = optionalName {
print(name)
}
// 실제 앱을 만들때 guard let 바인딩 많이 사용 -> ㅇㅈ
// 네트워크 통신을 하는 과정, 사용자로부터 입력을 받는 과정에서 사용
func becomeHuman(opinion: Bool?) {
guard let n = opinion else { return }
print(n)
}
becomeHuman(opinion: False)
- 옵셔널 체이닝(Chaining)
- 옵셔널 타입으로 선언된 값에 접근해서, 속성, 메서드를 사용할 때 접근연산자(.) 앞에 ?(물음표)를 붙어야 함.
- 현재까진 ‘.’ 앞에가 Optional 타입이면 ‘?’ 붙여주기로 생각하자.
- 추후에 내용을 다룬다.
- 함수와 옵셔널타입
- 함수에서 옵셔널 타입 파라미터의 사용
func doExercise(name people: String, age: Int? = nil) {
print("\(people): \(age ?? 00)")
}
doExercise(name: "Foden", age: 25)
doExercise(name: "Foden") // age를 안주고 싶을 때 기존 nil 기본값 설정을 안한다면 -> nil로 적어줘야 했었음
Optional Pattern
- 옵셔널 타입에서 열거형 케이스 패턴을 더 간소화한 옵셔널 패턴
- "옵셔널(?) 물음표를 띄어내고, x 상수로 본다”
- if문에서 .some 문장을, (.some도 생략가능) 쉽게 작성할 수 있음
let value: Int? = 10
switch a {
case .some(let x):
print(x)
case .none:
print("nil")
} // 옵셔널 패턴
switch a {
case let z?:
print(z)
case nil:
print("nil")
} // 특정 사례만 다루는 if문
// 1) 열거형 케이스 패턴
if case .some(let x) = num { print(x) }
// 2) 옵셔널 패턴 (.some을 ? 물음표로 대체 가능한 패턴)
if case let x? = num { print(x) }
@unknown 키워드
- 만약, 열거형의 케이스가 늘어난다면 항상 올바른 처리를 하고 있다고 말할 수 있을까
- 열거형의 모든 case를 switch문에서 다루도록 하기
- 최초로 선언 후, 케이스가 늘어날 수도 있는 열거형의 경우 → Non-frozen Enum
switch userLogin {
case .email:
print("이메일 로그인")
case .facebook:
print("페이스북 로그인")
case .google:
print("구글 로그인")
case .kakaotalk:
print("카카오 로그인")
@unknown default:
print("그 외의 모든 경우")
}
반응형
'iOS > Swift' 카테고리의 다른 글
Swift No.11 (0) | 2024.01.13 |
---|---|
Swift No.10 (1) | 2024.01.10 |
Swift No.8 (1) | 2024.01.09 |
Swift Day 6 (0) | 2024.01.09 |
Swift Day 5 (1) | 2024.01.09 |