Apple-CS-interview / iOS-CS-interview

7 stars 0 forks source link

Optional 이란 무엇인지 설명하시오. #6

Open Do-hyun-Kim opened 1 year ago

Do-hyun-Kim commented 1 year ago

Optional 이란 무엇인지 설명하시오.

Optional

@frozen
public enum Optional<Wrapped>: ExpressibleByNilLiteral {
  case none
  case some(Wrapped)
}

Optional의 값 추출 방식

강제 추출(Unconditional Unwrapping) 이란

옵셔널 바인딩(Optional Binding) 이란

옵셔널 체이닝 (Optional Chaining)

📝 참고 사이트

vichye-1 commented 1 year ago

Optional이란?

nil을 사용할 수 있는 타입과 없는 타입을 구분하기 위해 사용하는 타입. nil을 사용할 수 있는 Type를 Optional Type이라 부른다.

nil을 사용할 수 없는 타입(Non-Optional Type)

  1. 변수, 상수 타입
    // 변수
    var name = "knockknock"
    //상수
    let name = "knockknock"
    • 특징
    • 무조건 값을 가져야함
    • 값이 없을 경우 에러가 남

nil을 사용할 수 있는 타입(Optional Type)

var name: String? name = nil // ?로 선언된 name에 nil 값 저장 가능

- 타입 추론(`Type Inference`)을 이용하여 변수 선언

let a: Int? = nil let b = a // nil //a처럼 b도 옵셔널 타입으로 선언됨

### Optional Unwrapping

옵셔널 타입의 값을 사용할 땐 옵셔널을 해제해서 사용해야 하고, `nil`일 경우에는 절대 해제하면 안 됨

1. 옵셔널 강제 추출(`Forced Unwrapping`)
- 강제 추출 연산자 : !
- `nil`이 들어있어도 강제로 해제해버리기 때문에 값이 100퍼센트 있는 경우를 제외하고는 웬만해서는 사용해선 안 됨
2. `Optional Binding`
- 옵셔널 표현식이 값을 가지고 있는 경우(nil이 아닌 경우) 정의된 상수에 옵셔널이 해제된 값을 저장하고 `true`를 반환한다.
- 값이 없는 경우 `false`를 반환한다.
- `Optional Binding`의 종류

if let name: Type = OptionalExpression { }

while let name: Type = OptionalExpression { }

guard let name: Type = OptionalExpression else { }


3. `Optional Chaining`
- optional chaining operator :  ?.(후위에 ?를 붙인다)
4. `Nil-Coalescing Operator`
- Nil-Coalescing operator : ??
### 📝 참고

- [Swift 공식문서 - Optional](https://developer.apple.com/documentation/swift/optional)
- [Optional 부수기](https://babbab2.tistory.com/15)
ronick-grammer commented 1 year ago

Optional 이란

Optional 타입 선언 방식

Optional Binding

Optional Chaining

Nil-Coalescing Operator (병합 연산자)

📝 참고 사이트

Hminchae commented 1 year ago

Optional 이란??

// someOptionalParm에 nil이 할당 될 수 있다.
func someFunction(someOptionalParam: Int?) {
       // ....
}

/// someOptionalParm에 nil이 할당 될 수 없다.
func someFunction(someOptionalParam: Int) {
       // ....
}

someFunction(someOptionalParam: nil)
// someFunction(someParam: nil) 

Optional 쓰는 이유

명시적 표현

  1. nil의 가능성을 코드만으로 표현가능
  2. 문서/주석 작성 시간 절약

안전한 사용

  1. 전달받은 값이 옵셔널이 아니라면 nil 체크를 하지 않고 사용가능
  2. 예외 상황을 최소화 하는 안전한 코딩
  3. 효율적 코딩

Optional 문법과 선언

let optionalValue: Optional = nil let optionalValue: Int? =nil


* 옵셔널 표현

  1. 느낌표(!)를 이용한 암시적 추출 옵셔널 
  ```swift
  // Implicitly Unwrapped Optional
  var implicitlyUnwrappedOptionalValue: Int! = 100

  switch implicitlyUnwrappedOptionalValue {
  case .none:
      print("This Optional variable is nil")
  case .some(let value):
      print("Value is \(value)")
  }

  // 기존 변수처럼 사용 가능
  implicitlyUnwrappedOptionalValue = implicitlyUnwrappedOptionalValue + 1

  // nil 할당 가능
  implicitlyUnwrappedOptionalValue = nil

  // 잘못된 접근으로 인한 런타임 오류 발생
  //implicitlyUnwrappedOptionalValue = implicitlyUnwrappedOptionalValue + 1
  1. 물음표(?)를 이용한 옵셔널

    // Optional
    var optionalValue: Int? = 100
    
    switch optionalValue {
    case .none:
      print("This Optional variable is nil")
    case .some(let value):
      print("Value is \(value)")
    }
    
    // nil 할당 가능
    optionalValue = nil
    
    // 기존 변수처럼 사용불가 - 옵셔널과 일반 값은 다른 타입이므로 연산불가
    //optionalValue = optionalValue + 1

Optional 추출

  1. 옵셔널 바인딩

    • nil 체크 + 안전한 추출
    • 옵셔널 안에 값이 들어있는지 확인하고 값이 있으면 값을 꺼내옴
    • if-let 방식 사용
  2. 강체추출 : 옵셔널에 값이 들어있는지 아닌지 확인하지 않고 강제로 값을 꺼내는 방식, 만약 값이 없을경우(nil) 런타임 오류가 발생하기 때문에 추천되지 않음

📝 참조