본문 바로가기
프로그래밍/Spring

15. 옵셔널(Optional)

by Mr-후 2019. 2. 22.
반응형

옵셔널(Optional)


스위프트에는 오브젝티브C나  C에 없던 옵셔널이라는 것이 들어왔다. 

처음 접할 때 가장 어려운 개념중에 하나였고 지금도 가끔 이 옵셔널 때문에 멘붕이 올 때가 있다. 

책에서 설명하는 내용을 곰곰히 몇 번이나 읽었지만 의도를 정확하게 판단 내릴 수 없다. 다만 추측만 하고 그 추측을 기반으로 이용할 것 같다. 


옵셔널은 '선택적인' 즉 값이 있을 수도 있고 없을 수 도 있음을 나타내는 표현인데, 변수 또는 상수의 값이 nil 일 수도 있다는 것을 의미한다.라고 책에 설명되어 있다. 

이 말은 내가 이해한대로 설명하자면 

변수나 상수을 선언하고 사용할 때 값이 있을 수도 있고 없을 수도 있는 변수나 상수에 적용해서 쓰면 된다. 옵셔널로 선언하는 변수나 상수의 용도나 용법을 그렇게 한정해야 한다는 말로 이해가 된다. 


옵셔널 사용에서 옵셔널 변수 또는 상수가 아니면 nil 을 할당 할 수 없다. 

변수 또는 상수가 nil일 수도 있으므로 사용에 주의하라는 직관적으로 이해할 수 있다. 값이 없는(nil) 옵셔널 변수 또는 상수에 강제로 접근하려면 런타임 오류가 발생한다. 


var name: String = "yh"

name = nil //Error 


var name: String? = "yh"

name = nil  // pass 


 옵셔널의 타입추론에 대해서는 패스.(읽어도 이해가 안간다) 


nil이 들어 있는 배열변수에서 옵셔널 값을 확인할 수 있는 방법 


        let numbers: [Int?] = [2, nil, -4, nil, 100]

        

        for number in numbers {

            switch number {

            case .some(let value) where value < 0:

                print("Negative value!! \(value)")

            case .some(let value) where value > 10:

                print("Large value!! \(value)")

            case .some(let value):

                print("Value \(value)")

            case .none:

                print("nil")

            }

        }

------------------------------------------------------------------

Value 2

nil

Negative value!! -4

nil

Large value!! 100



옵셔널 추출 방법. 

옵셔널의 값을 옵셔널이 아닌 값으르 추출 하는 방법. 


1. 강제추출 

강제 추출을 가장 간단하지만 위험하고 그다지 추천하지 않는 방법이다. 옵셔널의 값을 강제 추출하려면 옵셔널 값의 뒤에 느낌표( ! )를 붙혀주면 값을 강제로 추출하여 반환해준다.  값이 없다면 nil이라면 런타임 오류가 발생한다. 

var name: String? = "yh"

var yh: String = name! 

name = nil

yh = name // error 


값이 nil인지 체크해서 안전하게 강제 추출하는 방법이 있긴 하지만 비추천. 


if name != nil {

} else {

}


2. 옵셔널 바인딩

옵셔널 바인딩은 옵셔널에 값이 있는지 확인할 때 사용하고 옵셔널에서 추출한 값을 일정 블록 안에서 사용할 수 있는 상수나 변수로 할당해서 옵셔널이 아닌 형태로 사용할 수 있도록 해준다. 

var myName: String?  = "yhmin" 

//옵셔널 바인딩을 통한 임시 상수 할당 

if let name = myName {

print("My name is \(name)" 

} else { 

print("myName is Nil")

옵셔널 바인딩은 한번에 여러 옵셔널의 값을 추출 할 수 있고 쉽표 ( , )로 구분하면 된다. 만약 바인딩하려는 옵셔널 중에서 하나라도 값이 없다면 해당 블록 내부의 령령문은 실행되지 않는다. 

var first: String = "yh" 

var last: String? = nil


if let name = first, let full = last { 

print("실행되지 않습니다.")

}

last = "min" 

if let name = first, let full = last { 

print("실행됩니다.")

}


3. 암시적 추출 옵셔널 

사실 이건 잘 이해가 안간다. 책의 설명을 보자면 

때때로 nil 을 할당하고 싶지만, 옵셔널 바인딩으로 매번 값을 추출하기 귀찮거나 로직상 nil때문에 런타임 오류가 발생하지 않을 것 같다는 확신이 들 때 nil을 할당해줄 수 있는 옵셔널이 아닌 변수나 상수가 있으면 좋을 때 암시적 추출 옵션널을 사용하고 옵셔널을 표시하고자 타입 뒤에 물음표 ( ? ) 대신 느낌표( ! )를 사용한다. 

암시적 추출 옵셔널 역시 일반 값처럼 사용할 수 있고 nil할당도 가능하다. 단, nil이 할당된 상태에서 접근을 시도하면 런타임 오류가 발생한다. 


여러 경험을 바탕으로 종합적인 판단을 해보면 옵셔널은 안전하게 사용하는 것이 제일 좋다.  


반응형