안녕하세요!
오늘은 타언어에서는 보지 못한 옵셔널에 대해서 알아보고자 합니다
옵셔널
옵셔널은 값을 반환하는 과정에서 오류가 발생하는 상황이 많기 때문에
안정성을 높이고자 사용합니다
"오류를 발생할 가능성을 없앤다"
말하자면 타 언어에서는 값이 없을 때 불러오게되면
오류가 발생하게 됩니다
만약 옵셔널 타입에 값이 저장되지 않는 변수를 불러내면
오류가 발생하지 않고
nil이라고 알려줍니다
엇??!!
null이라고 타 언어에서 본것 같은데
그럼
nil과 null은
같은 건가요??...
NO
비슷한 늬앙스지만 다르답니다 :)
nil | null | |
특징 | • 주로 Lua / Swift 언어에서 사용 • "값이 없음"을 나타낸다 (그냥 특정 타입에 대한 값이 X) • Swift에서 포인터의 개념이 없기 때문에 nil을 가져온 거라는 말이 있음 |
• JAVA / C# 등의 언어에서 사용 • null은 변수가 아무런 객체나 값을 참조하지 않음을 나타냄 • 객체를 참조하는 변수가 아무런 객체를 가리키지 않을 때 |
차이점 | • 특정 타입에 대한 값이 없을 때 사용 | • 객체 참조의 부재일 때 사용 |
공통점 | 값이 없음을 나타냄 |
Ojbective-C에서는 빈 메모리 주소를 가리키는 값이였던 의미
Siwft에서는 단순히 특정한 값이 없음(nil)의미
우선 이렇게 간단히 차이점을 알고 본격적으로 nil에 대해서 알아봅시다!
타입이 명시되어있고 호출 할 때 반드시 값이 있어야
오류가 발생하지 않는걸 알 수 있습니다
그래서 반드시 값을 넣고 호출해야
오류가 발생하지 않는걸 볼 수 있습니다
그래서 옵셔널 타입이 뭔대!!!
옵셔널 타입은 한 번 랩핑된 값을 나타낸답니다
그리고 enum으로 이루어져 있답니다 :)
왜 enum으로 이루어져 있어??...
여기서 <Wrapped>는 실제 값 타입을 나타내고
그 안에 case로
.some (값이 있음)
.none (값이 없음 즉 , nil)
으로 이루어져 있습니다
표로 쉽게 정리해 보았습니다 :)
그래서 작성방법은 위에서 보면 알 수 있듯이
모든 타입뒤에 ?(물음표)를 붙이면
옵셔널 타입
그럼 var num: Int?가 옵셔널 타입이라는거야?
Yes
위에서 명시적으로 타입을 선언하고 값을 저장하지 않으면 오류를
뿜어내던 아이는 옵셔널 타입으로 선언하고
print함수로 호출해도 nil(값이없음)이라고 나옵니다
옵셔널 타입은 여러 자료형에 쓰입니다
여기서 이렇게 선언한 후 print를 하게되면
nil로 나오게 됩니다
지금까지 사용한 선언들은 간편표기이며
정식표기는?
이렇게 사용하고 있습니다
일반적으로 간편표기를 많이 사용하기 때문에
정식표기는 이렇게 사용하는구나~
알고 넘어가시면 될것 같습니다 :)
그리고 옵셔널 타입에 값을 저장하고 프린트하게되면
Optional(10)
으로 랩핑된걸 확인할 수 있습니다
여기서 궁금증 몇가지를 풀어보고자 합니다
Int type -> Int? type 담길까?
아님 역으로도 담길까?
그리고 옵셔널 끼리는 연산이 가능할까?
우선
Int 자료형에다 옵셔널Int를 넣자 오류가 발생하게 됩니다
반대로 하게된다면??
옵셔널에 잘 담기는걸 확인할 수 있습니다
그래서
크기다 더 크다 라고 할 수 있습니다
Int <<<<< Int?
다음으로
옵셔널 끼리 연산을 해보고자 합니다
불가능한 이유는 하나의 값을 가지고 있고 하나는 값이 없는 경우(nil)에
nil + optioanl(20)
자동적으로 처리하기 어렵기 때문에
옵셔널 타입 간의 직접적인 연산은 허용하고 있지 않습니다
하지만
옵셔널 값을 다루기 위해서 특별한 연산자 메서드를 사용하여 값을 추출하여 연산하는것은 가능합니다
래핑을 풀 수 있는 즉 값을 추출해서 사용할 수 있다던데
그럼
nil도 추출해서 연산에 사용할 수 있는거 아냐?
라고 할 수 있지만
강제로 추출하는 방법을 시도할 때는 반드시 Error가 발생합니다
그래서 추출하는 법에 대해서 알아보고자 합니다
추출하는 법은 여러가지 방법이 있습니다
옵셔널 추출하는 방법
- 강제로 옵셔널을 해제하는 방법(Forced-Unwrapping Operator)
- ! 연산자만 붙이면 옵셔널 객체가 해제되고 내부에 저장된 값을 추출할 수 있습니다
- if문을 사용해서 nil값이 아닐 때 추출하는 방법
- 값의 존재 유무 판단후 값이 있다면 추출
- 바인딩을 사용하여서 값을 추출하는 방법
- if let / guard let
- nil인 경우 즉 값이 없는 경우 값이 변수에 담기지 않고 값이 있는 경우에만 담김
- 닐 코어레싱 연산자 ?? 사용함
- ?? 뒤에 값이 없을 시 사용할 값을 넣고 사용하면 된다
number에 값이 nil로 되어있어
100이 출력되는걸 확인할 수 있다
추후 옵셔널 체이닝을 정리하고
여기까지 옵셔널 기초적인걸 마무리 하도록 하겠습니다 :)
잘못된 부분이 있다면 댓글 달아주시면 감사하겠습니다
'Swift' 카테고리의 다른 글
Swift | class(클래스)와 struct(구조체)에 관하여 - 1 (0) | 2024.05.14 |
---|---|
Swift | 함수 (Function)에 관하여 - 1 (0) | 2024.05.13 |
Swift | Collection (컬렉션)에 관하여 4 - Tuple (0) | 2024.05.11 |
Swift | Collection (컬렉션)에 관하여 3 - Dictionary (0) | 2024.05.11 |
Swift | Collection (컬렉션)에 관하여 2- Set (0) | 2024.05.11 |