앱의 콘텐츠나 데이터 자체를 저장/보관하는 특별한 객체, class의 성능, Copy On Write
TIL
🌱 난 오늘 무엇을 공부했을까?
📌 면접스터디
📍 앱의 콘텐츠나 데이터 자체를 저장/보관하는 특별한 객체
- 나의 생각은 처음에 객체니까 모델이라고 생각을 했다. 하지만, 정답은 데이터 베이스.. 앱 실행 시 콘텐츠나 데이터 그 자체를 저장/보관하고 있는건 데이터 베이스 이고 그 저장/보관을 가능하도록 코드로 구현한게 객체 이기 때문일까?
🔗 iOS 데이터 베이스 종류
- KeyChain
- 키와 값의 쌍으로 구성된 암호화 데이터를 저장하는 데이터 베이스
- 비밀번호 같은 사용자가 감추고 싶은 데이터를 주로 저장한다.
- 사용자가 직접 제거하지 않으면 앱을 제거해도 데이터는 남아있는다.
- UserDefaults
- 키과 값의 쌍으로 데이터를 plist라는 파일형태로 저장하는 사용자의 기본 데이터베이스에 대한 인터페이스.
- 싱글톤 디자인 패턴을 사용한다.
- thread 안전하다. -> 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음
- 파일형태로 저장되기 때문에 보안성이 떨어짐
- 주로 간단한 앱 설정을 저장한다 예) 배경음악 사용유무 등
- CoreData(FrameWork)
- SQL문을 사용하지 않고 바이러리 파일, SQLite등의 데이터 베이스에 접근해서 관리할 수 있도록 애플에서 만든 프레임워크
- 프레임워크에는 개발자가 작성해야 하는 총 코드 양을 궁극적으로 최대 70%까지 줄이는 내장 기능이 있음.
- 인메모리 형태가 가능
- 객체지향을 바탕으로 만들어졌기 때문에 저장된 객체들의 관계를 이용해 다양한 기능을 사용할 수 있음 예) 알림 등
📍 class의 성능 향상 방법
- 참조카운트를 낮출 수 있도록 해야한다.
- final 키워드를 사용해서 컴파일 시 Static Dispatch
- 상속을 사용하면 자식클래스가 부모로부터 상속받은 동일한 이름의 override 메소드를 호출할 수 있기 때문에 컴파일 타임에 실제로 어떤 메서드를 실행할 지 결정할 수 없다.
- final 키워드를 붙이면 컴파일 타임에 상속을 사용하지 않음을 알 수 있기 때문에 정적 디스패치.
- 이는 컴파일러가 간접 호출 대신 직접 함수 호출을 내보낼 수 있음을 의미합니다.
- 선언에 private 또는 fileprivate 키워드를 적용하면 선언이 선언된 파일에 대한 선언의 가시성이 제한됩니다. 이를 통해 컴파일러는 잠재적으로 재정의할 수 있는 다른 모든 선언을 확인할 수 있습니다.
- Property도 같이 Dynamic Dispatch로 동작
📍 Copy On Write는 어떤 방식으로 동작하나
- 실제 원본이나 복사본이 수정되기 전까지는 복사를 하지 않고 원본 리소스를 공유함 그리고 원본이나 복사본에서 수정이 일어날 경우, 그때 복사하는 작업을 함
- 실제 수정이 이뤄질 때 복사를 하고 그 전엔 참조를 통해 동일한 값을 바라보는 방법으로 메모리를 줄인다.
- Copy-on-Write는 값 유형의 기본 동작이 아니며
Array 및 Collections
와 같은 특정 유형에 대해 Swift 표준 라이브러리에서 구현된다.
- 표준 라이브러리의 모든 값 유형에 이 동작이 있는 것은 아님 Collection에 있음.
🔗 꼬리질문 - Mutating
- Swift 구조체는 변경할 수 없는 객체이기 때문에 변경 함수를 호출하면 실제로 새로운 구조체가 제자리에 반환된다.(함수에 inout 매개변수를 전달하는 것과 유사).
- mutating 키워드를 사용하면 호출자가 메서드가 값을 변경할 것임을 알 수 있다.