[iOS / Swift] 옵셔널(Optional)
옵셔널 (Optional)
: 옵셔널이란 변수의 값이 있을 수도 있고 없을 수도 있다는 것을 나타냄. 즉, 변수의 값이 nil값인 아무것도 없는 상태를 가질 수 있다는 것임.
이게 무슨소린지 나는 처음에 이해를 잘 못했음. 없으면 0이지 '빈 값'이라는 개념이 있다는 것을 이해하지 못했음.
nil값을 가질 수 있는 옵셔널 변수를 선언하기 위해서는 데이터 타입 뒤에 ?를 붙이기만 하면 됨. 아래 예시를 보겠음.
말 그대로 데이터 타입 뒤에 ?를 붙여 옵셔널 변수 선언을 했음.
이름이 있을 경우에는 name을 그대로 출력하고, 이름이 nil일 경우에는 '손'을 넣어 출력하여
"안녕하세요, '이름'님", 혹은 "안녕하세요, '손'님" 이 출력되게 했음. 이처럼 이름이 String값일수도 있고, nil일 수도 있음. 그 아래에
let vaildName = name ?? "손" // nil병합연산자
?? 연산자 = nil 병합 연산자라고 부름. 즉, nil이 아닐경우 name을 사용(왼쪽), nil일경우 "손"을 사용(오른쪽) 하는 간단한 예시였음.
근데 여기서 String 과 String?은 절대 같은 데이터 타입이 아니라는 것을 알아야함. 간단한 예시로 보겠음.
뭐라뭐라 길게 나오는데 간단하게 줄여서 말하자면,
변수 b는 옵셔널이 아닌 String타입이기 때문에 항상 값을 가지고 있어야함.
변수 a는 옵셔널로 선언된 변수이기 때문에 실제 코드가 실행되기 전까지 값이 있는지 없는지 알 수 없음.
즉, 두 변수가 같은 타입이었다면 한 변수에 한 변수를 넣어주어 저장이 됐겠지만, 에러가 났으므로 두 변수는 다른 데이터 타입이라는 것임.
에러 메세지를 읽어보면 String?은 반드시 String으로 unwrapped를 해줘야한다. 라고 적혀있음. 추가로 언래핑에 대해 알아보겠음.
강제 언래핑(Force Unwrapping)
: 쉽게 말하자면 '?라는 옵셔널을 벗겨내어 그것이 무엇인지 확인을 한다.' 정도로 생각하면됨. 옵셔널 변수 안에는 값이 있을 수도 있고 없을 수도 있기 때문임.
강제 언래핑을 하기 위해서는 옵셔널 변수 뒤에 !를 붙여주면 됨.
그러면 오류가 사라지고 문자열 변수 b에 a의 내용이 잘 저장된 것을 볼 수 있음. 다른 예시를 보겠음
Optional이라는 무언가가 숫자앞에 있음. 변수 c는 옵셔널로 선언이 되었고 이 변수가 값을 가질지 nil을 가질지 모른다는 것임.
아래에는 print에 !를 붙여 강제언래핑을 해봤음.
print뒤에 !라는 강제 언래핑을 적어두자 값이 Optional이 사라지고 10이라는 온전한 Int형의 숫자가 도출됨.
하지만, 강제 언래핑을 하기위에 변수 뒤에 !를 쓰는 것은 좋은 코드가 절대 아님.
왜?? !를 이용해 강제 언래핑을 해주는 과정은 우리가 옵셔널 변수에 값이 무조건 있다는 가정하에 강제 언래핑을 해주는 것이기 때문에, 만약 옵셔널 변수에 nil값이 들어있는 채로 !를 이용해 강제 언래핑을 해버리면 오류가 발생하기 때문임.
이러한 이유로 강제 언래핑은 최대한 피해주고 옵셔널 바인딩, 옵셔널 체이닝 등 다른 방법을 사용하는 것이 좋음.
다시 한 번 중요한 부분을 체크해보겠음
- nil을 넣기 위해서는 옵셔널이 필요함
- 일반 데이터형과 옵셔널 데이터형은 완전 다른 데이터형임.
- 옵셔널 데이터형을 사용하기 위해서는 unwrapping하는 과정이 필요함
- 강제 언래핑은 좋은 코드가 아님.
- 옵셔널 바인딩, 옵셔널 체이닝 등을 이용해주는 것이 안전함!
'Swift 언어 > Swift 문법 정리' 카테고리의 다른 글
[iOS / Swift] 구조체 (Struct) (0) | 2024.10.15 |
---|---|
[iOS / Swift] 클래스(Class) (0) | 2024.10.14 |
[iOS / Swift] 함수(Function) (0) | 2024.10.11 |
[iOS / Swift] 컬렉션 타입(Array, Dictionary, Set) (0) | 2024.10.01 |
[iOS / Swift] 반복문(for문, while문) (0) | 2024.09.30 |