Skip to content

Latest commit

 

History

History
110 lines (77 loc) · 8.01 KB

210820_이니셜라이저,_궁금했던_키워드.md

File metadata and controls

110 lines (77 loc) · 8.01 KB

210820 이니셜라이저, 궁금했던 키워드

TIL(Today I Learned)

날짜: 2021년 8월 20일 작성자: 이아리 태그: Class, initalizer, struct

학습내용

오늘은 이니셜라이저 복습과 공부하면서 알게되었고 개념을 정확히 모르고있는 키워드들을 구글링하면서 정리해보았다. 이니셜라이저는 구조체의 경우 단순하고 간단하지만 클래스로 넘어가게되면 상속 때문에 좀 헷갈리는 부분이 많다. 오늘 복습하게 되면서 개념이 어느정도 정리가 되긴 하였지만, 아직 좀더 반복학습이 필요할 것 같다. 특히 2단계 초기화 부분이 약간 이해하는데 어려움을 겪었다. 직접 코드 작성을 해보고 어떤 순서로 초기화가 되는지를 설명할 수 있을 때까지 공부를 좀 더 해봐야할 것 같다. 또 과제를 진행하면서 구조체와 클래스는 어떤 상황에 사용해야 적합할지를 생각하다가 공식문서에서 '직렬화'할때 사용을 권장한다고 되어있어서 직렬화가 무엇인지를 공부해보았다. 쉽게 말해서 시스템 외부로 데이터를 전송하기 위해 복원할 수 있는 형태의 데이터로 전환하는 과정이라고 말할 수 있겠다. 인코딩과 같은 형태이다. JSON도 들어만 보고 어떤 형태인지만 봤지, 정확히 어떤 것인지 무엇을 말하는 건지 어떤 상황에 쓰는 것인지 뜻을 몰라서 검색했다. 앞서 말한 것과 같이 나는 오늘 복습과 궁금증을 해결하는 시간을 가졌다. 학습을 하는 것도 중요하지만 복습도 정말 중요하다!

ex_screenshot

그리고 뜬금없지만 iOS 개발자 로드맵 보다가 내가 이 짧은 기간에 여기까지의 지식을 채웠다는게 대단하다고 느껴졌다. 뭐 물론 완벽한 상태는 아니지만... 🤣 얼릉 고수가 되고싶어!

initalizer

🔍 초기화 키워드 정리

Designated initalizer (지정 초기화) 기본 이니셜라이저이다. 클래스 안에 있는 모든 프로퍼티를 초기화 될 수 있도록 해줘야 한다.

Convenience initalizer (편의 초기화) 지정 초기화의 일부 파라미터의 기본값을 설정하여 초기화하는 이니셜라이저이다. 쉽게 말해서 보조 초기화라고 생각하면 될 것 같다. 적은 입력으로 초기화를 편리하게 할 수 있게 도와주는 역할을 한다**.**

Required initalizer (필수 초기화) 이니셜라이저의 재정의를 필수적으로 해줘야 한다는 것을 알려주기 위한 이니셜라이저이다. 선언하게되면 해당 이니셜라이저는 클래스에서 반드시 구현해야한다. 클래스를 상속받은 클래스에서 구현할 때에도 required 키워드를 붙여 사용해야 한다. 참고로 override를 기본으로 포함하고 있다.

deinitalizer (초기화 해제) deinit은 클래스의 인스턴스가 메모리에서 해제되는 시점에 호출된다. 파라미터를 지닐 수 없고, 자동으로 호출되므로 직접 호출하는 것이 불가능하다. 클래스 타입에서만 구현할 수 있고 인스턴스가 메모리에서 해제되는 시점은 ARC의 규칙에 따라 결정된다.

🔍 초기화 형태 정리

struct A {
    var str: String = "text"
}

let own = A() // Default initalizer
let two = A(str: "Ari") // Memberwise initalizer

Default initalizer 프로퍼티가 모두 초기화 되어있는 경우 매개변수가 없는 이니셜라이저가 제공된다.

Memberwise initalizer 구조체 내에 프로퍼티가 하나도 초기화 되지 않은 경우 초기값이 없는 속성을 파라미터로 갖는 Memberwise initalizer가 제공된다. 모두 let으로 기본값으로 초기화 되어있는 경우라면 Memberwise initalizer는 제공되지 않는다.

initalizer Delegation (이니셜라이저 위임) 이니셜라이저는 다른 이니셜라이저를 호출하여 인스턴스 초기화의 일부를 수행할 수 있다. 이를 이니셜라이저 위임이라고 한다. 값타입인지 참조타입인지에 따라 Initializer delegation의 작동 방법이 달라진다. 값타입은 상속을 지원하지 않는다. 따라서 자신이 제공하는 생성자에게만 위임할 수 있기 때문에 구조가 단순하다. 반면에 참조타입은 다른 클래스를 상속할 수 있기 때문에 상속하는 모든 프로퍼티가 초기화 중에 적절한 값이 할당되어야 한다.


타입을 설계할 때 참고할 단계 정리

일반화(Generalization) 인스턴스의 공통 특징을 뽑아내는 것 추상화(Abstraction) 공통 특성 중 관심이 있는 부분만 추출하고 나머지는 무시하는 과정 은닉화(Hiding) 주요 사항이 겉으로 드러나지 않도록 감추는 것 캡슐화(Encapsulation) 중요사항을 감춘 상태에서 외부에서 그것을 사용할 수 있는 방법을 제공하고 외부와 소통을 하는 것


궁금했던 키워드 정리

override 상속된 멤버를 현재클래스에 적합하게 다시 구현할 때 사용하는 것

overloading 하나의 타입에서 동일한 이름을 가진 다수의 멤버를 구현할 때 사용한다. 이름이 동일하면 파라미터 수로 식별 함수이름, 파라미터 수가 동일하면 파라미터 타입으로 식별 함수이름, 파라미터가 동일하면 Argument Label로 식별 함수이름, 파라미터, Argument Label이 동일하면 리턴타입으로 식별

nan 숫자가 아닌 값. 숫자가 아닌 값을 연산하였을 때 오류로 나타내는 반환 값이다.

Serialization 직렬화는 객체 등 특정 구조의 데이터를 이후 복원할 수 있는 형태의 데이터로 전환하는 과정. 역직렬화는 그 반대 직렬화된 데이터를 복원하는 과정이다. 직렬화된 데이터는 아무리 길어도 1줄 정도이다. 직렬화 하는 이유는 해당 데이터를 시스템 외부에 저장하거나 전송하기 위해서 사용한다. 역직렬화는 시스템 외부에 저장되거나 전송된 데이터를 받아와 복구 후 사용한다. 직렬화 == 인코딩 / 역직렬화 == 디코딩 쉽게 이해하자면 이렇다.

JSON JavaScript Object Notation라는 의미의 축약어로 데이터를 저장하거나 전송할 때 많이 사용되는 경량의 데이터 교환 방식이다. JSON 표현식은 사람과 기계 모두 이해하기 쉬우며 용량이 작아서 최근에는 JSON이 XML을 대체해서 데이터 전송 등에 많이 사용한다. JSON은 데이터 포맷일 뿐이며 어떠한 통신 방법도, 프로그래밍 문법도 아닌 단순히 데이터를 표시하는 표현 방법일 뿐이다.

lazy

사용 전 고려사항 필요하지만 사용하기도 전에 불러오기 부담스러운 것들은 lazy를 통해 선언해준다. 실제로 사용될 때까지 프로퍼티 생성을 지연시킬 수 있고 속성들을 연산 프로퍼티 처럼 만든다. 반드시 var와 함께 쓰여야한다. 기본적으로 구조체랑 클래스에서만 사용할 수 있다. 연산 프로퍼티에서는 사용할 수 없다. 클로저와 함께 사용할 수 있다.

복습하면서 블로그 글을 좀더 보충해주었다.

https://leeari95.tistory.com/19#🔍 -initalizer-extension-for-value-https://leeari95.tistory.com/20#✔️-참조타입의 initalizer-delegation

https://leeari95.tistory.com/20#✔️-2단계-초기화

https://leeari95.tistory.com/17#✔️ apple이-권장하는-클래스와-구조체-용도