옵셔널 Optional

Lena·2021년 10월 1일
0

Swift

목록 보기
4/8
post-thumbnail

Int형 vs Optional Int 형

  • 10

    • Int → int형 값을 저장한다
  • Optional(10)

    → 자료형 뒤에 물음표나 느낌표를 써준다 (대부분 물음표)

    • Int?
    • Int!
      • 값이 있을수도 있으나 없을 수도 있다
  • java8의 Optional 클래스, Kotlin의 Nullable 타입
    cf. Nullable type

Optional Type

  • 다른 프로그래밍 언어에는 없는 새로운 개념
    100이 아닌 optional(100)을 리턴함
    그냥 100이 나오게하고싶다면 ! 붙이기
  • 값을 반환할 때 오류가 발생할 가능성이 있는 값은 옵셔널 타입이라는 객체로 감싸서 반환
    • swift에서 기본 자료형은 nil값을 저장할 수 없음 → nil도 저장하려면 옵셔널 타입으로 선언해야 함
  • 옵셔널 타입은 변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위한 방법을 제공
    : 오류가 생기더라도 실행을 멈추는 것이 아니라 nil 값을 반환함으로써 안전한 프로그래밍 환경을 만들어주려는 것

  • 옵셔널 타입 변수 선언

    : 타입 선언부 뒤에 ?문자를 쓴다

  • index라는 이름의 옵셔널 Int 변수를 선언하는 예

    • var index: Int?
    • index 변수는 정수 값을 갖거나 아무 값도 갖지 않을 수 있음

강제 언래핑 Forced Unwrapping : 변수 이름 뒤 느낌표

  • 옵셔널 변수에 값이 있으면 옵셔널로 "래핑되었다"고 함 → 래핑되어 있기 때문에 변수가 있는지 없는지 모르는 것!
  • 옵셔널에 래핑된 값은 강제 언래핑으로 풀어줌 (forced unwrapping)
    var x : Int? // 옵셔널 정수형 변수 x 선언
    var y : Int = 0
    x = 10 // 안 넣을 수도 있다
    
    print(x) // Optional(10)
    print(x!) 
    // forced unwrappoing 해서 10이 나옴 -> 강제로 풀어해친다
    print(y)

강제 언래핑2 Forced Unwrapping 2 : Optional Binding

  • 강제 언래핑하는 또 다른 방법으로, 옵셔널 바인딩을 이용하여 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당함
 if let constantname = optionalName {
}
  • 옵셔널 변수가 값이 있다면 언래핑해서 일반상수 constname에 대입하고 if문 실행 (값이 있는 순간 풀린다)
  • 값이 없다면 If문의 조건이 거짓이 되어 if문을 실행하지 않음
if var variablename = optionalName {
}
  • 옵셔널 변수가 값이 있다면 언래핑해서 일반변수 variablename에 대입하고 if문 실행
  • 값이 없다면 if문의 조건이 거짓이 되어 if문 실행하지 않음
var x : Int?
x = 10
if let xx = x {
    print(xx)
}

else {
    print("nil")
}

var x1 : Int?
if let xx = x1 {
    print(xx)
}

else {
    print("nil")
}

Optional Binding - 여러 옵셔널을 언래핑

  • 여러 옵셔널 변수를 한번에 언래핑하는 방법 → , (콤마) 사용
    var pet1: String?
    var pet2: String?
    pet1 = "cat"
    pet2 = "dog"
    if let firstPet = pet1, let secondPet = pet2{
        print(firstPet, secondPet)
    } else{
        print("nil")
    }
  • 위의 예시를 optional binding 이용해서 바꿔보기
    var x : Int?
    x = 10
    if let xx = x {
        print(xx)
    }
    
    else {
        print("nil")
    }
    
    var x1 : Int?
    if let xx = x1 {
        print(xx)
    }
    
    else {
        print("nil")
    }

→ optional binding 이용

    var x : Int?
    var y : Int?
    
    x = 10
    y = 20
    
    if let xx = x, let yy = y {
        print(xx, yy)
    }
    else {
        print("nil")
    }

Implicitly Unwrapped

  • 옵셔널이 항상 유효한 값을 가질 경우 옵셔널이 암묵적인 언래핑 (implicitly unwrapped)이 되도록 선언할 수 있음
  • 클래스의 outlet 변수 초기화에서 많이 사용 (자동 생성되는 코드)
  • 이러한 방법으로 옵셔널이 선언된다면 강제 언래핑이나 옵셔널 바인딩을 하지 않아도 값에 접근할 수 있음
  • 암묵적인 언래핑으로 옵셔널을 선언 → 선언부에 ? 대신 ! 를 사용
    • var x : Int? // 옵셔널 변수 선언방법 1
    • var y : Int! // 옵셔널 변수 선언방법 2

Int!형을 property로 갖는 클래스

class MyAge{
    var age : Int!
    init(age: Int) {
        self.age = age{
        }
    }
        
        func printAge(){
            print(age) //Optional(1)
            print(age+1) //2, age! +1라고 쓸 필요가 없음
            let age1 : Int = age
            print(age1) // 1
            let age2 = age + 2
            print(age2) //3
        }
    }
}
    var han = MyAge(age:1)
    han.printAge()

Optional을 사용하는 이유

  • nil의 가능성을 명시적으로 표현해주는 것.
  • 전달받은 값이 옵셔널이 아니라면 nil체크 하지 않더라도 안심하고 사용할 수 있다. (효율적인 코딩이 가능하고 예외 상황을 최소화하는 안전한 코딩이 가능함)
  • nil값을 옵셔널이 아닌 변수나 상수에 할당할 수 없음
    • var myInt = nil // error (옵셔널이 아니면 nil값을 할당할 수 없다)
    • let myConstant = nil // 유효하지 않은 코드 → 일반형이므로 nil값 저장 불가
    • var mystring : String = nil // 유효하지 않은 코드 → 일반형이므로 nil값 저장 불가
    • var myInt : Int? = nil // OK (옵셔널에는 괜찮다)
    • var myInt : Int? // 초기화하지 않으면 자동으로 nil로 초기화됨 → 위와 같은 코드

학습자료 : Smile Han 유튜브 채널 & 야곰의 스위프트 프로그래밍

0개의 댓글