[Swift] 옵셔널과 옵셔널 바인딩
옵셔널(Optional)이란?
swift는 옵셔널 변수에만 nil을 할당할 수 있다.
다음과 같이 변수명뒤에 '?'를 붙여서 옵셔널로 지정이 가능한데,
"이 변수에 nil이 들어갈 수도있고 아닐수도 있고~"라는 의미이다.
var optInt : Int?
optInt = 3
var optStr : String?
optStr = "Swift"
var optArr : [String]?
optArr = ["C", "Java", "Objective-C"]
"그럼 전부 옵셔널로 변수 선언하면 끝 아닌가?"
라고 생각 할 수 있지만 애플은 다 계획이 있다.
이런식으로 만든 이유는 런타임 중에 문제가 발생하는걸 방지하기 위함이다.
만약 값이 반드시 필요한 로직에 nil이 들어가면 프로그램은 문제가 발생하지만 이것을 컴파일 단계에서 알 수 없기 때문 (문법상으론 문제가 없으므로)

ㅇㅋㅇㅋ 이해했다. 라고 생각하면 좋을텐데 큰 문제가 생겼다. 엄연히 옵셔널 변수는 타입 자체가 옵셔널이기 때문에 "옵셔널int"와 "int"는 다르다.
var justInt: Int?
var optInt: Int?
print(type(justInt))
//Int
print(type(optInt))
//Optional<Int>
즉, 서로 계산도 안돼...이거도안돼 저거도 안돼... 아무튼 안된다.
그러므로 저 Optional<>을 벗겨내야하는데, 쉬운 방법으로는 변수를 호출할때 뒤에 "!"를 붙여서 크게 불러주면 옵셔널이 놀라서 떨어진다.
//옵셔널 강제 해제
var optInt2 : Int? = 3
print("옵셔널 자체의 값: \(optInt2)")
//옵셔널 자체의 값: Optional(3)
print("옵셔널 강제 해제한 값: \(optInt2!)")
//옵셔널 강제 해제한 값: 3

"ㅇㅋㅇㅋ 쉽네" == "해치웠나?"
'!'을 붙이는것은 swift한테 "아ㅋㅋ 이거 절대 nil안들어옴 개발자인 내가보증함ㅋㅋㅋ"와 같은 의미다.
훌륭한 개발자인 나를 믿고 컴파일 후 배포 할것인가? 일단 난 아님ㅋ
그래서 훌륭한 애플은 덜 훌륭한 우리를 위해 안전하게 옵셔널을 해제하는 방법을 개발했다.
옵셔널 바인딩(Optional Binding)
애플은 옵셔널을 안전하게 해제할 수 있도록 옵셔널 바인딩이라는 문법?을 만들었다.
- 장점: 안전한 개발을 할수 있다
- 단점: 애플스럽게 만들었다.
var str = "123"
//옵셔널 바인딩 구문
//형변환은 실패할수도 있으므로 옵셔널로 반환됨
if let intFromStr3 = Int(str) {
print("값 변환에 성공 \(intFromStr3)")
} else {
print("값 변환에 실패")
}
아이폰 배터리 잔량 숫자로 보여주는 기능을 2022년에 업데이트 해준 애플답게 편의성은 '충전기' 해버렸다.
상수를 만들고 거기에 옵셔널 해제한 값이 정상적으로 들어가면 if코드블록을 실행하고
정상적으로 안들어가면(nil) else 블록을 실행한다.
옵셔널 강제 언래핑(! 붙이기)는 위험한데 왜 만들었는가?
토글버튼을 생성했을때 처럼 nil이 들어갈일 없는(true, false 중 하나는 무조건 존재하므로) 변수도 옵셔널로 선언되는데,
(나중에 LLVM이 그 변수에 할당 된 메모리를 해제하기 위해 nil을 부여해 주기 위함이다.)
그런 변수까지 옵셔널 바인딩해서 쓰면 너무 귀찮으니까(?) 훌륭한 개발자라면 그때 강제언래핑을 실시하면 된다.