분류 전체보기

    [iOS] 특정영역만으로 QR 코드 스캔하기(feat. AVFoundation)

    [iOS] 특정영역만으로 QR 코드 스캔하기(feat. AVFoundation)

    최근 프로젝트를 하면서, AVFoundation를 활용하여 QR code scanner를 구현한 경험이 있습니다. 공식문서를 통하여 해당 기능을 구현한 경험을 소개하고, 더 나아가 전체 Camera Preview 속 모든 input이 아니라, 특정 영역만을 포커싱하여 QR 코드를 인식하는 코드 또한 소개해보도록 하겠습니다.  AVFoundation?시각과 청각과 관련된 에셋, 디바이스 카메라 제어, 오디오 처리 등을 구성할 수 있는 Framework시청각 자산으로 작업하고, 디바이스 카메라를 제어하고, 오디오를 처리하고, 시스템 오디오 상호 작용을 구성할 수 있다. (AVFoundation을 활용하기 전에 대충 해당 Framework가 카메라를 다룰 수 있다는 것은 알고 있었는데, 오디오도 처리하는지는 ..

    [Swift] 셀 재사용에 따른 중복 binding 이슈(feat.disposeBag)

    [Swift] 셀 재사용에 따른 중복 binding 이슈(feat.disposeBag)

    최근 RxSwift를 활용한 프로젝트 속 diffable datasource를 통해서 collection view를 구현하던 중, collection view의 아이템이 많아지니 collection view에 binding된 여러 요소들에게서 예상치 못한 에러가 발생했다. 먼저 에러가 생기는 기존의 코드를 확인해보자. self.datasource = UICollectionViewDiffableDataSource( collectionView: self.collectionView, cellProvider: { [weak self ] collectionView, indexPath, item in guard let cell = collectionView.dequeueReusableCell( withReuseId..

    [iOS] TabbarController의 presentingViewController(feat.currentContext)

    [iOS] TabbarController의 presentingViewController(feat.currentContext)

    UITabbarController위에 쌓여있는 ViewController들의 presentingViewController가 무엇인 지에대해서 알아보자. 문제 상황은 아래와 같았다. 먼저 현재 개발하고 있는 앱은 UITabbarController에 3개의 tab이 존재했고, 해당 tab들은 각각 UINavigationController로 구현이되어있다. 즉, UITabbarViewController → MypageViewController(UINavigationController) → … 여러 개의 ViewController가 stack 형식으로 들어가있다. 만약 MyPage에서 push를 통해서 올라간 맨 위 ViewController가 TicketRefundRequestViewController라고 가..

    [iOS] JSONEncoding과 URLEncoding의 차이점(Alamofire/Moya)

    [iOS] JSONEncoding과 URLEncoding의 차이점(Alamofire/Moya)

    최근 프로젝트에서 Moya 라이브러리를 활용하여 네트워크 로직을 구현하던 중, 제대로 공부를 하지 않고 활용하여 API 통신을 실패한 경험이 있다.(스웨거만 제대로 봤어도..) Moya에서 TargetType을 채택한 API를 구성할 떄, 아래와 같이 HTTP Task를 구성한다. var task: Task { switch self { case .login(let provider, let DTO): let params: [String: Any] switch provider { case .kakao: params = ["accessToken": DTO.accessToken] case .apple: params = ["idToken": DTO.accessToken] } return .requestParame..

    [컴퓨터 네트워크] Chap4. Network Layer: The Data Plane

    [컴퓨터 네트워크] Chap4. Network Layer: The Data Plane

    아래는 연세대학교 컴퓨터 네트워크 수업을 듣고 정리한 내용입니다. (간략하게 정리하였기에 부족한 점이 있을 수 있습니다) 4.1 Overview of Network 두 개의 network-layer 기능 Forwarding 라우터의 input으로 들어온 패킷을 output으로 움직이는 것 Routing source부터 destination까지 routing 알고리즘을 통해서 route를 정하는 것 두 개의 network-layer 요소 Data plane 각각의 router의 기능이다. router의 input 포트에서 output 포트로 어떻게 넘어갈 것인 지를 결정한다. forwarding function Control plane 보내는 host에서 받는 host까지 사이의 router들을 결정한다...

    [컴퓨터 네트워크] Chap3. Transport Layer(2)

    [컴퓨터 네트워크] Chap3. Transport Layer(2)

    아래는 연세대학교 컴퓨터 네트워크 수업(23-2)을 듣고 정리한 내용입니다. (간략하게 정리하였기에 부족한 점이 있을 수 있습니다) TCP seq. numbers, ACKs sequence numbers 이제 보낼 segment의 data의 첫번 째 바이트 수를 넣어준다. acknowledgements receiver가 sender에게 0~535까지 받았으니, 536을 acknowledgement field에 넣어서 보내는 것이다. 즉, 다음 번 내가 받아야되는 sequence를 넣어주는 것이다. TCP round trip time, timeout Timeout Value 설정하기 RTT timeout premature timeout, 불필요한 재전송이 많아진다. e..

    [컴퓨터 네트워크] Chap3. Transport Layer(1)

    [컴퓨터 네트워크] Chap3. Transport Layer(1)

    아래는 연세대학교 컴퓨터 네트워크 수업을 듣고 정리한 내용입니다. (간략하게 정리하였기에 부족한 점이 있을 수 있습니다) 3.1 transport-layer services 서로 다른 host에서 실행되는 app process 사이에서 논리적인 의사소통 서비스를 제공한다. End system에 구현이 되어있다. → transport protocols run in end system 보내는 쪽의 transport layer application layer에서의 메세지를 segments로 부수고, network layer로 넘겨준다. 받는 쪽의 transport layer segments를 message로 다시 합치고, application- layer로 다시 던진다. 하나의 앱에는 여러 개의 transpo..

    [컴퓨터 네트워크] Chap2. Application Layer(2)

    [컴퓨터 네트워크] Chap2. Application Layer(2)

    아래는 연세대학교 컴퓨터 네트워크 수업을 듣고 정리한 내용입니다. (간략하게 정리하였기에 부족한 점이 있을 수 있습니다) 2.4 DNS IP 주소와 www.yahoo~를 mapping 해주는 system → DNS Distributed database(분리된 데이터베이스) 많은 네임 서버의 계층구조에 구현되어있다. Application Layer Protocol host와 name server가 name을 해결하기위해서(address/name translation) 서로 커뮤니케이션을 한다. edge에 이러한 기능을 넣어서 core의 역할을 간단하게 한다. DNS Services Host Name을 IP 주소로 변환해준다. host aliasing 외부에서는 하나의 서버처럼 보이지만, 실제로는 여러 개의..

    [컴퓨터 네트워크] Chap2. Application Layer(1)

    [컴퓨터 네트워크] Chap2. Application Layer(1)

    아래는 연세대학교 컴퓨터 네트워크 수업(23-2)을 듣고 정리한 내용입니다. (간략하게 정리하였기에 부족한 점이 있을 수 있습니다) 2.1 principles of network applications Application structure client - server peer to peer Client - server architecture server 항상 존재한다. → always on host 영구적인 IP 주소를 가지고 있다. clients 항상 접속해있지는 않는다. 유동적인 IP 주소를 가지고 있다. 클라이언트끼리 직접적으로 통신을 하지는 않는다. P2P architecture 서버가 항상 접속해있지 않는다. 임의의 end system이 직접적으로 통신을 한다. scalabilty(확장성)이 ..

    [컴퓨터 네트워크] Chapter 1: Introduction

    [컴퓨터 네트워크] Chapter 1: Introduction

    아래는 연세대학교 컴퓨터 네트워크 수업을 듣고 정리한 내용입니다. (간략하게 정리하였기에 부족한 점이 있을 수 있습니다) What is the Internet? hosts end systems 네트워크 앱을 실행시키는 주체이다. communication links fiber, copper, radio, satellite 등 transmission rate(전송속도): bandwidth(대역폭) packet switches packet -> data들의 잘라놓은 묶음 단위 router와 switches로 구현이된다. Internet ISP(인터넷 서비스 제공자)들의 서로 연결망 network of networks 일반적으로 유선 또는 무선 연결을 통해 고객에게 인터넷 액세스를 제공하는 회사 Protocol..

    [Architecture] Clean Architecture

    [Architecture] Clean Architecture

    Clean Architecture에 관한 간략한 정리 안쪽 레이어에 있는 애들은 바깥 레이어에 있는 것들을 몰라야 한다. 안쪽 레이어에서 바깥쪽에 의존하지 말아야 한다. Domain Layer - Business Logic 가장 안쪽에 있는 Layer이다. 다른 레이어의 어떤 것도 포함시키면 안된다. Entities(Business Models), Use Cases, and Repository Interfaces를 포함한다. UseCases는 Repository Interfaces의 메소드를 실행시킨다. 다른 프로젝트에서도 재사용될 수 있다. 혼자서만 존재한다.(isolated) → 테스트를 하기에 매우 용의하다. Presentation Layer - MVVM UI(UIViewController / Sw..

    [iOS] CollectionView Reordering (feat. WWDC 20)

    [iOS] CollectionView Reordering (feat. WWDC 20)

    Collection view를 활용하여, 아래와 같은 reordering을 구현하는 방법을 한번 알아보겠습니다!(with ListConfiguration) 먼저 reordering과 관련된 WWDC 20의 Advances in diffable data sources를 정리하고 구현해보도록 하겠습니다. Diffable datasource의 가장 큰 장점은 유니크한 item identifier를 통하여 Collection view의 데이터를 모델링할 수 있다는 것입니다. 이러한 유니크한 item identifier를 통하여, 프레임워크가 자체적으로 reordering된 변화점을 알아서 확인하지만, 이것만으로는 충분하지 않습니다. 우리의 앱은 유저가 발생시킨 reordering 작업을 알아차려야지, 새로운 r..

    [Swift] Async, Await (2) [feat. WWDC]

    [Swift] Async, Await (2) [feat. WWDC]

    해당 글에서는 Swift Concurrency의 성능에대해서 알아봅니다. (WWDC21 Swift Concurrency Behind the Scenes 21분까지의 내용을 정리했습니다.) 두 가지를 중점적으로 볼 것입니다. - Threading Model (GCD와의 비교) - Actor를 활용하여 Synchronization을 하는 방법 Threading Model 아래와 같은 앱이 있다고 생각해봅시다. - Main Thread에서는 유저의 event gesture를 처리 - Main Thread는 비동기 Serial Queue에 loadNewsFeeds()를 호출한다. Serial Queue에서 Work를 비동기적으로 던지는 이유? -> 왜냐하면 main thread는 유저의 input을 받을 준비를..

    [Swift] Async, Await(1) (feat. WWDC)

    [Swift] Async, Await(1) (feat. WWDC)

    아래는 WWDC21 Meet async/await in Swift 및 Swift concurrency: Behind the scenes를 보고 정리한 내용입니다! 만약 네트워크 통신을 통해서 이미지를 받아오고, 썸네일을 만들어본다고 가정해봅시다. 해당 과정은 아래의 도식화된 그림과 같은 과정을 따르게 됩니다. 근데, dataTask(with:completion:) 메소드와 prepareThumbnail(of:completionHandler:)의 경우에는 시간이 오래걸리기에 비동기 코드를 활용해야됩니다. 그러면 아래와 같이 completion handler를 활용한 코드로 구현할 수 있습니다. 위 코드에는 보자마자 알 수 있드시, 생길 수 있는 문제점들이 많습니다. 먼저 completionHandler를 ..

    [Swift] WWDC21 - ARC in Swift: Basics and Beyond

    [Swift] WWDC21 - ARC in Swift: Basics and Beyond

    해당 글은 WWDC21 - ARC in Swift: Basics and Beyond를 공부하고 난 후, 정리한 글입니다! 먼저 오브젝트의 라이프 타임과 Swift의 ARC에 대해서 복습해보겠습니다. 오브젝트의 라이프타임은 초기화와 같이 시작이되고, 마지막 사용 이후에 라이프 타임은 종료됩니다. 라이프 타임 이후에는 ARC가 자동으로 메모리 할당 해제하게 됩니다. 그리고 Swift Compiler는 retain/release 작업의 삽입을컴파일 타임에 진행합니다. 여기서 말하는 retain 작업은 런타임에 reference count를 증가시키고, release 작업은 reference count를 감소시킵니다. 마지막으로 reference count가 0이되면, 오브젝트는 할당해제가 됩니다. 예를 통해서..

    [Swift] [weak self]는 언제 사용할까?

    [Swift] [weak self]는 언제 사용할까?

    우리는 무의식적으로 [weak self]를 활용할 때가 매우 많습니다. 흔히 [weak self]를 활용하는 이유를 메모리 릭이라고 합니다. 그렇다면, 우리는 항상 [weak self]를 활용하면 될까요? [weak self]를 언제 사용하고, 무엇인 지 공부해 보겠습니다.(weak를 남발하는 것의 side effect는 다른 글에서 공부해보겠습니다!) 먼저 클로져의 캡쳐 현상에 대해서 간단하게 알아보겠습니다. 클로져의 캡쳐 클로저는 내부에서 외부 변수를 사용할 때, 해당 변수를 클로져 내부적으로 저장합니다. 근데, 해당 변수가 값 타입이든 참조 타입이든지 간에 무조건 memory capture를 합니다. 즉, 클로져 안에서 값 타입인 외부 변수를 수정하면 참조 타입과 같이 변경이 되는 것이죠. 쉽게 말..

    [Swift] WWDC16 Understanding Swift Performance(3)

    [Swift] WWDC16 Understanding Swift Performance(3)

    저번 글 포스트에 이어서 계속해서 WWDC16 Understanding Swift Performance를 정리해 보겠습니다. 이번에는 Generic 타입 변수가 어떻게 저장되고 복사되는 지를 이야기해보겠습니다. 또한, method dispatch 또한 어떻게 진행되는 지 알아보겠습니다. 아래와 같은 코드가 존재한다고 해봅시다. 위 코드는 제네릭을 활용하여 제네릭 타입을 Drawable 프로토콜로 제약을 주었습니다. 그렇다면 위 코드와 그냥 파라미터 타입을 Drawable로 설정한 코드는 어떠한 차이가 있을까요? Generic 타입은 Static Polymorphism을 지원합니다. 또 다른 말로는 Parametric Polymorphism이라고도 합니다. 위와 같은 코드에서 foo 함수가 실행되면, Sw..

    [Swift] WWDC16 Understanding Swift Performance(2)

    [Swift] WWDC16 Understanding Swift Performance(2)

    저번 글 포스트에 이어서 계속해서 WWDC16 Understanding Swift Performance를 정리해 보겠습니다. 프로토콜 타입의 변수들이 어떻게 저장되며 복사되고, 프로토콜의 method dispatch는 어떻게 작동하는지 알아봅시다. Protocol Types 아래와 같은 코드를 작성했다고 생각해 봅시다. 위 코드는 Drawable 프로토콜이 정의되어 있고, Point와 Line은 각각 Drawable 프로토콜을 채택하고 있습니다. 그리고 Drawable 타입을 담고 있는 배열도 정의되어 있습니다. 해당 코드는 다형성을 제공합니다.(Polymorphism) 그러나 V-table dispatch를 하는 공통된 상속 관계를 가지고 있지 않습니다.(Point와 Line은 구조체입니다!) 그러면 ..

    [Swift] WWDC16 Understanding Swift Performance(1)

    [Swift] WWDC16 Understanding Swift Performance(1)

    WWDC16 Understanding Swift Performance를 들으면 정리한 내용입니다. 스위프트의 퍼포먼스를 고려하며 코드를 짜기위해서 고민해야되는 부분은 크게 세 가지입니다. 차근차근 세 가지가 무엇인 지 알아보겠습니다. Allocation Stack의 경우, LIFO(Last In First Out)구조로써, stack 끝에 포인터가 위치합니다. 우리는 Stack pointer가 가르키는 곳을 줄임으로써 필요한 메모리를 할당하고, 포인터를 증가시킴으로써 메모리를 할당 해제합니다. (위에서 아래로!) 메모리 할당하는 과정에서 Stack pointer는 원래 있던 곳으로 다시 위치하게 됩니다. Heap의 경우, 훨씬 더 다이나믹하지만 stack에 비해서는 덜 효율적입니다. Heap에 메모리를 ..

    [Swift] 다형성을 활용하여 Enum 대체하기

    [Swift] 다형성을 활용하여 Enum 대체하기

    OCP 법칙 확장에는 열려있고, 변경에는 닫혀있어야 한다. '확장에는 열려있고’라는 말은 손 쉽게 기능 추가를 할 수 있고(기존의 코드 변경 없이), ‘변경에는 닫혀있다’라는 말은 기능 추가 및 수정을 할 때, 여러 코드들이 한꺼번에 같이 수정된다는 말입니다. 그렇다면, 이러한 OCP 법칙을 만족하지 못하는 상황이 뭐가 있을까요? 일단 무분별하게 사용하고 있는 enum을 생각해볼 수 있습니다. Enum에 case를 하나 추가하는 순간, 해당 enum을 switch문으로 분기처리하고 있는 곳에서 새로운 코드를 추가해주어야합니다. 그렇다면, 이러한 문제점을 해결할 수 있는 방법이 무엇이 있을까요? 평소에 저희는 OCP법칙을 만족시키기 위하여 프로토콜을 적극적으로 활용했습니다. 이러한 문제점 또한 enum을 ..

    [iOS] Core Location Unit Test하기(feat. WWDC18)

    [iOS] Core Location Unit Test하기(feat. WWDC18)

    WWDC18 Testing Tips & Tricks 속 4가지 주제 중, Mocking with Protocols 세션을 정리해보았습니다. 해당 세션은 Core Location 활용 시의 외부 의존성(CLLocationManager, CLLocationManageDelegate)을 끊어주어 실제 API 호출 없이 Core Location을 Test하는 코드를 설명하고 있습니다. 위와 같은 과정은 프로토콜 의존성 주입을 통해서 구현을 했는데, 세션의 내용을 따라가면서 어떻게 테스트를 진행하는 지 알아보겠습니다. (추가로 해당 세션을 기반으로 실제 프로젝트에도 적용해보겠습니다!) Mocking with Protocols Core Location을 구현할 때는 주로 위와 같이 CLLocationManager(..

    [iOS] 공식문서로 보는 Core Location

    [iOS] 공식문서로 보는 Core Location

    공식문서를 보면서 CoreLocation에대해서 한번 알아보겠습니다. 또, 프로젝트에서 실제 사용해보죠! (참고한 공식문서 페이지는 맨 마지막에 참고로 올려두겠습니다 ☺️) Core Location이란? Core Location은 디바이스의 지정학적 위치, 고도, 방향 및 가까운 iBeacon 디바이스와 연관된 위치를 알려주는 서비스입니다. (iBeacon - 근거리 무선 통신 기술을 바탕으로 신호를 발산하는 소형 장치) Core Location 프레임워크는 Wi-Fi, 블루투스, 자력계, 기압계, 셀룰러 하드웨어 등 기기 내의 모든 요소들을 활용해서 데이터를 수집합니다. Core Location은 CLLocationManager 클래스를 활용하며, 아래와 같은 활동들을 제공합니다. 표준적이고 중요한 위..

    [Swift] 다형성과 추상화

    [Swift] 다형성과 추상화

    다형성(Polymorphism) OOP의 4가지 특성(상속, 추상화, 캡슐화, 다형성) 중 하나인 다형성은 무엇을 뜻하는 것일까요? 다형성의 관용적인 개념은 같은 모양의 코드가 다른 행위를 하는 것을 뜻합니다. 즉, 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 뜻하는 것입니다. 마치 핸드폰 속 키보드를 통하여 다이얼을 누르기도 하고, 문자를 하기도 하며, 게임도 하는 것과 같이 모양은 같지만 서로 다른 기능을 하고있는 것을 디바이스 기반의 다형성이라고 할 수 있습니다. 이것은 프로그래밍 언어의 각 요소들(상수, 변수, 객체, 메소드 등)이 다양한 자료형에 속하는 것을 허가하는 성질이라도 할 수 있습니다. 위의 키보드 예시에서는 각각의 역할이 있지만, 결국은 다 키보드라..

    [Swift] IUO(옵셔널 암시적 추출)

    [Swift] IUO(옵셔널 암시적 추출)

    IUO(Implicitly Unwrapped Optional이란?) 옵셔널 묵시적(암시적) 추출 강제 추출(!)이나, 옵셔널 바인딩을 활용하는 것과 같이 별도의 추출 과정이 없이도 자동으로 옵셔널이 해제되는 것을 뜻한다. 🌟 IUO도 Optional type을 선언하는 방법 중 하나이다! Optional type을 non-optional type에 대입할 때 따로 추출하는 과정이 없이 바로 할당이 가능하다! 즉, When we define an Implicitly unwrapped optional, we define a container that will automatically perform a force unwrap each time we read it. IUO를 정의하는 순간, 우리는 해당 값을 읽..

    [iOS] delegate는 항상 weak var로 선언해야 될까?

    [iOS] delegate는 항상 weak var로 선언해야 될까?

    delegate는 항상 weak var로 선언해야 될까? 항상 습관적으로 delegate을 weak var로 선언을 하던 중, 항상 weak를 써줘야 할까라는 의문이 들었습니다. 아래의 예를 통해서 언제 써줘야 하는지 알아보겠습니다! 예시 프로젝트 왼쪽부터 firstVC, secondVC, thirdVC입니다. firstVC -> secondVC -> thirdVC로 갔다가, 다시 dismiss하면서 처음 firstVC로 가는 코드를 작성해 보겠습니다. label의 text를 바꾸는 등, 불필요한 코드가 있지만, 값 참조하는 부분만 확인해 주시면 됩니다! 함수, delegate, 프로퍼티 naming은 간략하게 했습니다! FirstViewController button을 누르면 SecondVC로 넘어가게..

    [iOS] Diffabledatasource의 identifier는 왜 Hashable 해야 할까?

    [iOS] Diffabledatasource의 identifier는 왜 Hashable 해야 할까?

    HTML 삽입 미리보기할 수 없는 소스 먼저 공식문서가 설명하는 diffabledatasource 사용의 이유를 알아보자 Updating Collection Views Using Diffable Data Sources Diffabledatasource can streamline the display and update of data in a collection view using a diffable data source that contains identifiers. ➡️ dffiable datasources는 자신이 가지고 있는 identifiers를 통하여 collection view의 data를 업데이트하고 매끄럽게 보여줄 수 있다. A diffable data source stores a list..

    [iOS] FileManager

    [iOS] FileManager

    HTML 삽입 미리보기할 수 없는 소스 FileManager A convenient interface to the contents of the file system, and the primary means of interacting with it. ➡️ 파일 시스템의 내용에 대한 편리한 인터페이스 및 상호 작용의 주요 수단입니다. A file manager object lets you examine the contents of the file system and make changes to it. The FileManager class provides convenient access to a shared file manager object that is suitable for most types of f..

    [Swift] self는 언제 쓸까?

    [Swift] self는 언제 쓸까?

    HTML 삽입 미리보기할 수 없는 소스 self를 언제 쓸까? self ⇒ 클래스나 구조체의 인스턴스 자기 자신을 의미한다. 인스턴스 변수인지 지역변수인지를 명확하기 위해서 self를 활용한다. Objective-c 개발자들은 무의식적으로 self를 쓰는 경향이 있다! Compiler가 self를 강제할 경우 Initializer에서 모호함을 피하기 위하여 @escaping closure에서 무의식적으로 생기는 강한 참조 문제를 피하기 위하여 강제하는 경우 (1) - Initializer에서의 모호함 피하기 아래와 같이 파라미터로 받는 변수와 인스턴스 변수는 naming이 동일하다. 이럴 경우에 둘 간의 모호함을 피하기위하여 self 를 붙히게된다. struct People { let name: Stri..

    [iOS] NotificationCenter

    [iOS] NotificationCenter

    HTML 삽입 미리보기할 수 없는 소스 NotificationCenter A notification dispatch mechanism that enables the broadcast of information to registered observers. ⇒ 등록된 Observer에게 정보를 BroadCast하는 것을 가능하게 하는 Notification Dispatch(보내기) 메커니즘이다. 세 가지의 관계 알림을 만들어내는 Publisher 알림을 전달하는 Dispatcher 역할의 NotificationCenter 알림을 관찰하는 Observer 기본 예제 코드 NotificationCenter을 하나 생성 → Notification.Name을 통하여 이름을 맞춘다. NotificationCenter..

    [Swift] initializers(생성자)

    [Swift] initializers(생성자)

    HTML 삽입 미리보기할 수 없는 소스 Initializers(초기화) 소들님의 블로그를 참고하여 작성한 글입니다. https://babbab2.tistory.com/167 ‼️제일 중요‼️ 생성자 메서드가 종료되기 전까지, 생성자 안에 모든 프로퍼티는 초기값을 지니고 있어야 한다 구조체의 초기화 1. 프로퍼티에 기본 값 넣어주기 선언과 동시에 기본 값을 넣어주어 초기화하기 struct Human { let name: String = "Miro" let age: Int = 28 } 2. 프로퍼티 타입을 Optional로 하기 초기화를 할 때 Optional 타입의 프로퍼티는 nil로 초기화가 된다. struct Human { let name: String? let age: Int? } 3. init 함수..