diff --git a/LEVEL 1/04-Closure.md b/LEVEL 1/04-Closure.md new file mode 100644 index 0000000..37ef478 --- /dev/null +++ b/LEVEL 1/04-Closure.md @@ -0,0 +1,20 @@ +## 04. Closure +### Swift에서 클로저(Closure)란 무엇이며, 어떻게 사용하나요? +- Swift에서 클로저는 이름 없는 함수입니다. +- 클로저는 1급 객체이기 때문에 변수, 함수의 인자, 함수의 반환값으로 사용할 수 있습니다. + +### 클로저의 캡처(Capture) 기능은 무엇인가요? +- 클로저는 클로저가 호출된 컨텍스트와 다른 생명주기를 가질 수 있습니다. +- 따라서 클로저 내부에서 외부 컨텍스트의 변수를 참조하게 되면, 클로저보다 외부 컨텍스트가 더 빨리 사라질 가능성이 있습니다. +- 이러한 가능성 때문에 클로저는 외부 컨텍스트의 변수와 상수를 캡처해 외부 컨텍스트가 사라져도 캡처한 값을 참조 및 변경 가능하도록 설계되어 있습니다. + +### @escaping 클로저와 non-escaping 클로저의 차이점은 무엇인가요? +- 클로저가 함수의 매개변수로 전달되었지만, 함수 반환 이후에 호출되는 경우 클로저가 탈출(escaping)한다고 할 수 있습니다. +- 이 때 매개변수에 @escaping을 작성해 해당 클로저는 탈출이 허용됨을 나타낼 수 있습니다. +- 만약 탈출 클로저 내부에서 클래스 인스턴스 self를 참조하게 된다면, 두 참조 타입이 서로를 참조하는 순환 참조가 발생하게 됩니다. +- 이를 방지하기 위해 캡처 리스트에서 weak 또는 unowned 키워드를 사용해 레퍼런스 카운트를 증가시키지 않도록 방지해야 합니다. +- 클로저의 생명주기가 self보다 긴 경우를 대비하기 위해 weak 키워드를 사용해주는 것이 좋습니다. + +### 트레일링 클로저(Trailing Closure) 문법은 어떤 경우에 유용한가요? +- 트레일링 클로저 문법은 콜백 함수를 작성할 때 유용합니다. +- 함수의 매개변수로 함수를 전달 및 호출하는 것이 콜백 함수인데요, 트레일링 클로저 문법을 활용하면 콜백 함수를 손쉽게 작성할 수 있습니다. \ No newline at end of file diff --git a/LEVEL 1/08-Save Data.md b/LEVEL 1/08-Save Data.md new file mode 100644 index 0000000..1a18b4a --- /dev/null +++ b/LEVEL 1/08-Save Data.md @@ -0,0 +1,45 @@ +## 08. Save Data +### iOS 앱에서 데이터를 저장하는 방법에는 어떤 것들이 있나요? +- iOS 앱에서 데이터를 저장하는 방법으로는 UserDefaults, Keychain, FileManager, CoreData, SQLite, Realm 등이 있습니다. +- UserDefaults + - 간단한 데이터를 키-값 쌍으로 저장 + - 사용하기 쉽고 접근이 빠릅니다. + - 대용량 데이터나 복잡한 구조 저장에는 적합하지 않고, 보안성이 약합니다. + +- Keychain + - 암호화 복호화를 지원해 보안에 민감한 데이터를 저장하기 적합합니다. + - 앱 샌드박스 외부에 위치해있어 앱을 삭제해도 사라지지 않습니다. + +- File System + - 파일 시스템에 곧바로 저장하는 방식입니다. + - 구조화되지 않은 binary, json, 이미지 등의 데이터를 저장하기 적합합니다. + +- CoreData + - 객체 그래프 관리와 영구 저장을 위한 프레임워크 입니다. + - SQLite를 기반으로 하지만 직접적인 쿼리 없이도 데이터를 다룰 수 있도록 추상화를 제공합니다. + - 앱의 데이터 모델을 관계형 DB처럼 관리할 수 있게 해줍니다. + - 높은 수준으로 구조화된 객체들을 저장하기 적합합니다. + +- SQLite + - 오픈소스로 동작하는 크로스플랫폼 DBMS 입니다. + - SQL 쿼리로 동작합니다. + - 안드로이드, iOS, 윈도우, macOS 등 매우 다양한 플랫폼을 지원하기 때문에 크로스플랫폼 환경에서 유용합니다. + +- Realm + - 모바일 앱을 위해 설계된 크로스 플랫폼 데이터베이스 입니다. + - 모바일에 중점을 두고 설계되어 경량화 및 메모리, 디스크, 배터리 효율성을 고려해 만들어졌습니다. + - 모바일 크로스플랫폼 환경에 적합한 데이터베이스 입니다. + +### UserDefaults의 사용 시 주의할 점은 무엇인가요? +- UserDefaults는 앱이 시작될 때 메모리에 모두 불러와지기 때문에 거대한 크기의 정보를 저장하기에는 적합하지 않습니다. +- 또한 보안에 취약하기 때문에 민감한 정보를 저장하기에도 적합하지 않습니다. + +### Keychain은 어떤 데이터를 저장하기에 적합한가요? +- Keychain에는 API Key 등 민감한 정보를 저장하기에 적합합니다. + +### Core Data와 SQLite의 차이점은 무엇이며, 각각 언제 사용하면 좋나요? +- Core Data는 데이터베이스가 아닌 프레임워크인 반면 SQLite는 데이터베이스 입니다. +- 코어 데이터는 앱과 실제 영구 저장소 사이에서 영구 저장소에 대한 접근을 더 쉽게 만들어주는 역할을 합니다. +- 실제로 코어 데이터는 내부적으로 SQLite를 영구 저장소 옵션 중 하나로 제공합니다. +- 앱 저장소가 애플 생태계에서만 필요하다면 Core Data를 사용할 수 있습니다. +- 만약 크로스 플랫폼 저장소가 필요하다면 SQLite를 사용할 수 있습니다. \ No newline at end of file