Swift

Swift | Optional에 관하여

ziziDev 2024. 5. 13. 15:26
반응형

안녕하세요!

오늘은 타언어에서는 보지 못한 옵셔널에 대해서 알아보고자 합니다

 

옵셔널

 

옵셔널은 값을 반환하는 과정에서 오류가 발생하는 상황이 많기 때문에

안정성을 높이고자 사용합니다

 

"오류를 발생할 가능성을 없앤다"

 

말하자면 타 언어에서는 값이 없을 때 불러오게되면

오류가 발생하게 됩니다

만약 옵셔널 타입에 값이 저장되지 않는 변수를 불러내면

오류가 발생하지 않고

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)
    • ! 연산자만 붙이면 옵셔널 객체가 해제되고 내부에 저장된 값을 추출할 수 있습니다

nil은 강제 언래핑을 했을 때 오류가 나게됩니다

  • if문을 사용해서 nil값이 아닐 때 추출하는 방법
    • 값의 존재 유무 판단후 값이 있다면 추출

 

  • 바인딩을 사용하여서 값을 추출하는 방법
    • if let / guard let 
    • nil인 경우 즉 값이 없는 경우 값이 변수에 담기지 않고 값이 있는 경우에만 담김

  • 닐 코어레싱 연산자 ?? 사용함
    • ?? 뒤에 값이 없을 시 사용할 값을 넣고 사용하면 된다

 

number에 값이 nil로 되어있어

100이 출력되는걸 확인할 수 있다

 

 

추후 옵셔널 체이닝을 정리하고

여기까지 옵셔널 기초적인걸 마무리 하도록 하겠습니다 :)

 

 

잘못된 부분이 있다면 댓글 달아주시면 감사하겠습니다

반응형