본문 바로가기

iOS/iOS 기술 면접

(8)
KVO(Key-Value Observing) KVO(Key-Value Observing) KVO는 객체의 프로퍼티 변화를 다른 객체에 알리는 Cocoa Programming Pattern 논리적으로 분리된 models과 views 사이의 변경사항을 전달하는데 유용 NSObject에서 상속받은 클래스만 사용 가능 바로 코드를 보면서 한번 살펴 보겠습니다~! class Person { var name: String init(name: String) { self.name = name } } 다음과 같은 클래스에서 KVO를 이용해 상태 변화를 감지하고 싶다고 가정해보겠습니다. KVO를 사용하기 위해서는 우선 다음과 같은 코드를 추가해줘야 합니다. NSObject 상속 변화할 프로퍼티에 @objc dynamic 추가 class Person: NSObject..
Struct는 뭐고 어떻게 사용할까? 구조체와 클래스 (Structures and Classes) 구조체와 클래스 (Structures and Classes) - Swift 실제로 값 타입에 대해 이전 챕터에서 광범위하게 다뤘습니다. 실제로 Swift에서 정수, 부동 소수점, 부울, 문자열, 배열 그리고 딕셔너리와 같은 기본 타입의 모두는 값 타입이고 구조체로 구현 bbiguduk.gitbook.io 오늘은 구조체에 대해서 알아보겠습니다! 저번에는 구조체, 클래스, 열거형을 비교하면서 간단하게 알아봤었는데 구조체에 대해 좀 집중적으로 볼게요! Struct 상수나 변수 메서드 등을 내부적으로 정의해 사용자 정의 타입을 만들 때 사용되는 타입 인스턴스로 생성해서 직접 사용할 수 있음 공식문서에서 제공하는 구조체의 기능은 다음과 같습니다. (클래..
Optional Optional 옵셔널(Optional)은 언어적인 차원에서 안전성을 높이기 위해 사용하는 개념임 간단하게 말하면 nil 타입을 사용할 수 있는 타입들을 Optional Type이라고 부름! nil 값이 없음을 의미하는 값 이거는 정수형의 0이나 문자열의 “”(빈문자열) 과는 다르게 진짜 값이 없음을 의미함 위 딕셔너리 처럼 값이 없을 때 오류를 처리하는 것이 아니라 nil을 내보냄으로써 안전성을 높힘 이러한 nil 값을 반환하기 위해서는 해당 타입이 옵셔널 타입이어야 함! 그럼 어떻게 옵셔널 타입을 선언할 수 있을깎??? 타입 앞에 ? 를 붙혀주면 끝임 var result: Int? = nil 위와 같이 하면 nil 값을 가질 수 있는 Optional Int가 되는거임 따라서 nil 또는 nil이 아닌..
AnyObject AnyObject | Apple Developer Documentation AnyObject | Apple Developer Documentation The protocol to which all classes implicitly conform. developer.apple.com AnyObject는 특정하지 않은 타입에 대해 동작하도록 만들어진 타입임 이와 유사한 타입으로 Any도 있습니다! 그리고 타입 캐스팅과도 살짝 연관이 있는데 타입 캐스팅을 하려면 상속관계에 있어야 하잖아요?? 근데 Any나 AnyObject 타입일 경우는 상속 관계가 아니더라도 ㄱ가능해집니다! AnyObject 모든 클래스가 암시적으로 준수하는 프로토콜 클래스, 클래스 타입, 클래스-only 프로토콜에서 타입으로 사용할 수 있..
Convenience init 이번에는 Convenience init에 대해 알아보겠습니다! 생성자에 대한 모든 걸 다룰려면 글이 엄청 길어지니깐 간단하게 설명해보겠습니다. 생성자(initializer)가 먼데요 Struct, Class, Enum의 인스턴스(객체)를 생성하는 것 모든 프로퍼티가 포함되어야 하고, 기본값이 초기화되지 않으면 인스턴스는 생성되지 않음! → 인스턴스를 만들려면 모든 프로퍼티가 값을 가져야 한다는 말임!!!!!!!!!!1 그럼 초기화 어케 하는데요? 구조체, 클래스를 초기화하는 방법은 다음과 같습니다. 프로퍼티를 만들자마자 기본 값을 넣어주기 옵셔널로 선언하기 → 값이 없으면 nil로 초기화되므로 init() 함수(생성자) 를 이용해서 값 설정 근데 여기서 살짝 의문이 생길수도 있음 struct 할 때는 초..
Copy On Write는 어떤 방식으로 동작할까? Copy On Write(COW)는 뭐지? Swift를 기준으로 작성하고 있지만 여기서만 쓰이는 건 아니고 프로그래밍 언어 대부분에서 사용하는 성능 최적화 매커니즘임 Struct 설명에서도 나왔지만 Struct의 경우 값 복사를 하자나요? 이때 값 복사를 하는 방법이 COW임 그래서 Copy-on-Write가 모라는거임? 값 복사를 수행할 때 최적화를 위해서 사용한다는 말임! 근데 여기서 복사 동작을 수행할 때 무조건 일단 복사를 하는게 아닌거임! (복사를 하지만 복사를 안함) 원본을 복사해서 복사본이 생겼다고 가정해 보겠음 그러면 복사본은 원본의 값을 복사해서 가지고 있어야 하잖아요? 맞죠? 만약에 이때 수정된 값이 없다면?? 그래서 복사본과 원본이 동일한 값을 가지고 있다면 복사하지 않음!!!! 복사..
Class의 성능을 향상 시킬 수 있는 방법 Class의 속도가 Struct에 비해 느린 이유가 뭘까? Class는 Dynamic Dispatch 방식을 채택해서 함수 결정을 런타임에서 하기 때문임!!!!!!!!1 저게 뭔지 나도 잘 모르니까 이제부터 정리해 보겠음 Dispatch 어떤 메소드를 호출할지 결정하는 매커니즘 이게 먼말이냐면 어떤 메서드를 언제 호출할지 경정하는 방법이라는 거임 이런 Dispatch는 두 가지 방법이 존재함 Static Dispatch(정적 디스패치) 함수를 컴파일 타임에 결정 얘는 컴파일을 할때 벌써 함수를 결정해버림! 그래서 런타임 시 그냥 실행해버리면 되므로 성능이 상대적으로 좋을 수 밖에 없음 Dynamic Dispatch(동적 디스패치) 함수를 런타임에 결정 스위프트에서 Class들은 각자 함수 포인터들의 배열..
Struct와 Class와 Enum의 차이 swift에서 제공하는 주요 타입인 struct, class와 enum의 차이점과 공통점에 대해서 비교해보도록 하겠습니다. Struct struct는 기본적으로 값 타입(value type)으로 데이터 전달 시 값을 복사하여 전달합니다. 복사한 값을 이용해 새로운 인스턴스를 생성하고 이는 메모리의 Stack 영역에 저장합니다. 데이터를 복사하여 전달하기 때문에 데이터의 상태 변화를 방지할 수 있고, 코드 예측에도 유리합니다. 같은 이유로 스레드 간 동시성 문제에서도 안전하고, 메모리 관리 측면에서도 유리합니다. -> 스레드 간 동시성 문제에 대해서도 알아봐야할듯 ㅠㅠ 메모리 관리 측면에서 유리한 이유는 다음과 같습니다. 복사한 값은 Stack 영역에 저장을 하게 되는데 Stack은 LIFO 방식으로 구조..