// 데이터 추가 및 업데이트
UserDefaults.standard.set(value, forKey: key)
// 데이터 조회 | Any? 타입이므로 as를 사용한 타입 변환 후 사용
UserDefaults.standard.value(forKey: key)
// 데이터 조회 | 특정 타입으로 반환할 경우 (String)
UserDefaults.standard.string(forKey: key 
- Core Data Stack : 데이터를 관리하고 저장하기 위한 Core Data 프레임워크의 핵심 구성 요소들의 집합

* NSManagedObjectModel : 앱의 데이터 모델을 정의하는 객체. entity와 그들의 속성을 정의하고 이러한 모델은 데이터베이스 스키마에 해당한다.
* NSManagedObjectContext : 앱의 데이터를 가져오거나 수정하는 데 사용되는 객체. 주로 메모리에서 데이터를 관리하고 데이터베이스와 상호작용한다.
* NSPersistentStoreCoordinator : 영구 저장소를 관리하고 데이터베이스와의 통신을 담당하는 객체. SQLite,XML,Binary 등 다양한 데이터 저장소 유형과의 연결을 관리한다.
* NSPersistentStore : 실제로 데이터를 영구적으로 저장하는 데 사용되는 데이터베이스 파일이나 다른 형태의 저장소이다.
AppDelegate 파일에서 Core Data Stack을 설정할 수 있다.
import CoreData
// Core Data Stack
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "생성한 Data Model명")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
})
return container
}()
// Core Data Saving support
func saveContext() {
let context = persistentContainer.viewContext
if context.hasChanges {
do {
try? context.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}


import CoreData
// persistentContainer에 접근
var persistentContainer: NSPersistentContainer? {
(UIApplication.shared.delegate as? AppDelegate)?.persistentContainer
}
// create
guard let context = self.persistentContainer?.viewContext else { return }
let newCar = Car(context: context)
newCar.id = UUID()
newCar.name = "benz"
try? context.save()
// read
guard let context = self.persistentContainer?.viewContext else { return }
let request = Car.fetchRequest()
let cars = try? context.fetch(request)
print(cars)
// update
guard let context = self.persistentContainer?.viewContext else { return }
let request = Car.fetchRequest()
guard let cars = try? context.fetch(request) else { return }
let filteredCars = cars.filter({ $0.name == "benz" })
for car in filteredCars {
car.name = "tesla"
}
try? context.save()
// delete
guard let context = self.persistentContainer?.viewContext else { return }
let request = Car.fetchRequest()
guard let cars = try? context.fetch(request) else { return }
let filteredCars = cars.filter({ $0.name == "tesla" })
for car in filteredCars {
context.delete(car)
}
try? context.save()