본문 바로가기
Coding

Swift 옵셔널(Optional)

by BlissBless 2017. 12. 1.

컴퓨터라면 있으면 있고, 없으면 없고, 기면 기고 아니면 아닌 0, 1 두 상황만을 표현 하는 것만 있을 줄 알았는데,

있을 수도 없을 수도 있는 상태를 표시하는 방법이 있다는게 신선함.


● 옵셔널 (Optional), 있거나 없거나?

단어의 뜻은 선택적인, 의무적인 게 아닌. 있을 수도 있고 없을 수도 있고. 라는 애매한 뜻인데, 스위프트에서 안정성을 문법적으로 보장(?)하는 것이 옵셔널이라고 한다. 옵셔널은 타입뒤에 ?로 표시한다. 그리고 이 옵셔널은 사용하게 되면, '옵셔널 타입'이 되어 다른 타입과 또 달라진다.



var yourName: String? = "you"

print(yourName) // Optional("you") 출력 

 


컴퓨터의 세계는 0 or 1이 아닌가? 있으면 있는 확실하게 거고 없으면 진짜 없는 건데 이게 왜 필요한 개념인지 잘 잡히지 않는다.

왜 필요 하지?


● 값이 없다는 건?

Int 타입에 0을 넣는 것, String 타입에 " "에 넣는 것도 값이 없는 것이라고 생각할 수 있지만, 0도 0이라는 하나의 값이고, " "(빈 문자열) 이것도 빈 문자열이라는 하나의 값이다. 값이 없다는 표현은 nil !



● 옵셔널 (Optional) 장점은?

장점1:  변수, 상수에 값이 있을 수도 없을 수도 있으니 사용할 때, 조심해! 라고 직관적으로 알 수 있음.

장점2: 함수에 전달 되는 전달인자의 값이 잘 못된 값일 경우 제대로 처리하지 못했음을 nil을 반환하여 오류가 있음을 알릴 수 있음.

정점3: 매개변수를 굳이 넘기지 않아도 된다는 뜻으로 매개변수 타입을 옵셔널로 정의 할 수 있음.


(사실 1번 빼고 2, 3번은 아직 잘 이해 하지 못하겠다...)



● 옵셔널 (Optional) 값을 가져 오고 싶을때?

두가지 방법이 있음. 1) if let, if var로 옵셔널 값을 체크 한 다음에 꺼내 준다. 2) 강제 추출 !느낌표를 사용하여 벗겨 준다.



var optionalName: String? = "Atom"

var optionalAge: Int? = 30


if let name = optionalName,

    let age = optionalAge {

    print(name)

}

 


!표만 붙여서 가져 오므로 꺼내 오는게 간단한 느낌인데, 이 방법은 강제 추출방법으로 그리 권장되는 사항이 아님.



var name2: String! = optionalName

 



● 옵셔널 체이닝 (Optional chaining)

옵셔널을 풀어 주는 걸 체인처럼 이어서 가져 오는 것.

코드 줄을 많이 줄여 준다.


ex) 좋은 예제는 이곳에...



★ 옵셔널에 관한 CodeWithChris의 강의 링크



더 많이 써보고 코드를 봐야 왜 필요한지 알 수 있을 듯!