일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Stack
- 두근두근 자료구조
- PHP
- Java
- LoB
- windosws wbcs
- System
- C
- 백준
- 큐
- 자료구조
- 시간복잡도
- c언어
- 암호수학
- 재귀
- 미로 탐색 알고리즘
- 파일 시스템
- ftz
- 정렬 알고리즘
- pwnable.kr
- War Game
- web
- 파이썬
- HTML
- level13
- ftz level13
- SWiFT
- OSI
- windosw 문자열
- 스택
- Today
- Total
목록Programming/Swift (37)
나의 기록, 현진록

Objective반복된 동작을 위해 주로 for in 또는 forEach를 주로 사용해 왔다.가끔 알고리즘 문제를 풀곤 할 때 forEach 문을 사용했을 때 시간 초과가 발생했던 적이 있어서 둘 중 for in이 더 빠르다고 느껴왔다.경험으로 인해 그렇다고 느껴왔던 것이지 의문만 가지고 실제 두 차이를 알아보려고 시도하진 않았던 것 같다. for-in과 forEach 중 어떤 것이 속도와 메모리 측면에서 성능 분석 후 어떠한 상황에서 사용하는 게 적합한지 알아보자 Key ResultKR1 - 어느 것이 속도가 더 빠른지 비교한다.KR2 - 어느 것이 메모리 사용량이 적은지 비교한다.KR3 - 각각 어떠한 상황에서 사용하는 것이 적합한지 분석한다. KR1 - 속도 비교import Foundation..

1. 메인 큐- 메인 스레드이자 메인 큐이다.- 한 개이고 직렬성을 가진다.DispatchQueue.main.async{ // 메인 스레드에서 비동기 작업을 수행함} 2. 글로벌 큐- 6가지 종류의 Qos를 가짐- default는 ConcurrentDispatchQueue.global.async{ // 글로벌 큐로 비동기 작업을 보냄} DispatchQueue.global(qos: .userInteractive) { // 거의 즉시 처리 // 유저와 직접적 인터렉티브 // UI 업데이트, 애니메이션, UI 반응(사용자와 상호작용)}DispatchQueue.global(qos: .userInitiated) { // 몇 초 안에 처리 // 유저가 즉시 필요로 하지만, 비동기적으로 처리된 작업..

동시성 프로그래밍이 필요한 이유iOS 앱 개발 시 비동기적인 작업을 제대로 처리 하지 않으면 버벅이는 상황을 경험한 적 있을 것이다. 동기적으로 작업이 이루어졌기 때문에 그러한 증상을 볼 수 있는데 메인 스레드가 아닌 다른 스레드로 작업을 분산 처리하여 비동기적인 코드를 작성하여 이러한 문제를 해결할 수 있을 것이다. Swift에서는 직접적으로 스레드를 관리하지 않는다. 큐에 작업을 할당하면 Swift는 알아서 적절한 스레드에 작업을 할당한다. 위에서 말한 큐는 Swift에서 제공하는 GCD(DispatchQueue)와 Operation(OperationQueue) 등을 활용할 수 있다.비동기(Async)의 개념- 메인 스레드가 작업을 다른 스레드에 보내고 그 작업이 끝나길 기다리지 않고 메인 스레드는 ..

프로그램을 절차적으로 실행되는 명령어의 집합이기 보다 여러 독립적인 부품(객체)들이 유기적인 집합체로 파악하고자 하는 패러다임이다. 객체지향적 설계- 자동차를 만든다고 할 때 수많은 부품의 결합과 연결로 하나의 완전한 자동차가 만들어지는 것처럼 프로그램의 일부분에 해당하는 부품, 즉 객체를 먼저 만들고 여러 객체들을 조립해서 하나의 완성된 프로그램을 만드는 방법론라고 볼 수 있다. - 컴퓨터 부품을 갈아끼울 떄 해당하는 부품만 쉽게 교체하고 나머지 부품들은 건들이지 않아도 되는 것처럼 객체 지향적 원리를 잘 적용해둔 프로그램은 각각의 객체들이 독립적인 역할을 가지기 때문에 코드의 변경을 최소화하고 유지보수 하는 데 유리하다. - 객체 지향적 설계로 인해 프로그램을 보다 유연하고 변경이 용이하도록 만들 수..
클로저에 대한 강한 참조 사이클 강한 참조 사이클은 클래스의 인스턴스의 프로퍼티에 클로저를 할당하고 해당 클로저의 본문에 인스턴스를 캡처하는 경우에도 발생할 수 있다. 이러한 캡처는 클로저의 본문에서 self.someProperty 와 같이 인스턴스의 프로퍼티에 접근하거나 클로저는 self.someMethod()와 같이 인스턴스의 메소드를 호출하기 때문에 발생할 수 있다. 두 경우 모두 클로저가 self를 캡처하여 강한 참조 사이클을 생성하게 되는 경우이다. 클로저에서 강한 참조 사이클이 발생할 수 있는 이유는 클로저도 참조 타입(Reference Type)이기 때문이다. 프로퍼티에 클로저를 할당하면 해당 클로저에 참조를 할당하는 것이다. 아래의 예제는 self를 참조하는 클로저를 사용할 때 강한 참..
ARCSwift에서 메모리를 추적하고 관리하기 위한 메모리 관리 방식이다. Reference Counting으로 메모리 할당과 해제 여부를 결정한다. 참조 타입은 메모리에서 Heap 영역에 할당 되고 그 인스턴스에 대한 Reference Count를 가진다. 자동으로 관리된다고 하지만 순환 참조(Circular Reference)가 발생하지 않도록 하기 위해서는 개발자의 추가적인 비용?이 필요하다. ARC / GCJAVA에서의 GC(Garbage Collection)과 비슷하지만 분명한 차이는 Reference Counting 시점이다. GC는 런타임 중에 동적으로 메모리를 추적한다. 이러한 경우 프로그램이 실행 중인 동안 계속해서 메모리를 감시하기 때문에 이에 따른 부하가 발생하지만 불필요한 메모리가 ..
1. Struct와 Class주요 차이점특징StructClass메모리 할당Stack 영역, 메모리에서 값을 복사해 사용하므로 독립된 인스턴스를 생성Heap 영역, 메모리에서 동일한 인스턴스를 여러 곳에서 참조타입값 타입(Value Type)참조 타입(Reference Type)상속불가능가능성능메모리 복사가 빨라 성능이 우수메모리 참조로 인해 성능이 낮음 struct User{ var name: String var age: Int}var a = User(name: "유현진", age: 5)var b = User(name: "유현진 아님", age: 6)var c = ba.name = "유"print(a)print(b)print(c)b.name = "현"print(a)print(b)print(c)..

스위프트 프로그래밍 3판 - 야곰 지음 15.2 필터 필터는 말 그대로 컨테이너 내부의 값을 걸러서 추출하는 역할을 하는 고차함수입니다. 맵과 마찬가지로 새로운 컨테이너에 값을 담아 반환해줍니다. 다만 맵처럼 기존 콘텐츠를 변형하는 것이 아니라, 특정 조건에 맞게 걸러내는 역할을 할 수 있다는 점이 다릅니다. filter 함수의 매개변수로 전달되는 함수의 반환 타입은 Bool입니다. 해당 콘텐츠의 값을 갖고 새로운 컨테이너에 포함될 항목이라고 판단하면 ture를, 포함하지 않으려면 false를 반환해주면 됩니다. let numbers = [0,1,2,3,4,5] let evenNumbers = numbers.filter{(number: Int) -> Bool in return number % 2 == 0..

스위프트 프로그래밍 3판 - 야곰 지음 스위프트는 함수를 일급 객체로 취급합니다. 따라서 함수를 다른 함수의 전달인자로 사용할 수 있습니다. 매개변수로 함수를 갖는 함수를 고차함수라고 부르는데, 스위프트에 유용한 대표적인 고차함수로는 맵 필터 리듀스 등이 있습니다. 이번 장에서는 맵, 필터, 리듀스를 통해 데이터의 연산을 쉽게 실행하는 방법을 알아보겠습니다. 15.1 맵 맵은 자신을 호출할 때 매개변수로 전달된 함수를 실행하여 그 결과를 다시 반환해주는 함수입니다. 스위프트에서 맵은 배열, 딕셔너리, 세트, 옵셔널 등에서 사용할 수 있습니다. 조금 더 정확히 말하자면 스위프트의 Sequence, Collection 프로토콜을 따르는 타입과 옵셔널은 모두 맵을 사용할 수 있습니다. 맵을 사용하면 컨테이너가..

스위프트 프로그래밍 3판 - 야곰 지음 14.2 빠른 종료 빠른 종료의 핵심 키워드는 guard이다. guard 구문은 if 구문과 유사하게 Bool 타입의 값으로 동작하는 기능입니다. guard 뒤에 따라붙는 코드의 실행 결과가 true일 때 코드가 계속 실행됩니다. if 구문과는 다르게 guard 구문은 항상 else 구문이 뒤에 따라와야 합니다. 만약 guard 뒤에 따라오는 Bool 값잉 false라면 else의 블록 내부 코드를 실행하게 되는데, 이때 else 구문의 블록 내부에는 꼭 자신보다 상위의 코드 블록을 종료하는 코드가 들어가게 됩니다. 그래서 특정 조건에 부합하지 않다는 판단이 되면 재빠르게 코드 블록의 실행을 종료할 수 있습니다. 이렇게 현재의 코드 블록을 종료할 때는 return,..