더 더 열심히
지금까지는 앱이 사용되는 동안에만 메모리에 데이터를 올렸다가 사용하는 형태로 사용했다. 예를 들어 텍스트 필드에 값을 입력했더라도 앱을 껐다 다시 켜면 텍스트 필드가 비어있었다
영구적으로 알림 수신 여부와 같이 앱을 껐다 키더라도 데이터를 영구적으로 저장하려면 어떻게 하기 위해 UserDefaults와 DataBase가 사용된다. 이 방식들은
유사한 대량 데이터 값(중량)
ex) 채팅 내역, 일기데이터,, 영화관리 데이터 …
단일 데이터 값(경량)
ex) 자동 로그인 여부, 알림 수신 여부, 인앱 결제 여부, 이메일 닉네임, 성별 앱 테마, 엡 첫 실행 팝업 다시보지 않기 등
애플에서는 앱의 데이터를 어떤 방식으로 관리할까?
애플은 앱의 데이터가 저장되는 공간을 사물함처럼 나누어서 관리한다. 이 때 각 공간을 임의로 접근 및 공유 할 수 없고 이에 대해 매우 엄격하다. 각 공간의 위치는 매번 바뀌기 때문에 개발자가 정확한 위치를 알 수 없으며 애플이 알려주는 기능대로만 써야한다. 이러한 특징으로 인해 안드로이드 어플리케이션과 달리 다른 앱의 데이터에 접근하기 어려우며, 폐쇠적이다. 대신에 매우 안전하다는 장점이 있다.
학생에 대한 정보를 저장하는 상황을 생각해보자. 학생에게는 학번, 학과, 성별, 나이, 휴학여부 등의 정보가 변수로 저장되어야 한다. 학생이 100명일 때, 학생1, 학생2, 학생3...에 대한 정보를 모두 변수를 따로 만들어서 저장을 한다면, 만들기도 어렵고 유지보수를 하기도 매우 힘들 것이다.또한 언제 사용할 지 모르는 학생까지 모두 만들어둬야 하기 때문에 공간도 많이 차지하게 된다. 이렇게 공통적인 속성들을 묶어서 관리하기 위해 Class와 Struct를 사용한다!
class Student {
var id: Int = 1234
var gender: Bool = false
var dept: String = "software"
...
}
클래스로 학생을 표현하면 다음과 같이 표현할 수 있다.
참고로 우리가 사용하는 함수 변수가 클래스나 구조체 안에 들어있다면 각각 메서드와 프로퍼티 라고 부르며 모두 합쳐서 멤버라고 부른다.
클래스는 학생을 찍어내기 위한 틀로 생각할 수 있으며 사용하기 위해서는 인스턴스를 만드는 과정이 필요하다.
let studnetA: Student()
다음과 같이 사용할 수 있다. 하지만 저렇게 선언하게 되면, 이미 학번, 학과, 성별이 클래스 내에서 정한 값으로 초기화되어 있기 때문에 학생의 정보를 바꾸기 위해서는 멤버에 일일이 접근하여 studentA.id = 2345 등으로 바꿔주는 과정이 필요하다. 여기서 클래스의 중요한 특징을 알아보자.
클래스 내 모든 프로퍼티는 초기화가 되어 있어야 한다
이를 위한 방법으로는
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을 override해주고 super.init을 해줘도, visa가 초기화되지 않았기 때문에 에러가 뜬다.
override이기 때문에, 매개변수에 visa를 추가해줄 수 없고 추가하면
기존에 init과 형태가 다르다고 에러가 뜬다
해결하려면 super.init위에 현재 클래스에서 초기화해야하는 멤버를 먼저 초기화해주는 것이다.
이것은 호출 시점을 이해해야 한다
혹은 이런 방법이 가능할 것이다..!
우선, super.init을 호출하기 클래스내의 모든 멤버가 초기화되어야 한다는 것으로 기억하자
음.. 사실 이거 이해중이라 2시간째 이것저것 해보는중,, 맨날 프로젝트 할 때마다 만났었는데 안써놓으니 할 때 마다 까먹는게 신기하다 하..하
다 해보면 써놓을게요...