티스토리 뷰
안녕하세요! Swallow입니다!
저의 첫 글을 Optional(옵셔널)로 시작하려 합니다!
항상 어떠한 조언, 충고 환영입니다!
시작하기에 앞서 이 글은
앨런 Swift 문법 마스터 스쿨 강의와 야곰님의 스위프트 프로그래밍 책을
공부하고 참고하여 작성하였습니다!
그럼 시작하겠습니다!
옵셔널이란?
스위프트 특징 중 하나인 안정성을 문법으로 담보하는 기능입니다
옵셔널은 사전적 의미로는 '선택적인'이라는 의미입니다!
즉, '값이 있을 수도 있고, 없을 수도 있다'를 나타내는 표현입니다
그리고 열거형으로 구현된 임시 타입입니다
열거형에 관한 밑에 정리한 두 번째 포인트 부분을 봐주세요!
이론적인 의미는 간단히 알아보고, 이제 옵셔널에 대해서 완벽히 이해하려면 예시를 보는 게 더 좋겠죠?
그런데!!!!
예시를 보기 전에 미리 알아야 할 부분이 있습니다!
그것은 바로!
nil
nil이라는 녀석을 알아보아야 합니다!
nil이 무엇일까요?
간단하게 말씀드리면, 'nil은 값이 없음을 나타내는 키워드'라고 생각하시면 좋을 것 같아요!
값이 없다! 가 아닌, 값이 없다! 를 나타내는 키워드입니다!
그럼 이제, 위에서 말한 저 둘이 뭐가 다른 의미냐라고 생각하실 수 있어요!
제가 그 부분을 설명해 드리겠습니다!
var age: Int = 0
let empty: String = ""
위의 예시를 보시면, 과연 age라는 변수와 empty라는 상수에 값이 없는 걸까요?
아닙니다!!!!
age에 할당된 0도 하나의 값입니다
empty에 할당된 "" 도 빈 문자열이라는 값입니다
절대 값이 없는 게 아닙니다!
변수 또는 상수에 정말 값이 없다를 표현할 때만 사용하는 키워드가 nil입니다!
var name: String? // nil
이런 식으로 정말 값이 없을 때를 나타낼 때 사용하는 키워드가 nil입니다!
헷갈리시면 안 돼요!
어라???? 엥????
그런데, 위의 예시에서 String 뒤에 ?(물음표) 가 갑자기 왜 붙어있을까요?
자!
바로 위에서 말씀드리려 했던 옵셔널의 사용법과 그에 관한 예시에 관해서 말씀드릴게요!
String 뒤에 ?(물음표) <--
저 녀석이 옵셔널입니다!!
위와 같은 예시로 타입 뒤에 ? 를 붙여서 표현한 타입을 optional type이라고 부릅니다!
그리고 Non-optional type이 존재합니다
Non-optional type은 일반적으로 변수나 상수를 선언할 때 사용하는 방식입니다
var myPhone: String = "아이폰13"
var game: String = "리그오브레전드"
그럼 본격적으로 옵셔널에 관해서 좀 더 자세히 알아볼까요?
위에서 말씀드린 옵셔널 선언 방법은 아래와 같이
데이터 타입 뒤에 ? 를 붙여주면 optional type으로 선언이 됩니다
var name: String?
자 그런데 여기서 알아야 할 포인트가 두 가지 있습니다!
⭐️ 첫 번째 포인트!!!!
옵셔널로 선언된 타입은 초기화를 하지 않고, 실행을 해버리면 무슨 일이 일어날까요?
위에서 살짝 힌트를 드린 것처럼 옵셔널로 선언을 하면 자동으로 nil 이 할당이 됩니다
에러가 생기지 않습니다!
직접 값을 넣지 않아도 자동으로 nil을 할당해주니 정말 간편하죠?
⭐️ 두 번째 포인트!!!!
사실 옵셔널은 열거형으로 구현되어 있습니다!
옵셔널의 정의를 한번 알아볼까요?
public enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
public init(_ some: Wrapped)
// 너무 길어요... 생략...
}
이런 식으로 구현되어 있습니다
아직은 열거형에 대해서 잘 모르실 수도 있지만, 금방 열거형에 관해서 포스팅하겠습니다!
지금은 '이런 식으로 구현되어 있구나'만 알고 계시면 될 거 같아요!
여기서 중요한 포인트는 옵셔널이 값을 갖는 케이스와 그렇지 못한 케이스
두 가지로 정의되어 있다는 것입니다
즉, nil 일 때는 none 케이스가 되고
값이 있는 경우에는 some 케이스가 됩니다
연관값으로 Wrapped가 존재합니다
여기서 <Wrapped>란?
제네릭 타입입니다
제네릭에 관해서는 나중에 더 자세히 다루겠지만, 여기서 간단히 말씀드리면
<> 안에는 어떠한 타입이든 들어갈 수 있습니다
위의 예시에서는 Wrapped를 타입 이름으로 선언을 한 것입니다
개발자가 원하는 대로 <> 안에, T 또는 A 등등 원하는 이름을 넣어주면 되는 것이고,
위의 정의에서는 Wrapped라는 타입 이름으로 선언을 한 것입니다
다시 본론으로 넘어가면, 옵셔널에 값이 있으면 some의 연관값인 Wrapped에 값이 할당이 됩니다
즉, ⭐️ 값이 옵셔널이라는 열거형의 보호막(포장지)에 감싸져 있는 것입니다 ⭐️
그리고 열거형의 타입이 제네릭 타입이므로 어떠한 타입도 연관값으로 쓰일 수 있다고 알고 계시면 좋을 것 같습니다!
지금 말씀드린 두 번째 포인트는 나중에 좀 더 공부를 하신 뒤에 보시면
더욱 도움이 될 것 같아요!
그런데 여기서 의문점이 하나 생겼습니다!
스위프트에서는 왜 옵셔널 타입을 만들었을까요?
간단하게 말씀드리자면
메모리에 값이 없는데, 접근을 하면 에러가 발생하기에
앱이 자꾸 종료가 되는 것입니다...!!!
그렇다 보니 위에서 말씀드린 임시 타입을 만들어서
값을 일단 할당하지 않아도
임시 타입으로 초기화가 되도록 만들었다
라고 생각하시면 됩니다!
마지막으로 옵셔널에 관해서 한 가지만 더 알아볼까요?
지금 보여드릴 예시는 옵셔널의 범위에 관한 이야기입니다!
var myAge: Int? = 24
var yourAge = myAge
Int? 타입으로 선언된 myAge 변수에 숫자 24를 할당하고
yourAge 변수에 myAge의 값을 담는다면 과연 yourAge는 무슨 타입일까요?
네 맞아요!
생각하시는 그대로 yourAge는 Int? 타입이 됩니다
그러면 이 상황에서는 어떻게 될까요?
var dogAge: Int = 5
yourAge = dogAge
dogAge는 Int 타입인데
Int? 타입인 yourAge에 할당이 가능하네요?
어라??
이러면 dogAge는 과연 무슨 타입일까요?
dogAge는 Int 타입 그대로 할당이 됩니다
왜냐하면
Int? 타입은 정수형 + nil을 포함하고 있는 타입이에요
그냥 Int 타입은 정수형만 포함하고 있는 타입입니다
크게 보면 Int? 타입에 일반적인 Int 타입이 포함되어 있는 것입니다
살짝 느낌이 오시나요?
즉, Int? 타입은 정수형 + nil을 포함하고 있고
Int 타입은 정수형만 포함하고 있기에
결국에는!!
⭐️ Int? 타입이 더 큰 범위로 존재하는데 그 안에 일반적인 Int 타입이 포함이 되어있다는 말입니다 ⭐️
이해가 되셨으면 좋겠어요!
그러면!!
위와 반대의 예시로
Int? 타입을 Int 타입에 할당을 하려 한다면 어떻게 될까요?
제가 위에서 말씀드린 것처럼 Int? 가 더 큰 범위이기 때문에 할당이 되질 않습니다
처음 보시면 이해가 안 되실 수도 있어요!
저도 그랬습니다!
그래도 제 글을 읽으시고 감이라도 잡으셨으면 좋겠습니다!
다음 포스팅은 옵셔널 정복하기 - 2장
옵셔널 추출하기입니다
위에서 말씀드린 것처럼 옵셔널은 보호막(포장지)에 감싸져 있다고 말씀드렸습니다
그래서 옵셔널 타입의 값을 사용할 때는 그 포장지를 벗겨낸 후 사용을 해야 합니다
그 부분이
Optional Unwrapped입니다
다음 포스팅에서 자세히 설명드리겠습니다!
감사합니다!
항상 어떠한 피드백 환영입니다☺️
'Swift' 카테고리의 다른 글
| 열거형(Enumeration) 정복하기 - 1장 (0) | 2022.05.27 |
|---|---|
| 옵셔널(Optiona) 정복하기 - 5장 (0) | 2022.05.12 |
| 옵셔널(Optional) 정복하기 - 4장 (0) | 2022.05.10 |
| 옵셔널(Optional) 정복하기 - 3장 (0) | 2022.05.09 |
| 옵셔널(Optional) 정복하기 - 2장 (0) | 2022.05.08 |
- Swift enum
- 옵셔널 패턴
- 속성 감시자
- 열거형 case 패턴
- 스위프트 메서드
- 연관값
- optional
- 스위프트
- optional unwrapping
- swift class
- enum
- Type Methods
- Optional pattern
- 클래스 구조체 차이
- Swift Methods
- SWiFT
- Swift Instance
- optional unwrapped
- swift struct
- 서브스크립트
- 옵셔널 추출
- Instance Methods
- 옵셔널 바인딩
- 열거형
- Property Observers
- 옵셔널
- 원시값
- 저장 타입 속성
- 프로퍼티 옵저버
- 저장 타입 프로퍼티