전체 글
이분 탐색 ( Parametric Search, lower, upper Bound / Swift ) - 2
파라메트릭서치(Parametric Search) 조건에서 최소, 최대를 찾는 문제에서 결정 문제로 변경하여 탐색하는 알고리즘을 말합니다. 이전까지는 정렬되어 있는 배열에서 해당 값이 있는지 파악했지만, 파라메트릭서치에서는 조건이 가질 수 있는 최소, 최대 값을 결정하고 (start, end) 해당 하는 값이 조건에 만족하는지 파악하여, 구간별로 탐색하는 것을 의미합니다. 예시 문제 김OO 은 게임 승률이 50% 가 넘으려면 몇 판을 해야하는지 궁금합니다. 무조건 게임은 승리한다고 가정했을 때, 최소한으로 몇판을 이겨야 하는지 승수를 구하시오. ( 단 비기는 경우는 없다고 가정하고, 답은 Int 범위를 넘지 않는다. ) 총 게임 횟수: 50, 승리 : 1, 패배 : 49 위 경우에 일반적으로 게임 횟수 1..
이분 탐색 ( Binary Search / Swift ) - 1
이분 탐색은 정렬된 데이터에서 값을 빠르게 찾는 방법 중 하나입니다. 일반적인 방법으로 위와 같은 Int 배열에서 "9" 를 찾는다고 가정하면, O(n) 시간 복잡도를 가집니다. 이분 탐색은 첫 인덱스가 아닌 중간부터 값을 비교하여 탐색할 구간을 정합니다. start, mid, end 가 기준점이 되어 구간을 선택하고, 필요 없는 구간은 탐색하지 않기 때문에, O(logN) 의 시간 복잡도를 가집니다. 주의점으로는 "정렬되어 있는 데이터" 에서만 사용이 가능하다는 점입니다. 비정렬된 상태에서 사용될 때 정렬 알고리즘 + 이분 탐색 방법이 더 효율적일지, 혹은 선형 탐색 알고리즘이 더 나을지는 개발자의 판단이 필요합니다. 다음으로는 이분 탐색의 활용으로 파라메트릭서치(Parametric Search) 와 ..

Swift 첫 오픈 소스 기여 후기 ( Open Source PR )
오픈소스라 하면 거대한 프로젝트이고, 뛰어난 개발자분들이 기여하기 때문에, 입문 개발자가 쉽게 접근하기 어렵다고 생각했습니다. 하지만 베타 Xcode 에서 컴파일 에러를 해결하여, 입문 개발자가 오픈소스에 PR 했던 경험을 공유합니다 :) YPImagePicker 는 iOS 이미지 피커 중 인기있는 라이브러리 중 하나입니다. 이미지 크롭, 필터 기능을 지원하고 깔끔한 UI 때문에 저 또한 토이프로젝트를 진행하면서 사용했습니다. 그 후 iOS 14 때 업데이트된 위젯 기능을 테스트하고자 Xcode 12 베타 버전으로 컴파일 해보았는데요. CocoaPods 으로 추가했던 외부 라이브러리에서 수많은 컴파일 에러들을 발견하게 되었습니다. 그 중에서 눈에 들어온 라이브러리는 "PryntTrimmerView" 였습..

iOS StoryBoard vs Code Base 간단 정리
storyboard 장점 결과물을 예측하기 쉬움 속성을 쉽게 확인가능 소스코드를 일일히 파악하지 않아도 UI 확인 가능 단점 무겁다 ( 스토리 보드 분리로 해결 가능 ) 링크가 끊어졌을 때 파악하기 힘들다 ( IBOutlet, IBAction ) 협업 문제 ( Diff 로 알기 힘들고, Conflict 나면 해결 어려움 ) Code Base 장점 가볍다 ( 코드만 나와 있으므로 ) Diff 만 보고 파악하기 쉽다 Conflict 발생 가능성이 낮아진다 단점 해당 컴포넌트를 숙지하고 있어야 한다. 어떤 화면이 만들어질지 파악하기 힘들다. 코드가 상당히 길어진다 code base 기반 작성법 Auto Layout 사용 / Auotoresizing 은 더 이상 사용 X NSLayoutConstraint 를 일..

윈도우 10 에서 Swift 5 사용하기 ( Visual Code, WSL )
Swift 는 공식적으로 Mac OS, Linux 계열 OS를 지원하고 있습니다. Swift For Windows 라는 오픈소스 프로젝트가 있지만, Swift 4.1.2 버전까지만 지원되고 유지 보수가 중단되어 사용에 어려움이 있습니다. 이번 게시글에서는 윈도우 10의 WSL (리눅스 서브 시스템) 기능을 활용하여, Swift 개발 환경을 구축하는 방법을 다루겠습니다. 1. WSL 설치하기 * 윈도우 10 / 64 비트 환경에서만 설치가 가능합니다. 윈도우 키를 누르고 "Windows 기능 켜기/끄기" 를 검색하여 제어판에 들어갑니다. "Linux용 Windows 하위 시스템" 옵션을 체크하고 확인을 누릅니다. 윈도우가 재부팅 되고, 설치가 진행됩니다. 재부팅이 완료되면, Microsoft Store 에..

iOS "UITableView Section Header 로드되지 않는 문제" 해결
위 영상처럼 처음 로드했을 때에는 섹션 헤더가 제대로 보이지만, ( xib 를 사용한 Custom Section Header ) 나중에 해당 섹션만 reload 했을 때 Section Header 가 보이지 않는 문제가 발생했습니다. Stack Overflow 에 나와있는 일반적인 해결 방법은 아래와 같습니다. 1. UITableViewDelegate 프로토콜에서 heightForHeaderInSection 리턴하기. 2. reloadRows 대신 reloadSection 으로 해당 섹션 리로드 하기 제 경우에는 위 두가지 방식으로도 해결되지 않아서 구글링을 하며 더 찾아보았습니다. // UITableView Delegate func tableView(_ tableView: UITableView, vie..

Xcode "Plain Style unsupported in a Navigation Item" 해결하기 ( StoryBoard )
구글링하다가 XIB 형식의 해결 방법만 나와있어서 글을 작성합니다. 문제 해결에는 2가지 방법이 있습니다. 1. XML 파일 수정하기 기본적으로 StoryBoard 와 Xib 는 XML 파일에 기반하고 있습니다. 이는 JSON 같은 포맷과 무척 유사합니다. 먼저 문제가 발생하는 스토리보드에 option 키를 눌러서 > Open As > Source Code 를 클릭합니다. 그러면 XML 포맷의 코드들이 나오게 됩니다. 그 후 Command + F 를 통해서 해당하는 엘리먼트를 찾아줍니다. "barButtonItem" 문제가 되는 속성인 style="plain" 을 삭제해주거나, 혹은 다른 스타일로 변경하면 됩니다. // style="plain" 삭제 그 후 저장하면 해당 경고가 더 이상 발생하지 않습니다..

iOS MVC 패턴 ( MVC Pattern )
디자인 패턴이란 소프트웨어 개발 방법을 공식화한 것입니다. 지금은 매우 다양한 디자인 패턴이 사용되고 있지만 ( MVVM, MVP, VIPER ) 그 중에서 가장 고전적이고 중요한 MVC 패턴에 대해서 다루겠습니다. MVC 패턴 Model : 근본적인 앱이 어떻게 구성되어야 하는가? 에 중점을 가집니다. 알고리즘 ( 계산기 더하기, 빼기 연산 등 ) Controller : 모델에서 데이터를 가져오고, 뷰에 전달하는 역할을 합니다. MVVM 구조에서는 Model 에서 가져오는 역할을 ModelView 가 대신 수행합니다. View : 화면을 보여주는 역할을 합니다. 기본적으로 데이터를 가지고 있지 않습니다. Controller & View 소통 → Action-target 이라는 방식으로 가능합니다. @I..

크롬 확장앱(Chrome extension) 리액트 적용하기
크롬 확장앱은 순수 자바스크립트(Vanilla JS)로 개발할 수 있지만, 구조가 복잡한 앱의 경우 프론트엔드 라이브러리를 사용하는 것이 좋은 방안이 될 수 있습니다. 그래서 크롬 확장앱을 개발할 때 리액트 환경을 구축하는 방법을 알아보도록 하겠습니다. 아래와 같은 코드들을 입력해줍니다. yarn create react-app "project-name" // 리액트 프로젝트 생성하기 cd "project-name" // 해당 디랙토리로 이동하기 yarn start // 프로젝트 시작 yarn start 명령어를 입력하면 자동으로 테스트용 웹 서버가 시작되고, 브라우저에서 해당 화면이 출력됩니다. 위 화면을 크롬 확장앱에서 보여줄 수 있도록 작업하겠습니다. yarn build // 배포할 수 있도록 빌드하..
자바 빌더 패턴 ( Builder Pattern )
롬복을 사용하면서 @Builder 어노테이션을 접하게 되었습니다. 빌더 패턴이 정확히 어떤 역할을 하는지 정리하고자 합니다. public class Student { // 필수 인자 private String name; private int age; // 선택 인자 private String grade; // 생성자 public Student(String name, int age, String grade) { this.name = name; this.age = age; this.grade = grade } } 먼저 일반적으로 볼 수 있는 생성자 패턴 방식입니다. Student 클래스에 필수 인자는 "name" "age" 이고 선택적 인자는 "grade"로 가정하겠습니다. 위 클래스를 인스턴스로 생성하려면..