수행 내용

  • 주석의 사용 (활동 학습 중)
  • Optional 활동 학습
  • 모둠원과 숫자야구게임 Step 2 상호 코드 리뷰, 병합 및 PR
  • 회고 3종 (일일, 주간, 프로젝트)

학습 내용

주석의 사용

  • 단 한줄의 코드라도 이름과 이유가 있어야함.
  • 따라서 주석이 없어도 코드를 이해할 수 있도록 만들어야 함.
  • 실무에서 변수 하나, 함수 하나를 파악하기 위해 들여야 하는 시간이 길다면 쓸모없는 변수, 함수이기 때문.
  • 주석은 문서화 주석을 사용하거나 주석을 달지 않거나 둘 중 하나만 한다.
    ⇒ 문서화 주석은 사용해보기 전에도 용도와 사용 방법, 주의할 점 등을 알게하기 위함.

Xcode 주석 관련 단축키

  • 문서화 주석 조회: alt + click
  • 정의 조회: cmd + ctrl + click

Optional

Optional

A type that represents either a wrapped value or nil, the absence of a value.
포장된 값 또는 값이 없음을 나타내는 nil을 표현하는 타입
- Optional (Apple Developer)

Optional의 표현

let shortForm: Int? = Int("42")
let longForm: Optional<Int> = Int("42")

왜 Optional이 필요한데?

안전한 프로그래밍을 문법으로 담보하기 위함. 'Optional'이라는 단어의 뜻과 동일하게 값의 유무 (wrapped value or nil)를 타입만으로 알 수 있게 한다. 소프트웨어 배포 전 프로그래머의 실수를 문법을 통해 방지할 수 있음.

  • 옵셔널은 비어있는 값에(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 문법에 있을 것으로 예상하고 오늘부터 문법 공부를 제대로 해보고자 한다.

주석의 사용

본 블로그의 포스팅과 같이 예시 코드의 결과 제시를 위한 주석 이외에 작성하는 코드에 대해서는 오늘부로 모든 주석을 문서화 주석으로 변경했다. 다소 길더라도 명확한 의미를 표현할 수 있도록 진행 중인 프로젝트의 변수, 상수, 메서드명을 새로 부여하였다. 변수, 상수와 메서드명 짓기가 영원한 숙제라고 하던데 이제 시작인가보다.

해결 방법

  • swift 문법 공부를 통해 불필요한 상수 할당을 피한다.
  • API Design Guidelines를 정독하여 swift의 명명법을 최대한 준수한다.

읽을 거리

profile
합리적인 해법 찾기를 좋아합니다.

0개의 댓글