107건의 항목

  • 실버5 : 브루트포스 문제이다.

  • 브론즈2 : 브루트포스 문제이다.

  • 실버1 : 수학 문제이다. 풀이 에라토스 테네스를 적용한 수를 가져오고, 이를 기반으로 상근수 로직을 적용하여 답을 계산한다. Code // // main.swift // CodingTest // // Created by 최완식 on 2021/08/15.

  • 실버5 : 브루트포스 문제이다. 풀이 String으로 변환해서 판단하려고 했는데, 생성시간이 꽤나 오래걸리나보다.

  • 풀이1 실버5 : 브루트포스 문제이다. Code // // main.swift // CodingTest // // Created by 최완식 on 2021/08/15.

  • 풀이 하라는 대로 구현했다. 이거 부캠 시험에서 나온것 같은 기분이.

  • 풀이 하라는 대로 구현했다. 일단, board에서는 빈칸을 찾아야 하고, table에서는 채워진 조각을 찾아야 한다. 각각에서 그 빈 구석을 모두 도려낸 뒤에, 그 조각들이 맞는지를 완전탐색했다.

  • 풀이 다익스트라로 한번에 성공했다. 그래도 발전이 있나보네. 스위프트로 플루이드 워셜로 다시 풀었다. Code # AB가 함께 모든 노드까지 가는데 걸리는 최단 거리를 구한다. # 그리고 그 거리 각각에서 출발하여 # 1.

  • OOP 다음으로 떠오르는 패러다임인 FP에 대해서 알아보자. 물론 FP는 OOP보다 먼저 등장했다. 그렇다면 갑자기 왜 등장하게 되었을까? FP의 장점과 개념을 이해하면서 알아가보자.

  • 자주 사용하는 고차함수들에 대해서 이해해보자.map, flatMap과 같은 경우는 여러가지가 존재하는데, 각각의 활용 방법에 대해서 알아보자.

  • 함수형 프로그래밍에 대해서 공부해보면 꼭 나오는 용어들이 있다. 일급 시민, 함수 합성, 커링 등. 오늘은 이러한 단어들에 대해서 이해해보자. First Class Function function은.

  • 함수형 프로그래밍을 공부하다보면 벽을 한번 마주한다. Functor와 Monad가 그것이다. 이걸 이해하기 위해서 위키피디아에서 집합론?, 범주론? 이런 걸 읽었던 적이 있는 것 같은데 여전히 잘 모르겠다. 이번에는 와닿는 방식으로 이해하는 것을 목표로 한다.

  • 순수 함수형 프로그래밍언어 Haskell에는 Either라는 자료구조가 있다. 둘 중 하나의 타입을 가질 수 있는 경우 사용하는 자료구조라 한다. 이 Either 자료구조에 영감을 얻어 태어난 것이 Swift의 Result라 한다.

  • lazy property를 사용해본 경험이 있다. 해당 아이디어는 함수형 프로그래밍 언어에서 주로 사용한다. 이번에는 지연 계산법이 무엇인지, 그리고 Lazy와 unfold sequence에 대해 알아본다.

  • 코드의 관리는 중요하다. 위계 질서를 가지고 구분하지 않으면 혼란을 초래한다. 접근 제어는 특히 SDK 작업을 하는 경우 인터페이스 역할을 하기 때문에 잘 알아두는 것이 좋다.

  • Swift는 객체의 느낌으로 사용하는 3개의 개체가 있다. struct, class, enumeration이 그것이다. struct는 apple에서 권장하고, 실제로도 대체하는 것이 좋다고 생각되는 자료구조이고, enum의 경우 다른 언어보다 기능이 많이 추가되었다.

  • Value Type 다른 변수에 대입하면 복사됨 argument로 넘겨도 복사됨 argument로 collection을 넘겨서 변화주면 원하는 결과를 얻을 수 없음 Objective-C의 경우 가능 Array 동일한 Type의 값을 저장할 수 있는 Ordered List 동일한 값이 다른 위치에서 반복적으로 낭로 수 있음 Foundation의 NSArray와 bridge 표현 let array: Array<SomeType>() let array: [SomeType] let array = [Int]() let array ...

  • dictionary에 value를 넣는데 nil인 경우는 빼고 싶다.

  • static 변수 및 함수는 인스턴스를 생성하지 않고 접근하기 위해 사용한다. swift에서는 어디서 관리하는 것이 좋을까? swift에서 사용하는 Method가 궁금하다면 해당글을 읽고 오자.

  • 프로그래밍 언어에서 자주 사용하는 것들인 제어문, 문자열, 함수에 대해서 적어보려한다. 다른 언어와 많은 점이 다르지는 않기 때문에 한 포스팅에서 모두 알아보려 한다.

  • Enumeration 연관된 Value들의 공통 Type을 정의할 경우 사용 Type-Safe한 방법으로 사용 가능 특정 값으로 Raw Value 지정 필수 아님 Raw Value 사용 가능 자료 구조 String Chracter Integer Floating-point 사용 가능 기능 Computed Property Instance method Initializer Extension Protocol Raw Value의 묵시적 할당 enum Planet: Int { case mercury = 1, venus, earth, mars,...

  • 에러 처리는 프로그래밍에서 빼놓을 수 없다. 에러 관리를 제대로 해두어야 추후 디버깅에 있어 이득을 볼 수 있다. 미래의 나를 위한 투자?의 개념이다. 에러를 관리하는 것도 중요하지만 에러를 내는 방법, 에러를 감지하여 처리하는 방법을 아는 것 역시 중요하다.

  • Extension과 Protocol은 Swift에서 자주 사용되는 기능이다. 값에 접근이 불가함에도 Extension으로 추가 기능을 구현할 수 있다.

  • 일급 함수 parameter로 사용가능 return 값으로 사용가능 익명함수 argument label 호출하는 쪽에서 사용하는 이름 parameter name function 안에서 사용하는 이름 Variadic parameters 0개 이상의 특별한 타입을 나열해서 파라미터로 넘길 수 있음 ...을 넣어서 사용 이렇게 선언된 경우 함수안에서 해당 type의 Array로 사용할 수 있음 func sum(values: Int…) -> Int { var result = 0 for value in values { result +=...

  • Generic의 경우 코드 중복을 줄일 수 있는 좋은 기능이다. 잘 다뤄둔다면 중급(?) 이상의 개발자가 되는데 큰 도움을 줄 것이다.

  • 개념 특정 작업이 전역적으로 단일 스레드에서 실행되도록 보장하는 장치 우리는 @MainActor라는 키워드만 추가하게 되면 main thread에서 동작한다는 것을 보장할 수 있다.

  • Swift에서의 상속은 다른 언어와 비슷하다.

  • Swift에서 Struct, Class, Enum을 초기화할 수 있는 Initializer에 대해서 알아보자. 이 부분에서 class 초기화는 다른 언어의 초기화 과정과 약간 다른 부분이 있다. 해당 내용은 좀 길어질 수 있어 다음 포스팅으로 넘겼다.

  • 지난 글에서는 Objective-C에서 KVC/KVO가 어떻게 쓰였는지 알아보았다. 이번에는 Swift다. Key Value Coding 여기까지는 Objective C에서 사용하는 것들이었다. 이제는 실제 많이 사용하는 Swift에서 어떤지 보자.

  • 이전 글들에서 Objective C의 KeyPath와 Swift에서의 KeyPath를 한번씩 보았다. 모양이 좀 달랐었는데 왜 다른지에 대해서 알아보자. 이번 글은 WWDC 17을 기준으로 한다.

  • Global, Static 변수에 대해 사용시에 초기화 되는 방법 eager 앱 시작시 생성됨 장점 단순하다. data race 문제 없다. 단점 초기 로딩시 느리다. lazy 사용시에 초기화됨 장점 초기 로딩시 필요없는 것들을 로딩하지 않아 빠르다.

  • 이전에 metatype에 대해 흘려들었었는데, 이번에 간단하게 정리해보려한다. metatype이란? Swift에서 우리는 특정 instance의 Type에 접근할 수 있다.

  • WWDC 24의 Swift 6 migration guide를 정리해본다.

  • 이미지와 글자가 있는 Button을 만들다가, String안에 image를 넣을 수 있다는 것을 알았다! NSAttributedString 텍스트 일부에 대해 특성(시각적 스타일, 하이퍼 링크 등)이 있는 문자열 텍스트 일부에 대해 특성들을 적용할 수 있는 String이다.

  • TableView의 index를 조정하면서 NSNotFound라는 값을 넣어주는 것을 보게되었다. 왜 이런 것이 필요한지 알아본다. 핵심 정리 ObjectiveC에는 Optional이 없다.

  • Notification Center는 꽤나 오래전 부터 iOS의 이벤트 전송 매커니즘으로 자리잡았다. 어떤 요소들이 있는지 확인해보자.

  • Swift를 처음 공부하면서 가장 어려웠던게 이 Optional인 것 같다. 애초에 개발도 처음할 시기였으니, 이런 자료구조가 왜 필요한지 전혀 몰랐었던 시간이 있었다. 해당 이유는 Either와 Result 이해와 실제 사용예 알아보기 포스트를 참고해주길 바란다.

  • 간단하게 property는 member 변수이다. 그런데 Swift에는 다양한 종류의 property가 존재한다. 사실 어떻게 보면 활용방법? 테크닉에 가깝겠다. 어떻게 property를 관리하는 지 안다면, 실제 코드를 간결하고 읽기 좋게 유지할 수 있다.

  • Protocol의 경우 POP라는 개념으로 Apple에서 밀어주는? 개념이다.

  • RunLoop이란 무엇일까? RunLoop Run loop은 일단 Thread와 관련된 녀석이다. 간단하게 말하면, Run loop은 event를 처리하기 위해 만들어진 loop이다. Timer 또한 함께 처리한다.

  • 인덱스로 Array 아이템을 탐색하다보면 항상 마주하는 것이 있다. Fatal error: Index out of range. 잘못하면 런타임에 애플리케이션이 바로 죽어버리기 마련이다. 아무리 염두에 둔다하더라도 우리는 사람인 이상 실수를 하기 마련이다.

  • Structure C언어 등의 구조체보다 다양한 기능 상속 불가능 인스턴스/타입 메서드 인스턴스/타입 프로퍼티 값타입 Swift의 대부분의 큰 뼈대는 모두 구조체 Struct가 선호되는 이유 mutability control에 유리 상태로 인한 부작용 없음 let 선언으로 완전한 immutable 자료형 생성 class의 경우 let 인스턴스여도 member 변수 변경 가능 성능 유리 referencing 소요 시간 감소 compiler가 강력한 최적화 수행 함수형 프로그래밍에서 효과정 immutable 요소를 바탕으로 code 가...

  • 스위프트에서 제공하지 않는 Combination, Permutation 구현이다.

  • 처음에 Swift 공부할 때는 정말 아무것도 몰라서, 힘들었던 경험이 있다. 좋은 기회로 한번더 정리할 시간이 생겼다. 다시한번 전체적으로 훑는 시리즈를 만들어본다. 먼저, Swift가 어떤 언어적 특징을 갖는지, 기본 문법은 어떤지 알아보는 시간을 가지려 한다.

  • 이전 글에서 RunLoop에 대해 알아보았다. Timer도 같이 처리한다 했었는데, 이번에는 Timer에 대해서 알아보려한다. Timer 특정 시간 간격이 지난 후, Target 객체로 메시지를 전송한다.

  • 특정 문자열이나 공백을 제거하려면 어떻게 해야할까? 공백 싹다 지우기 let myString = "This \n is a st\tri\rng" let trimmedString = myString.components(separatedBy: .whitespacesAndNewlines).joined() 양쪽 지우기 var string = " AAAAAAAA " let trimedString = string.trimmingCharacters(in: [" "]) // 양끝단의 특정 문자도...

  • 이전 글에서 초기화를 알아보았다. 그런데 그 과정에서 Two Phase Initialization이라는 생소한 단어를 보았다면 잘 왔다. Swift는 상속 과정에서 모든 instance의 property의 값이 보장되기 위한 방법으로 2단계 초기화 방법을 사용한다.

  • URLSession을 만들었다면, 그 안에 들어갈 URL과 Request를 정의해야 한다. 이번에도 문서를 보며 알아보자.

  • iOS App에서 서버와 통신하기 위해 Apple에서는 URLSession이라는 기본 API를 제공하고 있다.

  • 이전 글에서 URLSession, URL, URLRequest 를 생성하는 방법을 알아보았다. 이번에는 어떤 Task들이 있는지 알아보자. Task Apple에서 기본적으로 제안하는 task의 종류는 총 3가지이다.

  • type alias를 공부하면서 마주쳤던 associated type에 대해 알아본다.

  • autoreleasepool. 어딘가에서 들어봤지만 언제쓰는지는 전혀 몰랐다.

  • Data-race의 문제를 swift concurrency (compiler constraint)를 통해 해결하지 않고, 타 매커니즘을 통해 해결한 경우, 이에 대해 에러를 내뿜지 않도록 하는 키워드 swift concurrency는 compiler가 data-race에 대한 취약점을 파악할 수 있다는 점에서 유용하다.

  • 오늘은 작업 중 내가 모르는 코드를 발견해서 글을 써본다. reduce! reduce(::) 형태만 봐왔었는데 reduce(into::) 형태도 있더라! 알아보자.

  • enum에 static 변수를 사용해서 관리를 하다가 문득 이런 생각이 들었다. Type property에는 2가지 종류, static, class가 있는데 뭐가 다른거지? 이참에 헷갈렸던 용어까지 몽땅 정리해보려 한다.

  • Semantics Type typealias Kilograms = Double struct Package { var weight: Kilograms } Combine Protocols protocol ReadAccess {} protocol WriteAccess {} typealias AdminAccess = ReadAccess & WriteAccess struct Teacher: AdminAccess {} Int, Double은 어디서든 사용되는 타입이다.

  • generic을 보면서 몇몇 곳에서 where 키워드를 사용하는 것을 보았다. 한번 정리해야 할 것 같아 공식 문서을 읽어본다. Generic Where Clauses generic에도 where 조항을 넣어 받는 타입에 세부 제약을 추가할 수 있다.

  • Completion은 main에서 호출해주는 것이 좋다. 이유 api를 호출하고, 결과가 도착한 경우 completion을 호출하는 함수가 있다고 하자.

  • ! 사용하지 않기 Swift 코드에서 !가 보이는 경우는 두가지다. 연산자(!=, not, !==)에서 사용하는 경우는 제외한다.

  • 분기에 따라 값이 결정되는 코드를 짤 때, 변수를 무엇으로 선언하는 것이 좋을까? 작은 부분이나 좋은 지적이라 생각하여 정리해본다. 핵심 요약 분기에 따라 값이 결정될 때 변수를 선언해야 한다면, var보다는 let을 우선적으로 검토해보자.

  • Fundamentals 사용처에 대한 “명료함”이 최우선이다. “간결함”보다 “명료함”이 보다 중요하다. 모든 선언에 대해 문서를 작성해라. ??? 클린코드와 대치된다.

  • Parameters 문서에 제공할만한 매개변수 이름을 선택하자. 파라미터 이름을 숨겨 보이지 않는 경우에도 설명에 있어서는 중요하다.

  • Task는 코드 블럭을 독립적으로 사용할 수 있다. 이러한 점을 사용하면 병렬적으로 특정 코드를 처리하게 할 수도 있다.

  • 많은 수의 엔지니어와 nested states를 관리하기 위한 mobile app Cross-platform Architecture RIBs의 이름은 Router, Interactor, Builder의 약자이다.

  • Data(contentof)는 로컬 파일을 불러오기 위한 메서드이다. 애초에 동기 메서드이다. 가끔 이걸 DispatchQueue에 Item으로 싼뒤에 넣어 비동기 처럼 사용하는 경우가 있는데, 이러면 안된다. API의 존재 이유에 맞지 않기 때문이다.

  • Border는 바깥으로 그려질까 안쪽으로 그려질까? 오해와 삽질에 대해 정리해본다. Answer innerborder를 그리기 위해서는 현재 표현되는 frame을 border width만큼 줄여버리면 된다.

  • 이전에 앱의 실행 과정에 대해서 공부했을 때 제대로 이해하지 못했었다. 이번 기회에 제대로 이해하는 자리를 가져보려 한다. 조금 성장했는지 약간 더 이해가 되었다! 그럼 시작하자.

  • iOS 앱개발에서 화면을 담당한다면 피할 수 없는 autolayout! 공식 문서를 읽어보며 정리해보자.

  • 이전 글에서 PresentationController가 무엇인지 배웠다. 그런데, Transition Animator를 제공하는 부분에서 UIViewControllerAnimatedTransitioning이라는 친구를 보았다. 오늘의 주제는 이녀석이다.

  • WWDC 2019 키노트를 확인해보며 알짜 정보를 쏙쏙 뽑아보자. Dark Mode iOS 13부터 지원되는 기능이다. 말 그대로 dark mode이다. 해당 기능을 만들면서 고민했던 것은 역시 Mode에 따라 변화하는 색상이었다.

  • 맨날 헷갈리는 이것. 오늘은 뽑아버리겠다. Frame Super view의 좌표계를 기준으로 했을 때 본인의 좌표계를 말한다. 우리가 위치를 표시하기 위해서는 기준 좌표계가 있어야 한다.

  • Hit Testing 그럼 터치가 어디서 발생했는지는 어떻게 알 수 있을까? 즉, 터치가 발생한 시점에, 어떻게 내가 누른 가장 상위 객체(상단은 view 계층에서 top을 말함)를 판단할 수 있을까? 여기서 이벤트에 반응한 가장 상위 객체를 first Responder라 한다.

  • 이미지 자체를 늘리고 싶은데. 특정 부분은 고정시키고 싶으면 어떻게 할까? Image Stretch a.k.a nine patch 이렇게 이미지의 특정 부분은 고정시키고 나머지만 늘릴 수 있도록 하게 만드는 것을 Image Stretch라 한다.

  • iOS Layout을 적용하는 것에는 여러가지 방법이 있다. autolayout만이 정답이라 생각했는데, 오산이었다. 이 부분은 주기적인 업데이트를 하도록 하겠다. Storyboard 장점으로는 UI 구성을 눈으로 확인할 수 있다는 점이다.

  • iOS 화면 업데이트는 어떻게 되는 걸까? draw, layoutIfNeeded, setNeedsLayout 등. 이해가 안가는 것들이 너무 많았다.

  • 불투명한 뷰는 어떻게 만드는거지? 그게 바로 이거였다. Materials iOS는 깊이감을 느낄 수 있도록 하는 반투명 효과를 제공한다. Blur Effect 혹은 Material으로 부르는 친구다.

  • 부분적으로 rounding 처리하는 방법을 알아보자.

  • 앞 글에서 간단하게 소개했지만 Responder Chain은 간단하게 알고 넘어갈 만한 것이 아니다.

  • CollectionView나 TableView에서 특정 요소로 스크롤 시키는 방법에 대해 알아본다.

  • 디자이너와 일을 하다보면, image의 색상 자체를 변경해주길 바라는 경우가 있다.

  • 업무 하면서 Shadow에 대해 알게된 내용을 정리한다.

  • 아무 생각없이 코딩하다가(…) 의존성 주입을 그냥 property 주입으로 하고 있었다. 당연히 Storyboard면 안되지 않았었나? 하는 무지성 코드질을 하다 지적받고 떠올랐다.

  • 테이블 뷰의 reorder 버튼을 변경해야 하는데, API가 없어 고생했던 경험을 공유한다.

  • Target / Action은 사용자 interaction을 처리하는 주요 방법으로 알려져있다. 문서를 읽으며 알아보자. Target/Action Target/Action은 대표적인 비동기 이벤트이다. Action이 왔을 때, 처리되는 방식이기 때문이다.

  • TableView 리팩토링 하다가 레거시를 다르게 바꿀 수 있을까하면서 알아보았다. 이걸 배우면 이런게 가능하다. 자동으로 이렇게 애니메이션을 처리해준다! iOS 13에서부터 적용가능하다.

  • UIImageView 내부에 GestureRecognizer를 넣고 이벤트를 받으려 했더니 동작하지 않았다. userInteractionEnabled UIImageView의 userInteractionEnabled의 값은 defaultValue가 false이다.

  • UILabel에 들어간 text를 모두 표현하고 싶다면 어떻게 해야할까? 쉬워보이지만 의외로 삽질을 하는 부분이다. 간단하게 알아보자.

  • ViewController는 계층을 이루면서 구성된다. 그 중 대표적으로 알려진 것이 NavigationController, TabBarController 이다.

  • 입문하지 얼마 되지 않은 나는 여전히 기본 Transition만 사용하고 있다. 나도 화려한 UX를 만들어보고 싶다! 그 전에, 그 시작이 되는 UIPresentationController부터 알아보자.

  • Shadow를 보다가 scale에 대해서 알게된 내용을 적어본다. 정리 retina display가 나오면서 화면의 기본단위를 논리적으로 정의된 것을 사용하게 되었다. Point가 그것이다.

  • UIScrollView의 ContentInset, ContentOffset, ContentSize에 대해서 알아본다.

  • stack view는 autolayout을 적용하지 않고도 layout을 잡을 수 있는 신기한 친구다. 한번 알아보자. 이 글을 읽기 위해서는 이전글을 읽고 오는 것이 이해가 쉽다.

  • UITabBarController 위 그림에서 가운데 있는 것이 TabbarController이다. TabBarController의 경우 다음과 같은 특징을 갖는다.

  • tableView를 다루다보면 셀의 크기를 정하는 일이 상당히 귀찮을 때가 있다. 어떻게 하면 동적인 cell을 만들 수 있는지 확인해보자. Working with Self-Sizing Table View Cells 애플에서는 일단 이 옵션을 사용하지 말라고 한다.

  • UITableView의 Separator와 관련해 해결했던 것들을 적어둔다. 높이 늘리기 찾아본 결과 방법이 없다. 셀 안에 UIView를 만들어서 처리하는 것이 방법. Separator 길이 조정 self.tableView.

  • UITableView의 바닥을 어느정도 띄워야할 필요가 있었다. 어떻게 했는지 기록해둔다. Solution UIScrollView의 contentInset 동작을 이해했다면 쉽게 알아먹을 수 있다.

  • 회전과 관련된 코드를 보다보니, compact, regular와 같은 용어들이 보였다. UITraitCollection은 무엇일까? Size Classes 먼저, Apple이 다양한 디바이스들의 스크린 모양을 어떻게 논리적으로 관리하는 지 부터 알아야 한다.

  • 디자인 가이드를 읽다보면, Asset이 없는 경우가 있다. 이럴 경우 그냥 View를 만들고 Image화 해서 사용하면 좋겠는데.

  • View 화면을 구성하는데 기본이 되는 class NSObject를 상속한 UIResponder를 상속해서 구성됨 CustomView는 UIView를 상속함 UIImageView, UILable, UIScrollView… 가능한 것들 Drawing Animation Layout subview 관리 Event Handling UIResponder 상속하기 때문에, touch와 같은 event에 반응 가능 gesture 추가 초기화 형태 // code init(frame:) init() // default parameter = CGRe...

  • ViewController는 iOS 앱 개발에서 빼놓을 수 없는 요소이다. 구조적으로 어떻게 구성되었는지 알아보고, 어떤 life cycle을 가지는지 이해해보자. 그럼 시작하자.

  • code를 보다가 unwind segue라는 녀석을 보게 되었다. 처음 보는 친구라 정리해보려고 한다. Unwind Segue 일단 Unwind라는 뜻을 알아보자. 음. 무언가를 푼다는 개념같다.

  • UIViewController가 init 되는 시점에 특정 View를 설정하면 안되는가? 왜 안되는가? 핵심 요약 UIViewController의 init에 View를 설정하게 되면, 메모리 부족으로 인해 View가 해제되는 상황에 대응할 수 없다.

  • Accessibility 자체만 해도 상당히 방대한 개념이다. 이번에는 iOS 개발자가 실제로 많이 사용하는 Accessibility인 Voice Over를 UIKit에 적용하는 방법에 대해 알아보자.

  • Bundle 실행 가능한 코드(executble code) + 리소스 (Resources)를 가진 계층 어떻게 보면 이 개념은 개발자를 위한 개념이다. 결국 Package내부는 Bundle과 같이 구성되어 있다.

  • Module Stability는 무엇일까? 공식문서를 통해 알아보자. Module Swift에서 Module은 무엇을 말할까? Swift는 접근 제어의 기준으로 Module을 사용한다. 코드 배포의 단위로써 import 키워드를 통해 사용하는 것들이 모두 모듈이다.

  • Test라는 과정은 사실 공학 어디에서든 등장하는 개념이다. 작업에 의존도가 있고, 복잡한 과정으로 넘어갈 수록 이전 단계의 오류는 치명적이기 때문이다. 이를 관리하는 방법이 Test라 할 수 있다. 소프트웨어에서 역시 이러한 개념이 적용된다.