머리말


100문 100답 List
100문 100답 List 1~10
100문 100답 List 11~20
100문 100답 List 21~30
100문 100답 List 31~40
100문 100답 List 41~50
100문 100답 List 51~60
100문 100답 List 61~70
100문 100답 List 71~80
100문 100답 List 完

시작.

81. iOS에서 UserDefaults가 무엇이고 어떻게 사용하나요?


iOS에서 UserDefaults는 앱이 실행되는 동안 기본 데이터 베이스에 접근해 데이터를 기록하거나 가져오는 역할을 하는 인터페이스입니다.
키-값 쌍으로 데이터를 저장하며, 앱을 실행하면 영구적으로 데이터가 저장됩니다.

UserDefaults는 주로 간단한 사용자의 정보나 설정 등을 저장할 때 사용됩니다.

예제

UserDefaults를 사용하려면 먼저 UserDefaults.standard객체를 가져옵니다.

let defaults = UserDefaults.standard

데이터를 저장하려먼 set() 메서드를 사용합니다.

defaults.set("choi", forkey: "username")

데이터를 가져오려면 object(forkey:) 메서드를 사용합니다.

let username = defaults.object(forkey: "username") as? String

데이터를 삭제하려면 removeObject(forkey:) 메서드를 사용합니다.

defaults.removeObject(forkey: "username")

UserDefaults는 간단한 데이터를 저장하는 데 유용한 도구입니다.
하지만 대용량의 데이터나 중요한 데이터를 저장하는 데는 적합하지 않습니다.
대용량 데이터를 저장하려면 Core Data나 Realm과 같은 다른 데이터 저장소를 사용하는 것이 좋습니다.

82. Keychain을 사용하여 iOS 앱에서 어떻게 보안 데이터를 저장하나요?


iOS에서 Keychain은 앱에서 보안 데이터를 저장하는 데 사용되는 암호화된 데이터베이스 입니다.
Keychain은 다음과 같은 유형의 데이터를 저장할 수 있습니다.

  • 사용자 이름 및 암호
  • SSL 인증서
  • 키 쌍
  • 보안 토큰

이점

  • 데이터가 안전하게 암호화됩니다.
  • 데이터는 다른 기기에서 동기화할 수 있습니다.
  • 데이터에 대한 액세스를 제어할 수 있습니다.

Keychain을 사용하여 iOS 앱에서 보안 데이터를 저장하는 단계

  1. KeychainAccess프레임워크를 가져옵니다.
  2. KeychainItem클래스를 사용하여 키체인 항목을 만듭니다.
  3. KeychainItem.set()메서드를 사용하여 키체인 항목에 데이터를 저장합니다.
  4. KeychainItem.get()메서드를 사용하여 키체인 항목에 데이터를 가져옵니다.

예제

import KeychainAccess

class MyApp {
  func saveUsername(username: String) {
    let keychainItem = KeychainItem(service: "com.example.Myapp", account: "username")
    keychainItem.set(username, forkey: "username")
  }

  func getUsername() -> String? {
    let keychainItem = KeychainItem(service: "com.example.Myapp", account: "username")
    return keychainItem.get(forkey: "username")as? String
  }
}

이 예제에서는 username 키를 사용하여 username 문자열을 Keychain에 저장합니다. getUsername() 메서드는 username 키에 대한 값을 가져옵니다.

83. Core Data의 Lightweight Migration이란 무엇인가요?


Core Data의 Lightweight Migration은 관리 개체 모델 (managed object model)의 버전이 변경된 경우, 기존의 영구 저장소(persistent store)를 새로운 모델과 호환되도록 자동으로 마이그레이션하는 기능입니다.

다음과 같은 경우에만 가능합니다.

  • 새로운 모델과 기존 모델이 동일한 데이터베이스 스키마를 사용합니다.
  • 새로운 모델이 기존 모델에서 제거된 속성이나 관계를 사용하지 않습니다.
  • 새로운 모델이 기존 모델에 새로운 속성이나 관계를 추가합니다.

다음과 같은 단계로 수행됩니다.

  1. Core Data는 기존 모델과 새로운 모델 간의 차이점을 분석합니다.
  2. Core Data는 분석 결과를 기반으로 마이그레이션 맵(migration amp)을 생성합니다.
  3. Core Data는 마이그레이션 맵을 사용하여 기존의 영구 저장소를 새로운 모델과 호환되도록 수정합니다.

장점

  • 자동으로 수행되므로 개발자가 직접 마이그레이션 코드를 작성할 필요가 없습니다.
  • 기존 데이터를 손실하지 않고 마이그레이션할 수 있습니다.

단점

  • 모든 경우에 사용 가능한 것은 아닙니다.
  • 기존 모델과 새로운 모델 간의 차이점이 크면 마이그레이션 시간이 오래 걸릴 수 있습니다.

84. Codable 프로토콜과 JSON 데이터 간의 상호 변환에 대해 설명하세요.


Swift의 Codable 프토토콜은 JSON 데이터와 구조체, 클래스, 열거형 간의 상호 변환을 지원하는 프로토콜입니다.

Codable 프로토콜을 준수하는 타입은 다음과 같은 두 가지 메서드를 구현해야 합니다.

  • encode(to: Encoder) : JSON 데이터로 변환하는 메서드입니다.
  • init(from: Decoder) : JSON 데이터에서 변환하는 메서드 입니다.

사용 단계

  1. 구조체, 클래스, 열거형을 Codable 프로토콜을 준수하도록 구현합니다.
  2. encode(to: Encoder)메서드에서 JSON 데이터로 변환할 데이터를 지정합니다.
  3. init(from: Decoder)메서드에서 JSON 데이터에서 변환할 데이터를 지종합니다.

예제

struct User: Codable {
  let name: String
  let age: Int
}

let user = User(name: "choi", age: "24")

// JSON 데이터로 변환
let jsonData = try JSONEncoder().encode(user)

// JSON 데이터에서 변환
let decodedUser = try JSONDecoder().decode(User.self, from: jsonData)

print(decodeUser) // User(name: "choi", age: "24")

이 예제에서는 User 구조체를 Codable 프로토콜을 준수하도록 구현합니다.
encode(to: Encoder) 메서드에서는 nameage 속성을 JSON 데이터로 변환합니다.
init(from: Decoder) 메서드에서는 JSON 데이터에서 nameage 속성을 변환합니다.

85. iOS에서 SQLite 데이터베이스를 사용하는 방법에 대해 설명하세요.


단계

  1. SQLite 라이브러리를 프로젝트에 추가합니다.
  2. SQLite 데이터베이스 파일을 생성합니다.
  3. SQLite 데이터베이스 파일에 테이블을 생성합니다.
  4. 테이블에 데이터를 저장합니다.
  5. 테이블에서 데이터를 가져옵니다

예제

SQLiteConnection클래스를 사용하여 SQLite 데이터베이스 파일을 생성합니다.

let dbPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendinPathComponent("mydatabase.sqlite")
let db = tyr SQLiteConnection(path: dbPath)

SQLite 데이터베이스 파일에 테이블 생성

createTable()메서드를 사용하여 SQLite 데이터베이스 파일에 테이블을 생성합니다.

ry db.createTable("users", columns: [
    Column("id", .integer, primaryKey: true),
    Column("name", .text),
    Column("age", .integer)
])

SQLite 데이터베이스 파일에 데이터 저장

insert()메서드를 사용하여 SQLite 데이터베이스 파일에 데이터를 저장합니다.

try db.insert("users", values: [
    1,
    "choi",
    24
])

SQLite 데이터베이스 파일에서 데이터 가져오기
query()메서드를 사용하여 SQLite 데이터베이스 파일에서 데이터를 가져옵니다.

let users = try db.query("users")

for user in users {
    print(user.id, user.name, user.age)
} 

86. URLSession과 URLSessionDataTask의 차이는 무엇인가요?


URLSession

  • URLSession은 HTTP/HTTPS를 통해 데이터를 주고받는 API를 제공하는 클래스입니다.
  • URLSession은 데이터 전송 작업을 관리하는 클래스입니다.
  • URLSession을 사용하여 데이터 전송 작업을 생성하고, 작업의 상태를 확인하고, 작업을 취소할 수 있습니다.

URLSessionDataTask

  • URLSessionDataTask는 URLSession에서 제공하는 데이터 전송 작업을 나타내는 추상 클래스입니다.
  • URLSessionDataTask를 상속하여 HTTP 요청을 수행하는 작업을 구현할 수 있습니다.
  • URLSessionDataTask는 다음과 같은 세 가지 종류의 작업을 지원합니다.
    • GET : 서버에서 데이터를 가져오는 작업
    • POST : 서버에 데이터를 전송하는 작업
    • PUT : 서버에 데이터를 업데이트하는 작업
  • URLSessionDataTask를 사용하여 HTTP 요청을 수행하려면 다음과 같은 단계를 따라야합니다.
    1. URLSessionDataTask를 생성
    2. resume()메서드를 호출하여 작업을 시작
    3. data프로퍼티를 사용하여 응답 데이터를 가져옵니다.

예제

let session = URLSession(cofigurationL .default)
let task = session.dataTask(with: URL(string: "https://example.com")!)

task.resume()

if let data = task.data {
  let response = String(data: data, encoding: .utf8)
  print(response)
}
class MyDataTask: URLSessionDataTask {
  override func resume() {
    super.resume()

    // HTTP 요청을 수행하는 코드를 구현
  }
}

요약

| 속성 | URLSession | URLSessionDataTask | |—|—|—| | 종류 | 클래스 | 추상 클래스 | | 역할 | 데이터 전송 작업을 관리 | 데이터 전송 작업을 나타냄 | | 지원하는 작업 | GET, POST, PUT, HEAD, DELETE, PATCH | GET, POST, PUT, HEAD, DELETE, PATCH | | 사용 방법 | dataTask(with:) 메서드를 사용하여 생성 | 상속하여 구현 |

87. iOS에서 비동기적으로 작업을 수행하는 방법에 대해 설명하세요.


GCD

  • 스레드, 블록, 큐, 타이머 등을 사용하여 비동기 작업을 수행할 수 있습니다.

OperationQueue

  • 작업을 시퀀스로 실행하거나, 작업을 병렬로 실행하거나, 작업을 취소할 수 있습니다.

async/await

  • 비동기 작업을 동기적으로 수행하는 것처럼 보이게 할 수 있습니다.

비동기 작업의 작점

  • UI 응답성 향상
  • 성능 향상
  • 코드 가독성 향상

비동기 작업의 단점

  • 오류 처리 어려움
  • 데이터 동기화 어려움

88. TCP/IP 프로토콜 스택의 구성 요소를 설명하세요.


TCP/IP 프로토콜 스택은 네트워크에서 데이터를 전송하고 수신하는 데 사용되는 프로토콜의 집합입니다.

TCP/IP 프로토콜 스택의 네 가지 계층

  • 응용 계층
    • 사용자와 네트워크의 상호 작용을 제공합니다.
    • HTTP, FTP, SMTP, DNS 등이 응용 계층 프로토콜에 속합니다.
  • 전송 계층 : 데이터를 신뢰성 있게 전송합니다.
    • TCP, UDP 등이 전송 계층 프로토콜에 속합니다.
  • 네트워크 계층 : 데이터를 목적지까지 전달합니다.
    • IP, ICMP 등이 네트워크 계층 프로토콜에 속합니다.
  • 링크 계층 : 물리적 네트워크에서 데이터를 전송합니다.
    • Ethernet, Wi-Fi, Bluetooth 등이 링크 계층 프로토콜에 속합니다.

89. Swift에서 Futures 및 Promises에 대해 알고 있나요?


Futures

  • Futures는 미래의 결과를 나타내는 객체
  • 비동기 작업의 결과를 나타내기 위해 사용
  • 두 가지 상태를 가질 수 있음
    • Pending : 아직 결과가 결정되지 않은 상태
    • Resolved : 결과가 결정된 상태

Promises

  • Futures를 생성하고 관리하는 데 사용되는 객체
  • 두 가지 상태를 가질 수 있음
    • Pending : 아직 결과를 생성하지 않은 상태
    • Resolved : 결과를 생성한 상태

장점

  • 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
  • 오류 처리를 단순화할 수 있습니다.
  • 병렬 처리를 지원할 수 있습니다.

단점

  • 학습 곡선이 높을 수 있습니다.
  • 성능이 저하될 수 있습니다.

90. iOS에서의 네트워크 보안을 강화하는 방법에 대해 설명하세요.


  • ATS(App Transport Security)를 활성화 합니다.
    • ATS는 암호화되지 않은 HTTP 연결을 차단하여 iOS 앱의 데이터를 보호합니다.
  • TLS 1.2 이상을 사용합니다.
    • TLS는 데이터를 암호화하고 인증하는 데 사용되는 프로토콜입니다.
  • 인증서를 신뢰합니다.
    • 서버 인증서는 서버의 ID를 확인하는 데 사용됩니다.
    • 인증서를 신뢰하지 않으면 서버와의 연결이 안전하지 않을 수 있습니다.
  • 강력한 암호를 사용합니다.
    • 강력한 암호는 최소 12자 이상이고 대문자, 소문자, 숫자, 특수 문자를 포함해야 합니다.
  • 최신 iOS 버전을 사용합니다.









다음에 계속


100문 100답 List에서 81~90번까지의 질문에 대한 답변입니다.
틀린 답변이 있거나 더 좋은 답변이 있다면 댓글 남겨주시면 적극 반영하겠습니다.
다들 화이팅 입니다.

100문 100답 List 1~10
100문 100답 List 11~20
100문 100답 List 21~30
100문 100답 List 31~40
100문 100답 List 41~50
100문 100답 List 51~60
100문 100답 List 61~70
100문 100답 List 71~80
100문 100답 List 完

이상.