객체지향 프로그래밍 패러다임에서 은닉화는 중요한 개념 중 하나이다. 이를 구현하기 위한 핵심 기능인 접근제어에 대해 알아보자. 들어가기 전 은닉화하니까 생각이 났는데 캡슐화랑 무엇이 다를까? 모듈과 소스파일은 무엇일까? ✅ 은닉화? 캡슐화? 은닉화(hiding) : 내부 데이터와 연산을 외부에서 접근하지 못하도록 은닉(hiding) 혹은 격리(isolation)시키는 것이다. 객체 외부에서 객체내의 데이터 접근을 제한하고 데이터를 수정, 조작하는 동작은 내부에 두고 접근(getter),설정(setter)하는 메소드로 데이터를 얻는다. 캡슐화(encapsulation) 캡슐 알약에 비유할 수 있다. 연관있는 약효를 가진 약끼리 모여있고 감싸서 외부에서 무엇이 있는지 알 수 없다. 즉, 연관 있는 변수와 함..
OptimizationTips 문서에서 Value Type(값 타입)은 COW(Copy-on-Write) 최적화를 사용한다고 합니다. COW 에 대해서 알아보기 전에 타입에 따라서 어떠한 식으로 복사하는지 알아봅시다. ✅ Swift 에서 값 타입과 참조 타입의 복사 방식은 다릅니다. 값 타입 : 깊은 복사(deep copy). 데이터 자체를 복사하는 방법. 독립적인 메모리를 차지하기 때문에 복사한 인스턴스의 데이터를 바꾸더라도 원본에 영향을 주지 않습니다. 참조 타입 : 얕은 복사(shallow copy). 최소한의 복사만 진행. 복사를 할 때 주소값을 공유한다. 원본과 복사본이 같은 주소값을 공유하므로 한 쪽의 데이터를 바꾸면 다른쪽에 영향을 줍니다. 값 타입은 수정하지 않아도 매번 데이터를 복사할 때..
좀 더 근본적인 질문을 던져보자. ✅ DispatchQueue 에서 strong reference cycle(강한 참조 순환) 은 발생할 수 있는가? 라는 질문에 대해서 결론적으로는 변수로 저장하지 않으면 강한 참조 순환이 발생하지 않는다. 즉, DispatchQueue 를 이니셜라이저를 통해 만들어서 변수에 저장하지 사용하지 않는 이상 강한 참조 순환은 발생하지 않는다. DispatchQueue 의 main 과 global 은 각각 타입 프로퍼티와 타입 메소드이기 때문에 호출하는 인스턴스가 레퍼런스 카운트를 올리지 않고, 강한 참조 순환에서 자유로울 수 있다. ✅ [weak self] 를 사용하지 않아도 될까? 그렇다면 [weak self] 와 같은 캡처리스트를 사용하지 않아도 될까? 그럼에도 불구하고..
Is it necessary to use [unowned self] in closures of UIView.animateWithDuration(...)? 이 글은 위의 stackoverflow 질문을 읽고 정리해본 글입니다. 작성자님의 질문을 아래와 같았다. 아래의 코드는 메모리 릭을 피할 수 있나요? UIView.animateWithDuration(1, animations: { [unowned self] in self.box.center = self.boxTopRightPosition }, completion: { [unowned self] completed in self.box.hidden = true }) 이 글에는 꽤나 많은 부분들이 연결되어 있기 때문에 샅샅히 살펴봐야 합니다. 🧐 우선 위의 a..
Swift 의 dynamic dispatch 는 method table 에서 함수를 찾은 다음 indirect call 을 수행하여 구현되기 때문에 direct call 보다 수행이 느립니다. 또는 indirect call 은 많은 컴파일러 최적화를 방지하여 호출 비용이 비쌉니다. 그렇다면 서브클래싱과 오버라이딩이 필요없는 경우는 static dispatch 로 동작하는 것이 좋지 않을까? 맞습니다, 성능이 중요한 코드에서 성능 향상에 필요하지 않을 때 이 dynamic dispatch 동작을 제한할 수 있는 방법이 필요합니다. 성능 향상을 위한 Static Dispatch 메서드 뿐만 아니라 프로퍼티 역시 오버라이딩의 가능성이 있기 때문에 dynamic dispatch 로 동작합니다. 그래서 상속 가능..
Message Dispatch Objective-C 는 클래스의 메소드가 프로퍼티를 호출할 때 해당 객체에 메시지를 보내는 방식으로 구현되어 있습니다. 그리고 이 과정이 런타임 시에 일어납니다. 이것이 message dispatch 입니다. 즉, message dispatch 는 dynamic dispatch 의 일종입니다. message dispatch 는 오버라이딩하거나 새로 정의한 메소드들만 테이블에 유지합니다.(swift 의 dynamic dispatch 는 모든 메소드에 대한 포인터를 해당 클래스가 가짐.) 대신, 부모 클래스로의 포인터를 가지고 있기 때문에 상속받은 메소드들을 찾아갈 수 있습니다. 대신 Swift 는 이런 기능을 자체적으로 제공하지 않기때문에 message dispatch 를 ..
Method Dispatch method dispatch 는 Swift 에서 메서드를 호출할 때 현재 메모리에서 어떻게 어떤 메소드를 실행시킬지를 결정할때 사용하는 방법입니다. 클래스의 dispatch 과정을 예시를 들어봅시다. class Animal { func bark() { print("bark!") } } class Cow: Animal { func bark() { print("moo!") } } class Dog: Animal { } let animal: Animal = Animal() animal.bark() let cow: Animal = Cow() cow.bark() let dog: Animal = Dog() dog.bark() 인스턴스 animal, cow, dog 가 bark() 메소드..
largestUndimmendDetentIdentifier 프로퍼티에 대해서 공부하면서 개발자 문서에 이야기하는 dimming view 의 개념에 대해서 이해해보았다. 그렇다면 먼저, largestUndimmendDetentIdentifier 에 대해서 알아보자! 기본값은 nil 이고, 설정한 detent 보다 큰 detent 에만 dimming view 를 추가하려면 이 프로퍼티를 설정하면 된다. 그렇다면 설정한 detent 와 같거나 작은 detent 는 dimming view 를 가지지 않는다는 것인데 그것이 어떤 것을 의미하는지 HIG 와 largestUndimmendDetentIdentifier 프로퍼티 설정을 통해 생각해보자! dimming view 에 대해서 생각해보자! HIG 가 제시하는 ..
- urlsession
- WWDC22
- Objective-C
- MOYA
- Algorithm
- WWDC
- watchOS
- Notification
- MVVM
- 2022 KAKAO TECH INTERNSHIP
- Protocol
- OpenSourceLibrary
- Swift
- 서버통신
- containerBackground
- projectsetting
- async/await
- APNS
- RxCocoa
- YPImagePicker
- WidgetKit
- rxswift
- github
- configurable widget
- CloneCoding
- UserDefaults
- IOS
- Firebase
- Widget
- SwiftUI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Total
- Today
- Yesterday