no image
[iOS공통] Combine의 퍼블리셔, 구독자 관계를 깊게 들여다보자
안녕하세요! 최근 운이 좋게도 기술면접을 할 기회가 생겼었는데요, 받은 질문중 인상적이였던 질문이 있어 정리해보려고 합니다.우선 면접관분의 질문은 아래와 같습니다. Combine을 사용하셨는데, CancellableBag은 왜사용하는 걸까요? 답변: 음,, 컴바인의 경우 옵저버 패턴을 사용하여 퍼블리셔와 구독자가 서로의 구체적인 타입이 무엇인지 관계없이 느슨한 결합을 유지합니다. 이런 느슨한 결합을 유지하기위해 중간에 Subscription이라는 매개자가 존재하고 둘을 참조하고 있는 것으로 알고있습니다.. 대충알고 있었던 개념에 대해 허쩜을 찔린 것 같은 기분이였습니다. 따라서 이번 글에서는 Subscription이란 무엇이고 Combine은 왜 해당 객체를 사용하는지에 대해 애플의 공식 문서를 기반으..
2025.06.26
no image
[iOS공통] 랜더루프로 알아보는 터치부터 랜더링까지의 여정
안녕하세요! 오랜만에 글로 돌아왔습니다. iOS개발(취준)기간이 길어질 수록 점점 딥한내용이 궁금해지고, 사용하는 경우가 늘어나는 것 같아요.오늘은 최근 관심있게 보았던 WWDC내용인 랜더 루프에 대해서 다뤄보겠습니다. 개요iOS앱을 개발할 때 UIView의 draw(rect:)함수를 보신적이 있으실 겁니다.저 개인적인 경험으로는 해당 함수를 사용하면 View의 영역을 직접 그릴 수 있다 정도로 이해하고 그쳤던 것 같습니다.뷰를 그린다는 것은 어떤 것을 말하는 걸까요? 아마 아래 사진을 보신적이 있을 것입니다.UIKit을 처음 공부할 때는 "아 그렇구나, 이런식으로 생명주기가 돌구나"정도로 해석했지만, 자세히 살펴보면 해당 단계에는 명확한 이유가 있습니다.시각적인 요소를 만드는 것을 도화지에 그림을 그리..
2025.06.13
[프로그래밍 사고] 이진 탐색의 원리(with 백준 공유기 설치 2110)
이번 포스팅은 이진탐색 문제를 풀이하기 위한 기준을 설정하고 그 원리를 이해하는 시간을 가져보기위해서 작성되었습니다. 이진 탐색의 조건 판단하기프로그래밍 문제는 입력, 연산, 결과로 분류할 수 있습니다.프로그램은 입력에 제약을 기반으로 적절한 연산을 적용하여 결과를 만들어 냅니다. 이진 탐색을 사용할 수 있는 문제의 경우 이 제약과 결과의 관계성을 파악할 필요가 있습니다.정확하게는 두가지가 오름차순 혹은 내림차순 관계를 가져야합니다.공유기 설치 문제를 통해 설명해보겠습니다. 공유기 설치 문제는 수직선에 나열된 집들에 특정 개수의 공유기를 설치하는 문제입니다.입력: 집들의 위치, 설치해야하는 공유기의 수출력: 설치한 공유기간의 거리들중 최솟값이 최대가 되는 거리 값제약: 설치해야하는 공유기의 수 우리는, ..
2025.06.01
no image
[프로그래밍 사고] DP문제로 알아보는 캐시의 지역성(with 프로그래머스 도둑질)
안녕하세요최근 직무 인터뷰를 위한 CS지식과 코딩테스트 공부를 병행하고 있습니다.메모리 캐시에 대한 개념을 잘 활용할 수 있는 문제를 발견하여 포스팅을 남기게 되었습니다. 프로그래머스 문제 도둑질 소개https://school.programmers.co.kr/learn/courses/30/lessons/42897해당 문제를 간략하게 요약해보겠습니다.도둑은 원형으로 배치된 집들에 침임하여 물건을 훔칠 수 있습니다.하지만 한가지 제한이 있습니다.인접한 집은 서로 보안 시스템이 연동되어 있어 옆집이 털리면 보안장치가 울립니다.보안장치가 울린 집은 털 수 없습니다. 이 경우 도둑이 집을 털 때 최대한 많은 이득을 남기는 방법을 구해야합니다. 우선 주목했던 이 문제가 조금 특이한 점은 집들이 원형을 배치되어 있다..
2025.05.28
[iOS 공통] Objective-C와 Swift의 매서드 호출의 차이(with method swizzling)
안녕하세요! UIKit을 사용하다 보면 UIButton을 사용하신 경우가 있으실 것입니다.보통 아래와 같은 코드를 작성하게 되는대요, @objc, #selector 등등 Swift만 학습했다면 다소 생소한 개념들입니다.override func viewDidLoad() { super.viewDidLoad() let button = UIButton() button.addTarget(self, action: #selector(onTap(_:)), for: .touchUpInside)}@objc func onTap(_ sender: UIButton) { ...} 그저, "UIKit이 Objective-C로 만들어졌기 때문에 Swift로 병합하는 과정에서 발생한 어쩔 수 없는 부분이구나" 정..
2025.05.22
no image
[디자인 패턴] 행동, Visitor pattern(방문자 패턴) with Swift
객체 구조(트리, 컬렉션 등)를 이루는 원소에 적용할 연산을 표현합니다.연산을 보유하는 클래스를 방문자라고 하며, 객체 구조의 요소를 방문하여 연산을 실행합니다.방문자는 추상화되어 있어 유연하게 변경가능합니다. 1️⃣ 동기여러가지 요소들로 이루어진 특정 객체 구조에 적용할 연산을 추상화하고 싶을 때가 있습니다.이 때 새로운 연산을 별도로 추가할 수 있지만, 추가된 연산에 상관없이 기존 코드들이 변형되지 않으면 좋을 것입니다.객체 적용할 연산들을 하나로 묶어서 관리하는 객체를 해당 패턴에서 방문자라고 칭합니다.새로운 연산을 원하는 경우 방문자 타입을 서브 클래싱하여 객체 구조에 주입하는 구조로 동작함으로써 기존 코드에 변형을 주지않고 유연하게 연산을 변경할 수 있습니다. 2️⃣ 활용성각각의 특징이 있지만 ..
2025.05.01
[디자인 패턴] 행동, Template method pattern(템플릿 메서드 패턴) with Swift
특정 연산의 절차는 유지하지만 구체적인 행동은 서브 클래스에 위임하는 패턴입니다. 1️⃣ 활용성변하지 않는 부분을 한 번 정의해 놓고 다양해질 수 있는 부분은 서브 클래스에서 정의할 수 있도록 남겨두고자 할 때 활용할 수 있는 패턴입니다. 2️⃣ 패턴 참여자AbstractClass: 변하지 않는 절차를 구현합니다. 그리고 서브 클래스가 재정의해야할 연산에 대해 기본 구현을 제공합니다.ConcreteClass: 구체적인 연산방식을 결정하고 필요한 함수를 재정의 합니다. 3️⃣ Swift구현구현시 유의할 점재정의할 수 있는 연산에 대해 특별한 네이밍을 부여할 수 있습니다.'do-' 같은 프리픽스를 제공하면 가독성이 향상됩니다.먼저 추상 클래스를 구현합니다.start함수의 경우 고정된 절차를 실행하는 매서드로..
2025.04.30
[디자인 패턴] 행동, Strategy pattern(전략 패턴) with Swift
특정 기능에 사용될 알고리즘을 캡슐화하여 동적으로 선택할 수 있도록 하는 패턴입니다.동작을 전략이라는 개념으로 추상화함으로써 새로운 전략을 추가하는 경우에 기존의 시스템을 수정하지 않고 단순히 사용할 전략을 교체하면됩니다. 1️⃣ 동기특정 동작에도 상황에 따라 최적으로 동작하는 여러가지 알고리즘이 있을 수 있습니다.해당 경우 상황에 따라 사용할 알고리즘을 하드 코딩하는 것은 좋지 못합니다.동작과 알고리즘이 결합되어 유지보수가 힘들고, 기존의 알고리즘을 교체하는 작업역시 까다롭기 때문입니다.전략 패턴을 활용하면 해당 문제를 해결할 수 있습니다. 2️⃣ 활용성행동이 조금씩 다를뿐 개념적으로 관련된 많은 클래스를 유동적으로 사용하고 싶을 때알고리즘의 변형이 필요할 때클라이언트에게 노출하지 말아야하는 알고리즘이..
2025.04.30
no image
[디자인 패턴] 행동, State pattern(상태 패턴) with Swift
객체가 메세지를 수신했을 때 현재 객체의 상태에 따라 행동을 동적으로 변경하고 싶은 경우 해당 패턴을 활용할 수 있다.해당 패턴은 객체의 상태를 추상화하여 분기문을 사용하지 않고도 행동을 결정할 수 있도록 하는 것이 핵심이다. 1️⃣ 동기동일한 요청을 받아도 현재 상태에 따라 각기다른 반응을 보일 필요가 있을 때 활용할 수 있습니다.상태를 enum객체로 만들어 내부적으로 분기문을 작성하는 경우를 대안으로 생각할 수 있습니다.이 경우 해당 객체가 처리할 수 있는 액션이 생길 때마다 분기문을 생성해야하며, 새로운 상태가 추가된다면 기존의 연산을 모두 수정해야하는 결과를 야기할 수 있습니다. 2️⃣ 활용성객체상태를 데이터로 표현하여 다중 분기 조건 처리가 너무 많아지는 경우 3️⃣ 패턴 참여자Context: ..
2025.04.28