적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

반응형

Swift 16

[Swift] UISwipeGestureRecognizer 를 이용한 스와이프 액션을 파헤쳐보자 !

스와이프 제스처에 대해 알아보자! Handling swipe gestures Detect a horizontal or vertical swipe motion on the screen, and use it to trigger navigation through your content. A swipe gesture occurs when a person moves one or more fingers across the screen in a specific horizontal or vertical direction. Use the UISwipeGestureRecognizer class to detect swipe gestures. UISwipeGestureRecognizer 이용해 스와이프 제스처를 감지할 수 있..

Swift 코드 실행 시간 측정 방법 (최신 방법..!)

개발을 하거나 코딩테스트 문제를 풀 때, 특정 코드가 실행되는 시간을 구하고 싶을 때가 있다. 아래의 함수들을 이용해 코드의 수행시간을 측정할 수 있다. 1. CFTimeInterval public func progressTime(_ closure: () -> ()) -> TimeInterval { let start = CFAbsoluteTimeGetCurrent() closure() let duration = CFAbsoluteTimeGetCurrent() - start return duration } progressTime { //실행 시간 측정할 코드 } 2. Date public func measureTime(_ closure: () -> ()) -> TimeInterval { let startD..

Algorithm/참고 2023.05.06

[Swift iOS] 이미지 캐시 처리 Memory vs. Disk

앱에서 사용되는 이미지가 많을 경우, 이미지를 매번 서버로부터 받아오면 로딩 속도도 오래걸리고 계속 네트워크 통신을 해주는 것도 리소스 낭비이기 때문에 이미지를 캐싱하는 작업을 해보았다. 이미지 캐싱이란? 다운로드된 이미지를 캐시(메모리 or 디스크)에 저장해두었다가 불러오는 방식으로, 한 번 다운받은 이미지는 별도의 리소스를 소모할 필요 없이 빠르게 가져와서 보여줄 수 있다. 물론 KingFisher SDWebImage 같은 이미지 라이브러리를 사용하면 이미지 다운로드 및 캐싱을 알아서 자동으로 처리해주고, 이미지를 메모리에 저장하는 대신에 디스크에 저장하고 필요한 만큼만 메모리에 올려서 사용하기 때문에 메모리 사용량도 줄이고 편하게 구현해줄 수 있다. 그치만 직접 구현 한번 해보자고...! iOS에서..

프로토콜 사용시 주의해야 할 강한 순환 참조 문제

‘weak' must not be applied to non-class-bound 'any …Delegate'; consider adding a protocol conformance that has a class bound 이러한 에러가 떴다. 클래스 인스턴스 간에 강한 순환 참조가 발생하는 경우가 있는데 흔히 Delegate 패턴을 사용할 때 이런 문제가 발생할 수 있다. * Retain Cycle (= Strong Reference Cycle) : 두 클래스 인스턴스가 서로 참조를 유지하면서 메모리에서 해제되지 않아 메모리 누수가 생기는 현상 그래서 UITableViewDelegate도 다음과 같이 weak var로 정의되어 있음. weak var delegate: UITableViewDelegate..

[Swift 알고리즘] 백준 11660 구간 합 구하기 5

○ 다이나믹 프로그래밍, 누적 합 Silver1 백준 11660번 구간 합 구하기 5 시간은 한시간 넘게 걸린거같은데 한번만에 통과함 ㅎㅎ 어떻게 계산해야될지 방법을 찾기만 하면 구현이 어렵진 않았음. 생각해내는건 쉽지않았음 ㅎㅎ (뻔한 말인가,,?) 누적 합과 DP의 경계가 살짝 모호하지만 행렬을 사용하니깐 공간에 값을 저장해나가는 게 누적합을 사용한 DP에 좀 더 가까운 것 같다는 느낌? //85696KB 584ms let nm = readLine()!.split(separator: " ").compactMap { Int($0) } let n = nm[0] let m = nm[1] var matrix: [[Int]] = [Array(repeating: 0, count: n+1)] for _ in 0..

Algorithm/Baekjoon 2023.04.06

[Swift GCD] GCD(Grand Central Dispatch)

멀티코어 환경에서 프로그램의 성능과 반응성을 높이고 더욱 효과적으로 사용할 수 있도록, 시스템 수준에서 GCD가 디스패치 큐를 이용해 multi threading을 지원하고 동시 작업을 관리해준다. 디스패치 큐는 작업들이 여러 쓰레드에서 동기적 or 비동기적으로 동작하며 동시에 일을 할 수 있도록, 큐(Queue)를 이용해 작업을 분산 처리 하는 FIFO 대기열이다. 디스패치 큐의 종류에는 main, global, private 큐가 있다. main 큐에서 실행되는 main thread는 iOS 에서 오직 하나만 존재하고, 모든 UI 작업들이 이 메인 쓰레드에서 처리된다. 메인 큐는 한 번에 하나의 task 밖에 실행하지 못하는 serial 큐이기 때문에, UI 실행에 영향을 끼칠 수 있는 네트워크 호출..

[Swift ARC] Automatic Reference Counting

Swift에서는 Automatic Reference Counting 방식을 이용하여 메모리 관리를 자동으로 해주고 있다. 참조 타입인 클래스의 인스턴스를 관리할 때 사용되는 방식으로, 클래스의 새 인스턴스를 만들 때마다 ARC는 해당 인스턴스의 정보를 저장하기 위해 메모리에 할당하고, 해당 인스턴스를 참조하는 횟수(reference counting)를 추적하여 더 이상 사용되지 않을 경우 자동으로 메모리를 해제해준다. Reference Counting이란? 메모리를 제어하는 방법 중 하나로, garbage collection의 한 방식이다. 어떤 한 동적 단위(객체, Object)가 참조값을 가지고 이 단위 객체가 참조(참조 복사)되면 참조값을 늘리고 참조한 다음 더이상 사용하지 않게 되면 참조값을 줄이..

[Swift] Generic에 대하여

Generic은 Swift 의 가장 강력한 기능 중 하나로, Swift 표준 라이브러리의 대부분은 generic 으로 이루어져 있다. 흔히 사용하고 있는 배열과 딕셔너리가 바로 generic collection으로 제네릭의 대표적인 예이다. 타입을 특정하지 않고 함수나 타입을 구현할 수 있도록 하여, Generic을 사용하면 유연하고 재사용 가능한 코드를 작성할 수 있다. 제네릭을 정의할 때 타입 파라미터로는 placeholder type으로 T를 흔히 사용하며, 사용 시에 타입이 확정되면 실제 타입으로 대체된다. ex) 제네릭 함수 : swap, 제네릭 타입 : Array, 커스텀 Stack Generics Generic은 어떤 타입이든 넣어줄 수 있는, 유연하고 재사용가능한 함수와 타입을 작성할 수 ..

[Swift] Codable - CodingKey

CodingKey A type that canbe used as a key for encoding and decoding. 인코딩 및 디코등을 위한 키로 사용될 수 있는 타입 protocol CodingKey : CustomDebugStringConvertible, CustomStringConvertible, Sendable CodingKey 사용하는 경우 Swift에서는 변수나 상수를 선언할 때 카멜케이스를 사용한다. 그런데 예를 들어 JSON 에서 스네이크 케이스를 사용하는 경우, 다음과 같이 내려받은 JSON 키 "actual_price" 와 Items 구조체에서 선언해준 "actualPrice" 키가 일치하지 않을 수 있다. 이런 경우 CodingKey를 사용하여 키를 변환(?) 연결(?) 해주면..

[알고리즘] 동적계획법 DP(Dynamic Programming)

DP가 왜 필요? DP의 장점? DP 문제 어떻게 알아보고 접근할지 1. 다이나믹 프로그래밍의 목적 DP 는 완전 탐색, DFS, BFS 와 같이 수많은 경우의 수를 전부 따져봐야 하는데, 경우의 수가 너무 많아서 속도가 느려지는 문제를 개선하고 수행시간을 단축하고자 만들어진 알고리즘. DP가 없던 시절에는 최단 경로를 찾거나, 최고 점수를 만들거나 하는 문제를 풀기 위해 모든 조합을 다 만들어 보는 수밖에 없었음. DP 알고리즘이 만들어진 후에는 수행시간을 현저하게 줄일 수 있었다. 예시) 프로그래머스 - 정수 삼각형 (Swift는 지원 안됌..ㅠ) => 메모리를 사용해서 중복 연산을 줄이고, 중복 연산을 줄여 수행 속도를 개선한다. 메모리를 사용한다 : 배열 혹은 자료구조를 만든다. 중복 연산을 줄인..

728x90
반응형