앱의 콘텐츠나 데이터 자체를 저장/보관하는 특별한 객체, class의 성능, Copy On Write

Groot·2022년 10월 28일
0

TIL

목록 보기
90/153
post-thumbnail

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 키워드를 사용하면 호출자가 메서드가 값을 변경할 것임을 알 수 있다.
profile
I Am Groot

0개의 댓글