Open Seokki-Kwon opened 5 months ago
Optional 이란 무엇인지 설명해보세요.
옵셔널이란 ‘선택적인’이라는 뜻으로 값의 부재를 의미
값이 있을 수도, 없을 수도 있는 것을 나타내는 Swift의 타입
타입 어노테이션 뒤에 ?를 붙임으로서, 옵셔널 타입을 정의
항상 값을 가지고 있지 않아도 된다. 따라서, 초기값을 지정하지 않으면 옵셔널 타입의 값은 nil로 초기화
내부적으로는, some과 none 케이스로 이루어진 열거형 그 자체
@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case (Wrapped)
...
}
(여기서 Wrapped는 실제 값이 들어 있는 Generics Type으로, associatedValue 이다.)
옵셔널타입을 왜 쓰는건가요? 일반타입도 있는데, 옵셔널 타입이 왜 필요한건가요?
선언된 메모리 공간에 값이 없을 때, 그것에 접근하려고 하면 에러가 발생하여 접근이 불가하기 때문에
Swift에서 에러를 막고, 임시적인 타입인 옵셔널 타입의 임시값을 통해 안정성(Safety)을 보장하기 위하여 옵셔널 타입을 도입
Null은 왜 앱이 왜 꺼지는지? 그런데, Swift의 nil은 왜 앱이 안꺼지는지? (다른 언어는 그렇지 않기도 함)
Null이 담겨있는 메모리에 접근하면 존재하지 않는 주소값에 접근하려고 하기에 에러가 발생
반면, 옵셔널 타입인 nil이 담겨있는 메모리에는 접근하여도 에러가 발생하지 않음
Null과 nil의 차이점이 뭔가요?
Null은 메모리 공간에 (실제) 값이 없음
nil은 값이 없음을 나타내는 키워드로서, 메모리 공간에 ‘값이 없음’을 ‘의미’하는 것으로, “실제 값이 있을 수도 있고, 없을 수도 있다.”의 개념
nil은 실제 열거형으로 래핑된 임시값 형태를 띔
옵셔널에 대해서는 알고 있나요? 옵셔널 바인딩 처리는 어떻게 하나요?
옵셔널 바인딩은 옵셔널 타입의 값을 if-let Binding이나 guard-let Binding 로 nil인지 Check하고, 옵셔널 표현식이 값을 리턴하는 경우에만 바인딩(Value-Binding Pattern)을 통해 옵셔널 타입의 값을 (옵셔널 값을 벗겨) 추출하는 것
결과적으로 Optional.some(wrappedValue)의 wrappedValue(연관값)를 꺼내오는 것과 동일
if-let 과 guard-let 방식은 Early-Exit, Scope of Assigned Value (local/global scope by brace({})), Exception Handling 등의 부분들에서 코드적으로 구현과 표현의 차이 존재
옵셔널 바인딩에서 초기값은 항상 옵셔널 표현식, 따라서 타입 추론이 가능하기에 타입 어노테이션은 항상 생략 가능
‘,’을 사용하여 여러 값을 한번에 바인딩 가능, 이처럼 방법은 대체로 두 가지, 방법은 표현(식)에 따라 달라질 수 있다.
옵셔널에서 !(느낌표)는 언제 써야할까요?
옵셔널 타입의 값을 강제로 언래핑(Force unwrapping)할 때 쓰임
하지만, !를 사용하여 값이 존재하지 않는 옵셔널 값에 접근하려고 시도한다면, 런타임 에러 발생
따라서, 옵셔널 타입의 값이 확실히 nil이 아닌 경우에만 !를 통한 강제 언래핑(Force unwrapping) 방식을 사용해야 함
Optional Chaining(?)과 nil-coalescing operator(??)의 차이점과 사용 시 주의사항은 무엇인가요?
Optional Chaining은 옵셔널 타입의 값(Property(.property?)/Method(.method?()?)/Subscript(?[index])/Dictionary(Dictionary?[”Key”]?)) 에 접근 시 접근연산자(.) 앞에 ?을 붙여 옵셔널 값이 있는지 연쇄적으로 평가하여, 만약에 표현식 중 하나라도 nil이라면 nil이 반환되는 프로세스를 말한다. 옵셔널 체이닝의 반환값은 항상 옵셔널 타입이며, 옵셔널 체이닝의 마지막 표현식은 항상 ?를 생략한다.
Nil-Coalescing Operator는 이항 연산자로, 피연산자 2개를 가짐 만약, 왼쪽 피연산자의 옵셔널 표현식에 값이 있는지 확인하고, 값이 있다면 값을 추출해서 반환 반대로, 값이 없다면 기본값(일반 표현식)인 오른쪽 피연산자를 반환한다.
Optional을 Switch 문으로 돌릴 때, .none이 있는데 이 것과 nil의 차이점은?
옵셔널 자체가 열거형이므로, 옵셔널 타입의 값은 switch 문을 통해 값 확인이 가능할 것이다.
결국 nil은 Optional 열거형의 none 케이스에 해당하므로, 명시적인 열거형 값 Optional.none 과 동일한 개념이며,
이를 통해 nil은 실제로 Optional이라는 열거형에 래핑된 임시 값임을 알 수 있다.
옵셔널 패턴 (Optional Pattern)
if case let wrappedValue? = identifier {
// Statement - Using wrappedValue(Wrapped)
}
(if-let Optional Binding 과의 차이점 : nil-Check or Binding 하려는 값의 타입이 열거형이냐 아니냐의 차이)
패턴 (매칭) (Patterns)
식별자 패턴 (Identifier Pattern)
열거형 케이스 패턴 (Identifier Pattern)
바인딩 패턴 (Value-Binding Pattern)
암시적으로 벗겨진 옵셔널 타입 (Implicitly Unwrapped Optional (IUO) Type)
옵셔널 바인딩이 필요없다고 확신하는 경우로, 값이 있어 자동으로 값이 추출되어 저장되는 타입
명시적 추출 (Explicit Unwrapping) & 암시적 추출 (Implicit Unwrapping)
명시적 추출 (Explicit Unwrapping) - Optional Binding
additional expression
while let name = optionalName {
print(name)
// break
}
암시적 추출 (Implicit Unwrapping) - Force Unwraping
additional expression
if num != nil {
print(num!)
}
Optional 내부 메서드 .map() & .flatmap() 의 사용
WIP (대체 코드 모색)
Generics
WIP
🕜 2024.02.05