[Swift] weak를 활용한 Linked List
·
Swift/개념 & 응용
링크드 리스트 링크드 리스트는 실제 개발에서도 자주 사용되는 자료구조로, 이전에도 포스팅을 작성한 적이 있습니다. [자료구조] Linked List(링크드 리스트) with Swift 안녕하세요. 개발하는 정주입니다. 오늘은 "Linked List(링크드 리스트)"을 정리하였습니다. 최근에 코딩 테스트를 준비하기 위해 알고리즘 포스팅만 잔뜩 적었는데요. 오랜만에 자료구조를 포스팅 jeong9216.tistory.com 오늘은 약한참조 키워드인 weak를 활용해 코드를 최적화한 양방향 링크드 리스트에 대해 포스팅하려고 합니다. LinkedListNode class LinkedListNode { var value: T var next: LinkedListNode? weak var previous: Linke..
[Swift] 프로토콜 기본 구현 정의하기 (extension Protocol)
·
Swift/개념 & 응용
필요성 프로토콜은 상속과 달리 프로토콜의 정의 부분만 추가된다는 장점이 있습니다. 상속은 부모 클래스의 모든 것을 받기 때문에 프로토콜보다는 무겁죠. 또, 프로토콜은 구조체를 이용해 다형성을 구현하는 핵심 기술이기 때문에 반드시 필요합니다. 그렇지만 프로토콜은 프로토콜에서 정의한 모든 것을 구현해야 한다는 번거로움(?)이 있는데요. 프로토콜을 확장(extension)하면 이를 해소할 수 있습니다. 프로토콜 확장 protocol Testable { func hello() func bye() } 실습을 위한 프로토콜입니다. (형편 없는 네이밍이지만 able은 꼭 붙여주는 ㅋㅋ) Testable 프로토콜에서는 hello와 bye 메서드가 있어서 Testable 프로토콜을 채택하면 두 개의 메서드를 꼭 구현해줘..
[Swift] 값 타입에서 참조 타입 사용 시 주의할 점(feat. isKnownUniquelyReferenced)
·
Swift/개념 & 응용
서론 이 주제는 옛날에도 다루긴 했지만 따로 한 번 더 다루는 것도 좋다고 생각해서 포스팅을 남깁니다. Collection -> Copy-On-Write -> isKnownUniquelyReferenced -> 이번 주제 라는 의식의 흐름 공부를 하고 있었고,,,, 사실 곧 면접이 있어서 포스팅하는 게 시간적으로 굉장히 큰 부담이지만,,, 그래도 기록해두면 저도 좋고 방문자님들도 좋고 좋은게 좋은거니.. ㅎㅎ 아무튼, 이번 포스팅에서는 구조체에서 참조 타입 사용 시 주의할 점에 대해 알아보겠습니다. (전체 코드는 최하단에 있습니다. 코드가 이미지라고 너무 노여워하지 마세요.) Value Semantics와 Reference Semantics Value Semantics 구조체는 값 타입이기 때문에 하나의..
[Swift] CustomStringConvertible - 구조체, 클래스 출력하기
·
Swift/개념 & 응용
CustomStringConvertible 소개 Swift에서 구조체나 클래스를 출력하면 저희가 원하는대로 나오지 않는 경험 다들 한 번씩은 해보셨을 겁니다. 예를 들어, class Point { var x: Int var y: Int init(x: Int, y: Int) { self.x = x self.y = y } } 이런 Point 클래스가 있을 때 이 객체를 출력할 때 x와 y 값을 확인하고 싶다고 합시다. let point = Point(x: 1, y: 2) print(point) //__lldb_expr_15.Point 그래서 point 객체를 출력하면 x, y가 아니라 객체 정보가 출력이 돼요. 클래스를 구조체로 바꾸면 클래스보다는 낫지만 우리가 흔히 사용하는 (x, y) 형태가 아니라 구조..
[Swift] "public typealias AnyObject" (짧)
·
Swift/개념 & 응용
AnyObject AnyObject가 프로토콜이라는 것은 많은 분들이 아실 거에요. 근데 공식문서를 보니 AnyObject가 Protocol이 아니라 Type Alias라고 적혀있는거에요? 원래 프로토콜은 이렇게 Protocol이라고 적혀있잖아요..?? 근데 AnyObject는 왜 Type Alias라고 적혀있을까? 라는 생각이 들었습니다. (1차 혼란) 그래서 AnyObject를 타고 들어가서 보니 typealias로 적혀있더라고요. 근데 좀 어색하지 않나요? 원래 typealias는 OOO = 타입으로 옆에 어떤 타입인지 적혀 있어야 합니다. 근데 AnyObject에는 아무것도 없는거에요... (2차 혼란) 이에 대해 검색해보니 이미 누가 스택오버플로우에 올렸더라고요. 알고보니 원래 코드에는 정상적으..
[Swift] String.Index 활용법
·
Swift/개념 & 응용
서론 저는 String을 다룰 때 편의를 위해 [Character] 타입으로 변환하면서 사용해 왔습니다. 이러면 subscript를 이용해 원소에 접근할 수 있지만 배열로 변환하는 시간이 추가로 필요합니다. 그래서 String.Index를 잘 다뤄보고자 포스팅을 작성하기로 했습니다. 이번 포스팅은 String.Index가 무엇인지보다 여러 상황에서 어떻게 사용하는지를 다룹니다. 아래에서 꾸준히 나오는 string 변수는 "abcdefg" 입니다. String.Index 이 주제는 이미 지난 포스팅에서 다룬 적이 있습니다. [Swift] Unicode Scalar와 String의 Random Access 서론 오늘 iOS Developers KR 카톡방에서 재밌는 사실을 알았습니다. (사실 공식 문서에 나..
[Swift] 왜 ContiguousArray는 Array보다 자주 사용되지 않을까?
·
Swift/개념 & 응용
서론 (아마 ContiguousArray에 대한 마지막 글) ContiguousArray는 Array보다 효율적입니다. 이는 공식 문서에도 나온 내용이고, 저도 관련해서 포스팅을 썼었죠. (https://jeong9216.tistory.com/468) 하지만 실제 코드를 보면 Array가 훨씬 더 자주 보입니다. 문득 궁금했습니다. ContiguousArray가 더 효율적이면 Array보다 더 자주 사용되어야 하는게 아닌가? 물론, ContiguousArray는 Array보다 덜 대중적이긴 합니다만, Array가 너무 압도적으로 사용이 된단 말이죠? 그래서 혹시 다른 이유는 없는지 찾아보았습니다. 참고로 이번 글은 저의 추측 내용도 많기 때문에 참고만 해주시면 감사하겠습니다. 혹시 틀린 내용이 있다면 댓..
[Swift] NSCache(feat. Dictionary)
·
Swift/개념 & 응용
서론 이미지 캐싱을 구현하다가 NSCache와 Dictionary의 차이점이 궁금해서 찾아보았습니다. 이미 많은 블로그에서 다룬 주제이지만 직접 실험도 해보면서 제 지식으로 만들기 위해 포스팅 해봅니다. 중간 중간 주관적인 의견도 섞여 있으니 틀렸거나 반대 의견이 있으시다면 댓글로 알려주세요. NSCache NSCache는 key-value 형태의 데이터를 임시로 저장하는데 사용할 수 있는 가변 컬렉션(mutable collection) 입니다. NSCache에 의해 캐싱된 데이터는 메모리가 부족할 때 일정한 규칙에 따라 제거될 가능성이 있습니다. NSCache는 클래스 앞에 NS가 붙는 것으로 유추할 수 있듯이, Objective-C 환경에서 구동된다는 것이 특징입니다. NSCache는 Key, Val..
[Swift] Unicode Scalar와 String의 Random Access
·
Swift/개념 & 응용
서론 오늘 iOS Developers KR 카톡방에서 재밌는 사실을 알았습니다. (사실 공식 문서에 나와 있는 내용이라 이전에도 알고 있긴 했음 ㅎ;;;) 👨‍👩‍👧‍👧는 여러 개의 유니코드가 합체하여 이루어진 이모지라는 것인데요. 그래서 var emoji = "👨‍👩‍👧‍👧" print(emoji.count) //1 print(emoji.unicodeScalars.count) //7 count를 출력하면 1이지만 unicodeScalars를 출력하면 7이 됩니다. 오늘은 unicodeScalar에 대해 알아보고 String에서 Random Access를 지원하지 않는 이유도 엮어서 알아보겠습니다. Unicode 유니코드는 현존하는 전 세계의 모든 문자를 시스템에서 표현하고 다룰 수 있도록 고안된 표준입..
[Swift] O(1)로 제곱 수인지 확인하기
·
Swift/개념 & 응용
숫자가 x의 제곱 수인지 확인하기 특정 수가 x의 제곱 수인지 확인하는 방법은 많습니다. 가장 대표적으로 반복문을 이용하는 것이죠. while number >= 3 { if number % 3 != 0 { return false } number /= 3 } 이번 포스팅에서는 O(n)이 아닌 O(1)로 숫자가 x의 제곱 수인지 확인하는 방법에 대해 알아보려고 합니다. (알고리즘 문제를 풀다 알게 된 방법이에요! ㅎㅎ) n이 3의 제곱 수인지 판단한다고 가정합시다. 9는 3의 제곱수입니다. -> 9 % 3 == 0 27은 3의 제곱수입니다 -> 27 % 3 == 0, 27 % 9 == 0 ... 이 패턴을 살펴보면 (더 큰 3의 제곱수 % 작은 3의 제곱수) 값은 항상 0 입니다. 이는 "더 큰 3의 제곱수..
[Swift] isMultiple(of:) 소개
·
Swift/개념 & 응용
isMultiple(of:) 알고리즘을 풀다 isMultiple(of:)를 알게 되어 소개드리기 위해 포스팅을 작성합니다. 간단한 메서드지만 매우 편리하다고 느꼈거든요. isMultiple(of:)는 배수인지 판단하는 메서드입니다. 두 정수 a와 b에 대하여, a = q*b인 세 번째 정수 q가 존재한다면, a는 b의 배수이다. 예를 들어 6 = 2*3이므로 6은 3의 배수입니다. 0은 임의의 정수 x에 대해 0 = 0*x이므로 모든 것의 배수이다. 애플 공식 문서에 나와있는 isMultiple의 Declaration입니다. 메서드 정의를 통해 정수형만, 그중에서도 FixedWidthInteger 프로토콜을 준수한 정수형만 취급한다는 것을 알 수 있습니다. 예제 코드도 살펴봅시다. let number =..
[Swift] 깊은 복사와 얕은 복사(feat. NSCopying)
·
Swift/개념 & 응용
Value 타입과 Reference 타입 값(value) 타입과 참조(reference) 타입은 복사 방식이 다릅니다. 일반적으로 값 타입은 깊은 복사, 참조 타입은 얕은 복사가 발생한다고 알고 계실텐데요. 정말 그런지 알아보고 참조 타입이어도 깊은 복사를 할 수 있는 방법에 대해 알아봅시다. 깊은 복사(Deep copy) 깊은 복사는 데이터 자체를 복사하는 방법입니다. 각자 독립적인 메모리를 차지하기 때문에 복사한 인스턴스의 데이터를 바꾸더라도 원본에 영향을 주지 않습니다. 값 타입의 인스턴스들은 깊은 복사를 하게 되는데요. 아래는 Collection 타입인 Array를 복사하는 예제입니다. var arr: [Int] = [1, 2, 3] var copyArr = arr print("arr: \(arr..
[Swift] Swift Interview Questions - Intermediate(중급)
·
Swift/개념 & 응용
현재 포스팅은 2편 Intermediate 질문입니다. 1편 Beginner 보러가기 Question 1 차이가 없습니다. nil과 Optional.none은 같습니다. 동작은 같아도 nil로 작성하는 것이 일반적인 코드 컨벤션에 더 맞습니다. Question 2 let 인스턴스는 mutating 메서드를 호출할 수 없습니다. mutating 메서드는 값을 바꿀 것이라는 전제 하에 정의한 메서드인데 let 구조체 인스턴스는 내부 프로퍼티를 변경할 수 없으므로 컴파일 에러가 발생합니다. Question 3 I love cars가 출력됩니다. thing 변수를 변경하기 전에 closure에서 thing을 캡처했습니다. 따라서 I love cars가 출력됩니다. 만약 [thing]이 없었다면 "I love a..
[Swift] Swift Interview Questions - Beginner(초급)
·
Swift/개념 & 응용
서론 raywenderlich의 Swift Interview Questions에 답변을 달아보려고 합니다. Beginner, Intermediate, Advanced로 나뉘어져 있는데 이번 포스팅에서는 Beginner 질문에 대한 답변입니다. Swift 공부를 하면서 제대로 이해를 했는지, 무엇을 모르는지 알 수 있는 좋은 기회가 될 것 같아요 ㅎ Question #1 tutorial1의 difficulty는 1, tutorial2의 difficulty는 2입니다. 구조체는 값 타입이기 때문에 인스턴스의 변화가 다른 인스턴스에 영향을 주지 않기 때문입니다. 만약 Tutorial이 클래스였다면 tutorial1과 tutorial2는 같은 참조 인스턴스를 가지므로 tutorial1의 difficulty도 2..
[Swift] GCD와 Swift Concurrency 성능 비교
·
Swift/개념 & 응용
GCD와 Swift Concurrency GCD와 Swift Concurrency인 async/await를 비교하는 포스팅은 이미 몇 개 작성했습니다. 이번 포스팅에서는 성능에 초점을 맞춰서 어떤 차이가 있는지 알아보겠습니다. 문법 비교 여기에서도 다루긴 했지만 GCD와 Swift Concurrency의 문법은 어떤 차이가 있는지 한 번 더 짚고 넘어가기로 하죠. 가독성 기존 escaping 클로저와 completion handler를 이용한 비동기 코드는 가독성이 떨어집니다. func processImageData1(completionBlock: (_ result: Image) -> Void) { loadWebResource("dataprofile.txt") { dataResource in loadWe..
유정주