[SeSAC] iOS week2 08

leolim·2023년 7월 26일
0

더 더 열심히

Saving Data


지금까지는 앱이 사용되는 동안에만 메모리에 데이터를 올렸다가 사용하는 형태로 사용했다. 예를 들어 텍스트 필드에 값을 입력했더라도 앱을 껐다 다시 켜면 텍스트 필드가 비어있었다

영구적으로 알림 수신 여부와 같이 앱을 껐다 키더라도 데이터를 영구적으로 저장하려면 어떻게 하기 위해 UserDefaults와 DataBase가 사용된다. 이 방식들은

  • iOS 기기에 데이터가 저장됨
  • 앱 삭제 시 관련 데이터가 항상 삭제됨
  • 그렇기에 백업/복구 기능이 필요함
    이라는 특징이 있다. 각각에 대해 자세히 알아보자

DataBase


유사한 대량 데이터 값(중량)

ex) 채팅 내역, 일기데이터,, 영화관리 데이터 …

  • Core Data (By Apple)
  • Realm, SQLite

UserDefaults


단일 데이터 값(경량)
ex) 자동 로그인 여부, 알림 수신 여부, 인앱 결제 여부, 이메일 닉네임, 성별 앱 테마, 엡 첫 실행 팝업 다시보지 않기 등

  • Apple에서 제공해주는 Key-Value 형태의 기본저장소
  • 딕셔너리처럼 동작

SandBox System


애플에서는 앱의 데이터를 어떤 방식으로 관리할까?
애플은 앱의 데이터가 저장되는 공간을 사물함처럼 나누어서 관리한다. 이 때 각 공간을 임의로 접근 및 공유 할 수 없고 이에 대해 매우 엄격하다. 각 공간의 위치는 매번 바뀌기 때문에 개발자가 정확한 위치를 알 수 없으며 애플이 알려주는 기능대로만 써야한다. 이러한 특징으로 인해 안드로이드 어플리케이션과 달리 다른 앱의 데이터에 접근하기 어려우며, 폐쇠적이다. 대신에 매우 안전하다는 장점이 있다.

Class와 Struct


학생에 대한 정보를 저장하는 상황을 생각해보자. 학생에게는 학번, 학과, 성별, 나이, 휴학여부 등의 정보가 변수로 저장되어야 한다. 학생이 100명일 때, 학생1, 학생2, 학생3...에 대한 정보를 모두 변수를 따로 만들어서 저장을 한다면, 만들기도 어렵고 유지보수를 하기도 매우 힘들 것이다.또한 언제 사용할 지 모르는 학생까지 모두 만들어둬야 하기 때문에 공간도 많이 차지하게 된다. 이렇게 공통적인 속성들을 묶어서 관리하기 위해 Class와 Struct를 사용한다!

Class


class Student {
	var id: Int = 1234
    var gender: Bool = false
    var dept: String = "software"
    ...
}

클래스로 학생을 표현하면 다음과 같이 표현할 수 있다.

참고로 우리가 사용하는 함수 변수가 클래스나 구조체 안에 들어있다면 각각 메서드와 프로퍼티 라고 부르며 모두 합쳐서 멤버라고 부른다.

클래스는 학생을 찍어내기 위한 틀로 생각할 수 있으며 사용하기 위해서는 인스턴스를 만드는 과정이 필요하다.

let studnetA: Student()

다음과 같이 사용할 수 있다. 하지만 저렇게 선언하게 되면, 이미 학번, 학과, 성별이 클래스 내에서 정한 값으로 초기화되어 있기 때문에 학생의 정보를 바꾸기 위해서는 멤버에 일일이 접근하여 studentA.id = 2345 등으로 바꿔주는 과정이 필요하다. 여기서 클래스의 중요한 특징을 알아보자.

클래스 내 모든 프로퍼티는 초기화가 되어 있어야 한다
이를 위한 방법으로는

  1. 선언과 동시에 초기화를 진행하기
  2. 옵셔널로 선언하기
  3. 매개변수. (초기화 구문을 만들기) 방법을 사용할 수 있다.

3번의 경우를 알아보자

class Student {
	var id: Int
    var gender: Bool
    var dept: String
    init(id: Int, gender: Bool, dept: String){
      self.id = id
      self.gender = gender
      self.dept = dept
    }
}

다음과 같이 생성자를 사용할 수 있다. 생성자는 클래스의 인스턴스를 만들 때 자동완성으로 나타나는데 각 학생에게 맞는 정보를 입력하면 된다.

상속
외국인 학생이 추가되면 어떨까? 외국인 학생은 비자번호가 필요하다고 해보자. 비자번호 이외에는 학생과 모든 특징을 공유하는데 외국인 학생 클래스를 따로 만들어야할까? 상속 개념에 대해 알아보자

class ForeignStudent : Student {
	var visa: Int = 1234
}

여기서 프로젝트에서 날 힘들게 했던 init이 생각났다..

슈퍼클래스와 서브클래스에서 모두 init을 사용해야 한다면?

  • 학생의 멤버도 초기화 해줘야 하고, 학생을 상속한 외국학생도 초기화가 필요할 때는 어떻게 할까?
  • 사진처럼 외국학생의 프로퍼티만 초기화하면 super.init이 호출되지 않았다는 에러가 뜬다.
  • super.init을 호출하고 슈퍼클래스의 멤버들을 초기화해주면 또 에러가 뜬다


애초에 init을 override해주고 super.init을 해줘도, visa가 초기화되지 않았기 때문에 에러가 뜬다.
override이기 때문에, 매개변수에 visa를 추가해줄 수 없고 추가하면

기존에 init과 형태가 다르다고 에러가 뜬다


해결하려면 super.init위에 현재 클래스에서 초기화해야하는 멤버를 먼저 초기화해주는 것이다.
이것은 호출 시점을 이해해야 한다


혹은 이런 방법이 가능할 것이다..!

우선, super.init을 호출하기 클래스내의 모든 멤버가 초기화되어야 한다는 것으로 기억하자

음.. 사실 이거 이해중이라 2시간째 이것저것 해보는중,, 맨날 프로젝트 할 때마다 만났었는데 안써놓으니 할 때 마다 까먹는게 신기하다 하..하
다 해보면 써놓을게요...

### UIkit과 Class ### Class와 Struct 차이 (Memberwise Initializer) ### Method Overriding ### UserDefault는 어디 저장될까?
profile
Divide and Conquer

0개의 댓글