Xcode 주석 관련 단축키
- 문서화 주석 조회: alt + click
- 정의 조회: cmd + ctrl + click
Optional
A type that represents either a wrapped value or nil, the absence of a value.
포장된 값 또는 값이 없음을 나타내는 nil을 표현하는 타입 - Optional (Apple Developer)
let shortForm: Int? = Int("42")
let longForm: Optional<Int> = Int("42")
안전한 프로그래밍을 문법으로 담보하기 위함. 'Optional'이라는 단어의 뜻과 동일하게 값의 유무 (wrapped value or nil)를 타입만으로 알 수 있게 한다. 소프트웨어 배포 전 프로그래머의 실수를 문법을 통해 방지할 수 있음.
메모리 크래시 (Memory Crash)
어떤 오류 때문에 꺼졌다는 등의 메세지가 화면에 전시되며 바탕화면으로 팅기는 경우가 이런 경우의 일종이다.
왜 비어있는 값 (nil)에 접근하면 메모리 크래시가 일어날까? 빈 공간에 접근하는게 왜 문제가 될까?
RAM의 관리 주체는 운영체제의 커널(kernel)로, 운영체제가 RAM에서 각자가 있을 자리를 마련해 준다.
각자의 주소가 할당되어 있는 상태에서 갑자기 A가 B의 자리를 침범하려고 할 경우, 운영체제는 자비 없이 없애버린다 (이러한 행위를 허용할 경우 너무나 다양한 상황이 있을 수 있기 때문에).
빈 공간이라는게 애초에 필요한가?
- swift는 '될 수 있으면 빈 공간을 사용하지 말자'가 기조
- 어떤 변수라도 빈 공간이 아닌 상태로 있어야 함 (빈 공간을 허용하지 않음)
- nil을 봤다면 무조건 옵셔널임을 보장
운영체제(Operating System; OS)가 있는 이유?
사용자가 알 필요가 없는 것들을 묶어서 관리하기 위함
컴퓨터는 실행해보기 전까지 안에 어떤 것이 있는지 알지 못한다. 그러므로 값을 가져올 때 항상 nil일 가능성을 내포하고 있다. 그러므로 보통 옵셔널 바인딩을 사용하여 확인 후 값을 가져오는 경우가 대다수이다.
let imagePaths = ["star": "/glyphs/star.png",
"portrait": "/images/content/portrait.jpg",
"spacer": "/images/shared/spacer.gif"]
if let starPath = imagePath("star") {
~~
} else {
print("starPath 없음")
}
Note: 아래와 같이 nil 병합연산자를 사용하여 빈 문자열을 가져오는 것은 잘 알고 쓰는 것이 아니라면 좋지 않은 습관임.
let path = videoPaths["Star"] ?? ""
공백으로 이루어진 사용자의 입력을 처리하는 과정에서 Unconditional unwrapping의 사용을 피하기 위해 여러 차례에 걸쳐 옵셔널 바인딩을 실시했다. 사용자의 입력을 받기 위해 readLine() 함수를 사용하였는데 이는 String? 형태로 받는 것이기 때문에 String? → String → Int? → Int의 과정을 위해 옵셔널 바인딩을 두 번 실시한 것이다. 이 과정에서 사용자 입력 그대로를 받아들이기 위한 옵셔널 바인딩된 상수 하나, 구분자가 공백인 사용자의 입력을 배열에 String으로 할당하기 위해 상수 하나, 배열에서 요소를 하나씩 꺼내어 Int로 변환하기 위해 할당할 옵셔널 바인딩된 상수 하나, 마지막으로 Int로 변환된 요소를 넣기 위한 배열 하나까지 사용자의 입력을 받기 위해 총 네 개의 상수가 필요했다. 이는 이름도 네 개가 필요한 것인데 사용자 입력을 받아들이기 위한 메서드 하나를 만들기 위해 이렇게 많은 상수를 활용하는 것이 맞는지 의문이 들었다. 답은 swift 문법에 있을 것으로 예상하고 오늘부터 문법 공부를 제대로 해보고자 한다.
본 블로그의 포스팅과 같이 예시 코드의 결과 제시를 위한 주석 이외에 작성하는 코드에 대해서는 오늘부로 모든 주석을 문서화 주석으로 변경했다. 다소 길더라도 명확한 의미를 표현할 수 있도록 진행 중인 프로젝트의 변수, 상수, 메서드명을 새로 부여하였다. 변수, 상수와 메서드명 짓기가 영원한 숙제라고 하던데 이제 시작인가보다.