본문 바로가기

전체 글51

[디자인 패턴] Strategy pattern 전략 패턴이란? In computer programming, the strategy pattern (also known as the policy pattern) is a behavioral software design pattern that enables selecting an algorithm at runtime. Instead of implementing a single algorithm directly, code receives run-time instructions as to which in a family of algorithms to use. 위키피디아에서 전략 패턴 검색하면 전략 패턴은 행동 패턴의 하나로 런타임 과정에서 알고리즘 군에서 알고리즘 하나를 선택하여 사용할 수 있게 해준다고 한다.. 2022. 10. 10.
Key-Value-Observing (KVO) Key-Value-Observing Key-Value-Observing (KVO)는 코코아 프로그래밍 패턴 중 한 개로 프로퍼티의 변화를 다른 객체에 알릴 때 사용할 수 있다. 애플리케이션의 뷰(View) 또는 모델(Model)의 프로퍼티 변화를 컨트롤러(Controller)에 알릴 때 유용하다. KVO는 프로퍼티가 변경될 때마다 알림을 보내기 위한 체계를 구현할 필요가 없다. 프로퍼티의 변경 사항이 생기면 관찰 객체에 직접 알림을 전달하기 때문에 NSNotificationCenter와 다르게 관찰자에게 변경 사항을 알리는 중앙 개체가 필요 없다는 것이 장점이다. NSObject를 상속할 때 KVO를 위한 기본적인 메서드가 NSObject에 이미 구현되어 있기 때문에 이러한 메서드를 오버라이드 할 필요도.. 2022. 10. 5.
Key-Value-Coding (KVC) Key-Value-Coding 많은 프로그래밍 언어에서 캡슐화된 객체의 프로퍼티 값을 얻거나 수정하기 위해서는 객체에 정의한 getter, setter 메서드를 통해 접근할 것이다. 아마 스위프트도 getter, setter 메서드 혹은 연산 프로퍼티 등 비슷한 방식으로 접근할 것이다. 이러한 객체의 프로퍼티에 직접적으로 접근과는 다르게 Objective-C와 스위프트는 Key-Value-Coding(KVC)를 통해 객체의 프로퍼티에 간접적으로 접근할 수 있다. Objective-C에서 KVC 방식을 사용하기 위해서는 객체가 NSKeyValueCoding 프로포콜을 채택해야 한다. 다행히도 프로토콜 메서드의 기본적인 구현이 되어 있기 때문에 따로 구현해야 하는 것은 없다. Identifying an Ob.. 2022. 10. 4.
클래스의 성능을 높이는 방법 정적 디스패치(Static Dispatch)와 동적 디스패치(Dynamic Dispatch) 스위프트는 C++, 자바 등 많은 언어들처럼 클래스 상속을 지원하고, 슈퍼 클래스를 상속한 서브 클래스에서 프로퍼티와 메서드 오버라이딩을 할 수 있다. 따라서 프로그램은 런타임 단계에서 동일한 이름의 메서드들 중 어떤 메서드를 실행시켜야 할지 결정해야 한다. 이 과정을 동적 디스패치(Dynamic Dispatch)라고 한다. 스위프트의 동적 디스패치는 기본적으로 vtable를 참조하는 간접 호출(Indirect Call)이다. 따라서 컴파일 단계에서 호출될 함수를 결정하여 직접 호출(Direct Call)하는 정적 디스패치(Static Dispatch) 보다 느리다. class A { var aProperty: .. 2022. 9. 28.
String은 왜 subscript로 접근이 안될까 스위프트는 인덱스로 문자열(String)의 요소에 접근하려고 하면 'subscript(_:)' is unavailable: cannot subscript String with an Int, use a String.Index instead. 에러 메시지를 보여준다. 스위프트의 문자열은 왜 인덱스로 요소에 접근하지 못할까? let array: [Int] = [0, 1, 2, 3, 4, 5] print(array[3]) let string: String = "Hello world" // error print(string[3]) 스위프트의 문자열은 서브스크립트(subscript)를 지원하지 않기 때문에 인덱스를 이용해 요소에 접근할 수 없다. 서브스크립트를 지원하지 않은 이유를 알기 위해선 스위프트가 어떻게 문.. 2022. 9. 19.
[프로그래머스] 매출 하락 최소화 풀이 위 그림처럼 트리 구조의 형태로 이루어진 조직도가 있다. 조직도에서 임의의 노드 \(i\)와 노드 \(i\)의 자식들로 이루어진 서브 트리를 팀이라고 하자. 위의 그림에서 A, B, C, D가 팀이다. 임의의 노드 \(i\)를 팀장, 노드 \(i\)의 자식들을 팀원이라 했을 때 모든 팀에서 최소 한 명 이상 워크숍에 참석하면서, 참석하는 직원들의 하루 평균 매출액의 합을 최소로 하는 것이다. 어떤 부모 노드가 워크숍에 참석할 때 자식 노드들이 워크숍에 참석하지 않는 것이 매출액을 최소로 만들 수 있을까? 답은 아니다. 부모 노드의 평균 매출액보다 자식 노드의 평균 매출액 클 경우 반례가 만들어진다. 아래 그림이 그 반례이다. 부모 노드의 참석 여부와 상관없이 자식 노드가 워크숍에 참석했을 경우와 참.. 2022. 9. 18.
Infinite Carousel(무한 캐러셀) 다섯 개의 사진이 순서대로 돌아가는 캐러셀을 만들어보자. 컬렉션 뷰 사용하기 컬렉션 뷰의 페이징 기능을 사용해 캐러셀을 만들 수 있다. 수평 스크롤인 컬렉션 뷰를 추가하고 레이아웃을 잡은 후 컬렉션 뷰의 Paging Enabled 속성을 True로 바꾼다. 그리고 셀에 이미지 뷰를 넣으면 된다. 자연스러운 페이징을 위해 컬렉션 뷰의 Min Spacing을 0으로 한다. Min Spacing을 0으로 하지 않으면 이미지가 넘쳐서 보인다. 이제 셀 사이즈를 조절하여 한 개의 이미지씩 보이게 바꾸자. UICollectionViewDelegateFlowLayout 프로토콜을 사용해서 셀 아이템의 크기를 정하자. extension RxViewController: UICollectionViewDelegateFlow.. 2022. 9. 15.
AnyObject AnyObject AnyObject는 모든 클래스가 암묵적으로 준수할 수 있는 프로토콜이다. AnyObject는 타입이 정해지지 않은 객체에 사용할 수 있다. 모든 클래스, 클래스 타입 또는 클래스 전용 프로토콜의 인스턴스는 AnyObject를 타입으로 사용할 수 있다. let label: UILabel = UILabel() let button: UIButton = UIButton() let imageView: UIImageView = UIImageView() let a: AnyObject = label let b: AnyObject = a.self let c = button.self let array: [AnyObject] = [ label, button, imageView.self ] protocol.. 2022. 9. 14.