SWIFT
[Swift] Equatable 프로토콜
두 인스턴스를 비교하여 동일한지 확인할 수 있는 프로토콜이다. == , != 두 연산자는 같은지, 다른지를 확인할 수 있는 연산자다. Int와 Double형 등에서 ==와 !=를 사용해서 동일한지 동일하지 않은지 비교할 수 있었던 이유는 애플이 미리 Int와 Double에서 ==와 !=를 구현해 놨기 때문이다. 그렇기 때문에 동일성을 비교할 수 있었다. Equatable의 구현 요구사항 static func == (lhs: Self, rhs: Self) -> Bool Equatable의 구현 원칙⭐️ 1. 구조체, 열거형의 경우 Equatable프로토콜 채택시 모든 저장속성(열거형은 모든 연관값)이 Equatable프로토콜을 채택한 타입이라면 비교연산자(==, !=) 메서드 자동구현 2. 열거형의경우 연..
[Swift] 메모리 안전성(Memory Safety)
싱글 쓰레드 환경에서도 하나의 메모리에 동시적 접근이 발생 가능하다. 1. 메모리에 충돌하는 접근 이해 변수의 값을 설정하거나 함수에 인자를 전달하는 동작을 할 때 메모리에 접근하게 된다. var one = 1 // 쓰기 접근. print("We're number \(one)!") // 읽기 접근. 코드의 다른 부분이 같은 시간에 메모리의 같은 위치에 접근할 때 충돌이 발생할 수 있다. 메모리 접근의 특징 3가지 조건을 모두 만족하는 2개의 접근이 있다면 충돌이 발생한다. 적어도 하나는 쓰기 접근 (메모리 위치를 변경) 이거나 non-atomic (C atomic 연산이 아닌 것) 접근이다. 메모리의 같은 위치에 접근한다. 접근 시간이 겹친다. (순간적 / 장기적) 접근이 시작되고, 종료되기 전에 다른 ..
[Swift] 오버플로우, 오버플로우연산자
오버플로우의 개념 overflow의 사전적 의미는 넘쳐 흐르다. 범람하다 등의 뜻이다. Swift언어의 오버플로우는 대략 다음과 같다. 각 정수형은 담을 수 있는 수의 크기가 있다. 자료형 범위 부호여부 크기 Int8 -128 ~ 127 부호 있음 8 비트 Int16 -32768 ~ 32767 부호 있음 16 비트 Int32 -2147483648 ~ 2147483647 부호 있음 32 비트 Int64 -9223372036854775808 ~ 9223372036854775807 부호 있음 64 비트 UInt8 0 ~ 255 부호 없음 8 비트 UInt16 0 ~ 65535 부호 없음 16 비트 UInt32 0 ~ 4264967295 부호 없음 32 비트 UInt64 0 ~ 184467440737095516..
[Swift] String의 Subsequence(Substring)란
SubString(Subsequence) String인스턴스의 일부의 새 메모리에 복사하지 않고 원본 문자열 문자의 일부분을 참조한다. 메모리 사용량을 줄이고 성능을 향상시키는데 도움된다. 원본의 수정이 일어나기 전까지 메모리 공유, 원본이 수정되면 SubString은 새로운 메모리 공간을 갖게된다. 오랜기간 저장하기 위해서는, 새롭게 문자열로 저장할 필요 String인스턴스에서 prefix, suffix등을 사용하여 SubString을 만들 수 있다. var greeting = "Hello, world!" let index: String.Index = greeting.firstIndex(of: ",") ?? greeting.endIndex // ,(콤마)의 인덱스 let beginning: String..
[Swift] 날짜와 시간데이터를 사용하기
UTC(Coordinated Universal Time): 국제 표준시간 / 국제 사회가 사용하는 과학적 시간의 표준 GMT와 같다 영국의 그리니치 천문대의 시간을 기준으로 하는 시간 한국의 시간(KST)은 UTC + 9와 같다. 날짜와 시간 데이터를 가지고 놀기 위해선 아래와 같은 요소를 알아야한다. Date,TimeInterval, Calendar, DateComponents Date구조체는 초를 기준으로하는 절대적 시점을 의미한다 이를 잘 활용하기 위해선 Calendar이나 DateFormatter를 잘 활용해야한다. 💥1. Date구조체 ReferenceDate: 기준시간 2001.01.01: 00:00:00 UTC를 기준으로 한다. var now = Date() //현재 var yesterday..
[Swift] 접근 제어(Access Control)
❓접근 제어가 왜 필요할까? 코드의 세부 구현 내용을 숨기는 것이 가능해짐(객체지향 - 은닉화⭐️) 속성, 메서드를 숨길 수 있음. 코드의 영역을 분리시켜서, 효율적 관리 가능 컴파일 시간이 줄어듬(컴파일러가 변수의 사용범위를 인지가능)⭐️ 애플이 자신들이 원하는 코드를 감출 수 있음 ❓접근 제어를 가질 수 있는 요소 스위프트 공식문서 ==> 엔티티/ 독립된 개체 타입(클래스/구조체/열거형/스위프트 기본타입 등) 변수/속성 함수/메서드(서브스크립트, 생성자 포함) 프로토콜도 특정 영역으로 제한될 수 있음 ❓접근 수준(Access Levels) 1) open - 다른 모듈에서도 접근가능 / 상속 및 재정의도 가능 (제한 낮음) 2) public - 다른 모듈에서도 접근가능(상속/재정의불가) 3) inter..
[Swift] 옵셔널(Optional) ?
Swift가 가지고 있는 가장 큰 특징 중 하나가 옵셔널(Optional)이다. 값이 없는데 접근을 하면 어떻게 될까 만약 값이 없는데 값에 접근한다면 에러가 발생한다. 옵셔널은 직역하면 "선택적인"이라는 뜻이 되는데, 값이 있을 수도, 없을 수도 있다는 의미이다. 만약 문자열이 있다고 하면 "가나다"가 될것이다 만약 값이 없다고 하면 ""도 아닌 그저 값이 없다는 것이다. 이런 값 없음을 나타내는 게 바로 nil이다. nil: 값이 없음을 표현하는 키워드 값 없음을 표현하는 nil을 아무 변수에 사용할 수 있는것은 아니다. 옵셔널 변수에 사용해야 한다. 옵셔널 변수를 선언할 때에는 타입 어노테이션에 ? 를 붙여야 한다. 옵셔널로 선언된 변수와 옵셔널이 아닌 변수는 다르다. 옵셔널이 아닌 변수를 옵셔널 ..
[Swift] Result Type
💥 Result 타입 Swift5.0에서 추가된 Result Type는 새롭게 추가된 에러처리 방법이다. Result를 이해하기 위해선 열거형(Enum), 연관값(Associated Value), 제네릭(Generic)을 이해하고 있어야 한다. 에러가 발생하는 경우, 에러를 따로 외부로 던지는 것이 아니라 리턴타입 자체를 Result Type으로 구현해서 함수 실행의 성공과 실패 정보를 함께 담아서 리턴한다. 타입 하나에 정상적인 경우, 에러를 담을 수 있게 구현됨. 기존의 에러처리인 경우 불편한 점이 있다. 에러가 발생하는 경우와 정상적인 경우를 따로 처리해야하고, do catch블럭으로 감싸서 처리해야한다. ❓ Result타입의 구현 Result 타입은 열거형으로 구현되어있다. enum Result ..
[Swift] 에러처리(Error Handling)
Error(에러) 에러의 종류 컴파일 오류: 컴파일러가 코드가 잘못되었음을 알려준다(문법적 오류/에러) 런타임 오류 : 다양한 이유로 앱이 실행하는 동안 발생한다 ==> 앱이 꺼진다. 에러처리가 필요한 이유 런타임에러는 프로그램이 실행하는 동안 발생하며, 크래시(앱 강제 종료)가 발생한다. 서버와 통신하는 앱등을 만들 때 정보를 서버에 요청하고, 서버는 데이터를 보내준다. 실제 앱에서 데이터를 받아오지 못한다면 어떻게될까? 데이터를 요청하는 함수가 제대로 실행이 되었다면? 함수의 결과로 데이터를 가져올 것이다. 하지만 데이터를 제대로 가져오지 못해서 에러가 발생하면 ? 앱이 꺼질 수 있다. 그 이유론 수많은 이유가 있을 수 있다. 네트워킹오류, 서버다운이슈 등.. 수 많은 경우의 수가 있다. 그래서 앱이..
[Swift] ARC와 메모리누수(Memory Leak), weak, unowned
ARC란 자동으로 메모리 관리를 해주는 친구 객체에 대한 참조카운트를 관리하고 0이 되면 자동으로 메모리해제 메모리 누수가 발생할 수 있다. 옛날 Objective-C에선 MRC => 수동으로 관리 Compile time할때 실행된다. 과연 Compile time에 실행되는 ARC가 동적으로 할당되는 메모리의 refrence count를 하고 메모리관리를 어떻게할까? 사전에 알아야 할 지식은 MRC이다. MRC 엣날 objc에선 retain. release, sutorelease등을 통해 수동으로 메모리 관리를 했다. class Person{ let name: String init(name: String){ self.name = name } } let clamp = Person(name: "clamp")..