[인터뷰질문 010] "문자열은 Swift에서 컬렉션입니다"라는 말은 무엇을 의미합니까?

이미지
String type 은 Collection 프로토콜을 채택했기 때문에, 문자열은 컬렉션입니다. 라고 말할 수 있습니다. 이것이 의미하는 바는, Collection 타입이 가지고 있는 프로퍼티와 메소드들을 사용할 수 있습니다. 예를들면 startIndex , isEmpty 와 같은 프로퍼티, index(_ i: Self.Index, offsetBy distance: Int, limitedBy limit: Self.Index) -> Self.Index? 와 같은 메소드 입니다. Collection 프로토콜은 원소들을 순회하는 연속성을 가지고 있습니다. 기본적으로 Sequence 프로토콜을 채택하고 있기 때문입니다. 하지만 Sequence 프로토콜과 다른점은, 순서대로만이 아닌 임의 key, index 값을 가지고 접근할수 있습니다. 또한 처음부터 끝까지 돌아가는게 아닌, 중간부분부터 얻을 수 있습니다.

[인터뷰질문 009] one-sided ranges가 무엇이며 언제 사용할 수 있나요?

이미지
범위 연산자 범위를 나타내는 여러가지 방법이 있습니다. closed range operator 0...5 // [0, 1, 2, 3, 4, 5] half-open range operator 0..<5 // [0, 1, 2, 3, 4] one-sided range operator ...5 // ?? 특정 조건에서는 one-sided ranges 를 사용할 수 있습니다. 에를 들면 아래의 코드 같은 경우 입니다. let friends = [ "Leeo" , "Jonh" , "Tim" , "Lisa" , "Mons" ] let member = friends[..< 3 ] // "Leeo" , "Jonh" , "Tim" 활용 배열을 잘라서 사용해야 할 떄, 일부분을 자르는게 아닌, 처음부터 어디까지 혹은 어디부터 끝까지 자를 떄 활용하면 편리합니다. 어디서 부터 시작인지, 어디까지가 끝인지 명시하지 않아도 잘리기 때문이죠.

[Swift-30-Projects] 06. IOS 클론코딩 SimpleRSSReader

이미지
테이블 뷰를 그리는데 매번 정형화된 데이터는 JSON 이었습니다. 그래서 이번에는 XML Parser를 이용해, RSS를 읽어오는 Reader를 만들었습니다. 앱 구조 테이블 뷰, 한 개의 화면으로 이루어진 앱 입니다. 기능 또한 심플합니다. rss요청에 대한 응답을 받아와 파싱해서 읽을 수 있게 나열해주는 것 입니다. 앱 구현 순서 구체적으로 나열하지 않아도, 여태까지 앱을 만들었던 순서는 항상 아래와 같았습니다. 앱을 여려개 만들다 보니 나름의 공정과정이 생긴 것 같습니다. 와이어 프레임 및 동선구현 - 네비게이션 뷰, 상세, 팝업 페이지 구현 UI구현 - 필요한 뷰와 셀들을 구현해둡니다. 버튼을 배치 합니다. 모델링 - 내가 필요한 데이터를 모델링 하고, 목 데이터를 만듭니다. 기능 구현 - 목 데이터를 가지고 필요한 기능을 구현합니다 네트워크 - 실제 필요한 데이터를 API를 통해 가져옵니다. 에러 처리 - 네트워크 요청에 대한 실패 케이스를 정리해줍니다. 기타 화면 작성 - 로딩 뷰, 데이터 없음, 에러 페이지 작성 리팩토링 - 내가 작성한 코드가 읽기 쉽고, 확장성 있게 만들어 줍니다. 마무리 테이블 뷰와 관련된 앱만 여러개 만들다 보니 이제 좀 익숙 해졌습니다. 앱의 기초라 할 수 있는 테이블 뷰의 활용 방법에 대해 더 정리할 수 있는 기회가 있다면 다른 글에 적어놓도록 하겠습니다. 전체 코드는 github 에 올려놓도록 하겠습니다.

[인터뷰질문 008] 왜 불변성(immutability)이 중요한가요?

이미지
불면성 변수의 종류에는 상수인 let 과 변수인 var 가 있습니다. 이 중에서 불변성을 가지는 변수는 let 키워드를 가지는 변수 입니다. 두 변수의 차이는 말 그대로 불변성 입니다. 변수 안에 들어있는 값을 수정할 수 있느냐 없느냐의 차이이죠. 그렇다면 수정할 수 없는 상수를 언제 써야할까요? 활용 변수의 값이 변하지 않음을 보장합니다. 이 말은 코드를 볼 때 상수를 보고 그 안에 어떤 값이 있을지 쉽게 예측 할 수 있다는 말 입니다. 그래서 Xcode에서도 var 로 변수를 선언하더라도, 그 안의 값이 변하지 않으면 let 으로 바꿔 상수로 변경할 것을 제안합니다. 멀티 쓰레드의 코드를 작성했을 때, 다른 곳에서 내가 짠 코드의 값을 변경하지 못하게 막을 수 있습니다. 상수를 사용하면, 변수보다 데이터를 효율적인 방법으로 저장할 수 있습니다.

[인터뷰질문 007] Array를 사용할 때, map()과 compactMap()를 쓰는 차이점은 무엇인가요?

이미지
map vs compactMap 기본적으로 정의를 알아야 하는 내용이기 때문에, map 와 compactMap 의 내용을 보고 기능을 아는 것이 중요할 것 같습니다. 짧게 요약하면, map은 내가 가진 데이터들을 다른 형태나 다른 값으로 변환 해주는 녀석 입니다. compactMap은 내가 가진 데이터들 중에 nil 값을 제거해 주는 녀석이죠. 용도에 맞게 쓰면 되겠습니다 아래 예제 코드를 간단히 비교해서 언제 써야 할 지 고민해보아요. map let numberList = [ 1 , 3 , 4 , 5 , 7 ] print(numberList) // [1, 3, 4, 5, 7] let doubleNumberList = numberList.map { $ 0 * 2 } print(doubleNumberList) // [2, 6, 8, 10, 14] 정말 간단한 예제입니다. 내가 가진 데이터가 있는데, 모두 2배를 해야한다면 반복문인 for 로 모두 순회 하면서 2배씩 곱하고 그 값을 새로운 배열에 저장하는 방법이 가장 먼저 떠오르지만 위의 예제를 사용하면 우아하게 데이터를 변형할 수 있습니다. compactMap let numberListWithNil: [ Int ?] = [ 1 , 2 , 4 , nil, 1 , 3 ] print (numberListWithNil) // [ Optional ( 1 ), Optional ( 2 ), Optional ( 4 ), nil, Optional ( 1 ), Optional ( 3 )] let doubleNumberListWithNil: [ Int ] = numberListWithNil.compactMap { $ 0 } print (doubleNumberListWithNil) // [ 1 , 2 , 4 , 1 , 3 ] 마찬 가지로 가지고 있는 Array에 값이 항상 있다는 보장이 되지 않는 Optional 이라면, compactMap을 사용해서 Optional값을 없앤 새로운 데이터를 만들 수 있습니

[인터뷰질문 006] Float과 Double 그리고 CGFloat의 데이터 타입 차이는 무엇인가요?

이미지
처음 숫자를 다룰 때는, Int 형을 썼습니다. 그러다가 이제 나눗셈이 들어가면서 부터 실수를 사용해야 하는데, 그 때 마다 대충 적당히 쓰다가 정확한 차이점과 그 쓰임새를 정리하려고 합니다. Float vs Double 변수의 크기가 다릅니다. Int와의 다른점은 생략하겠습니다. 자세 한 부분은 부동소수점 을 참고하면 좋습니다. Float은 32-bit, Double은 64-bit 입니다. 즉 Float은 2의 24승인 16777216.0, Double은 2의 53승인 9007199254740992까지 표현할 수 있습니다. 물론 정확한 범위는 소수점까지 포함되어야 하겠지만 Float과 Double의 크기 차이가 어느 정도 인지만 나타내겠습니다. 아래 코드는 궁금해서 출력해 본 코드 입니다. 궁금하신 분들은 한 번 복, 붙 해서 돌려보세요 :) import Foundation var float : Float = 16777216 var double : Double = 9007199254740992 print ( float ) float = float + 1 print ( float ) print ( double ) double = double + 1 print ( double ) var total: Double = 1 for i in 1. .< 55 { total = total * 2 print (i, total) } Float vs CGFloat CGFloat은 import UIKit 해야 쓸 수 있다는 점이 다릅니다. 돌아가는 기기에 따라 32-bit 이나 64-bit이 될 수 있으나, 현실적으로는 거의 64-bit입니다. 추가적으로 Swift 5.5 버젼 이상에서는 CGFloat 과 Double 이 교환 가능하다고 합니다.

[인터뷰질문 005] Array와 Set의 차이가 무엇인가요?

이미지
Array와 Set의 차이점 Array, 한국어로 하면 배열입니다. 의미 그대로 무엇인가를 나열할 수 있는 배열이기 때문에 다양한 타입이 오기도 하고 중복되는 같은 값이 와도 이상하지 않습니다. Set, 한국어로 하면 집합입니다. 이런 저런것들이 나열되어 있다기 보다는 중복되지 않은 값들을 그룹으로 모아놓은 느낌이 강합니다. 정리 해 보면, 여러개의 값들을 나열할 수 있는 것은 Array , 중복을 제거한 집합은 Set 입니다. 그리고 조회에 있어서 Set 가 Array 에 비해 훨씬 빠릅니다. 아래의 코드를 통해 두 차이점을 비교해 보고 눈으로 확인 해 보도록 하겠습니다 import Foundation let sampleArray: [Int] = [ 1 , 1 , 2 , 3 , 3 , 3 ] var sampleSet:Set<Int> = Set([ 1 , 1 , 2 , 3 , 3 , 3 ]) print (sampleArray) // [1, 1, 2, 3, 3, 3] print (sampleSet) // [2, 3, 1] var numbers:[Int] = [] while numbers .count < 10000 { var number = Int.random( in : 1 ... 100000 ) if !numbers.contains(number){ numbers.append(number) } } sampleSet = Set(numbers) let startTime = CFAbsoluteTimeGetCurrent() print (sampleSet.contains( 98891 ) ) let processTime = CFAbsoluteTimeGetCurrent() - startTime print ( "set process time : \(processTime)" ) // set process time : 0.00021398067474365234 let star