Swift를 조금이라도 접해본 분들은 많이 들어봤을 옵셔널!! 에 대해서 알아 보기로 해요!!!
정의 : 래핑 된 값(Wrapped) 또는 값의 부재(absence)를 나타내는 타입이에요~
애플은 정의를 너무 어렵게 해서.. 공식 문서 보기 무서워요 하지만 왜 이렇게 했는지는 설명을 듣다 보면 알 거예요!
쉽게 말해 옵셔널 변수는 값이 있을 수도 없을 수도 있는 변수 라고 생각하면 돼요!
말로는 무슨 소리인지 모를 거예요 ‼️ 그래서 좀 더 설명할게요
위와 같이 let/var변수 이름: 타입? 으로 주로 선언해요
저 String 타입 옆에? 이걸 붙이면 옵셔널 타입이에요 보통은 shortForm 형태로 많이 사용해요
옵셔널 타입은 열거형(enum)으로 이루어져 있어요
그래서 정의가 래핑 된 값, 값의 부재 라고 한 것이 그 이유에요! 하지만 열거형은 아직 다루지 않아서 이 부분은 추후 포스팅할게요!
Optional Type
자자 이제 옵셔널 타입을 예시로 설명할게요
옵셔널을 타입 어노테이션 방법으로 선언해 볼게요 !
girlFriend 를 옵셔널 String 으로 타입을 정해두고 선언했어요
이 값을 출력해 볼 거예요
엥? 그냥 "지수" 가 아니라 Optional("지수") ..?
한번 타입을 찍어볼게요
타입을 찍어보면
그냥 String 이 아니라
String이 Wrapping 되어 있죠? Optional<String> 으로 말이죠!
아까 옵셔널 정의에서 제가 뭐라 했을까요?
래핑(Wrapping) 된 값(String) 또는 값의 부재
래핑 된 값! (Wrapped Value)
래핑 된!! (Wrapped)
아.. girlFriend는 옵셔널이라는 타입으로 래핑<> 되어 있구나!! 제 여자친구가 있을 수도 있고 없을 수도 있는 거예요!!
자 이제 제가 여자친구랑 헤어져서 girlFriend에 값을 넣어주지 않을게여 .. ㅜ
선언
이렇게 타입 어노테이션으로 선언 만 해놓고 값을 저장하지 않을게요
이제 출력을 해보고 결과를 해볼게요
nil? 엥 nil이 뭘까요?
드디어 nil 을 설명할 수 있게 되어서 기뻐요 ㅎ
설명하기 전에 진짜 마지막으로 옵셔널 타입의 정의가 뭐라고요?
ㄹㅍㄷ ㄱ ㄸㄴ ㄱㅇ ㅂㅈ~
ㅎㅎ ^^;; 죄송..
아무튼 이번엔 값의 부재(absence) !!!
nil
Optional 타입 은 열거형(enum)이라고 했어요! case none 에 해당하는 케이스에 해당돼요 무슨 소리지? 하면 열거형 부분은 넘어가요! 열거형 몰라도 돼!!
아무튼 nil 은
"값이 없음을 나타내는 키워드"
라고 생각하면 좋아요!
Objective-C에서는 nil 이 포인터인데, Swift 에서 nil은 포인터가 아니에요! 정의에서도 봤듯이 값의 부재 = absence입니다
그래서 nil이 왜 필요할까요?
바로 Swift는 타입 안정성(type-safe)을 보장하는 언어이기 때문이에요 nil 을 통해 명시적으로 값이 없음을 처리하고, 컴파일 시점에 타입 오류를 방지하고 런타임에 안전한 코드 실행을 보장하는 특성이 있어요! 변수에 값을 접근했는데 값이 없으면 오류가 뜨거든요~
이렇게 말이에요
아무튼 옵셔널이 아닌 타입(Non-Optional Type) 은 변수와 상수는 값을 읽기 전에 반드시 초기화해야 합니다!
( 참고로 Non-Optional Type 은 Optional 타입이 아닌 모든 타입을 말해요 ⭐️ 우리가 매일 사용하는 String, Int 등등.. )
여자친구가 옵셔널이 아니라면 여자친구가 필수라는 건데 ,, 헤어지는 게 말이 되나요? 네네.. 필수였으면 좋겠네요 ^^
우리의 이름은 String으로 정의된다고 생각해 봐요 사람을 구분하는데 필수죠? 뭐 주민등록번호 등등.. nil 일 수가 없는 것들은 일반 자료형이라고 생각합시다!
하지만 여자친구는 String? 이다 ~
딴 얘기로 더새기 전에
자 결론 nil은 Optional로 포장(Wrapping) 된 값에만 사용이 가능하고, 값이 없다면 값의 부재로 알려준다.