iOS 53

Swift 문법과 친해지기 - MRC/MMR(Objective-C 잔재)

제목에서 보다시피 MRC/MMR은 과거 Objective-C에서 사용하던 메모리 관리 기법이다. ARC의 RC는 Reference Counting이지만 MRC의 RC는 Retain Counting이라고 한다. 소들이 님의 블로그를 보고 이해한 결과 TestClass *test = [[TestClass alloc] init]; 라고 선언을 하면 alloc을 통해 힙 영역에 자동적으로 할당이 되고 Retain Count는 1 증가한다. 그 후 TestClass *test2 = test; test2에 test 주소값을 복사하는 경우 Retain Count이 증가하지 않는다.!!!! 이런 것 때문에 수동 메모리 관리 기법이라고 한다.. Retain Count를 올려주기 위해 TestClass *test2 = t..

iOS/문법 2023.01.07

Swift 문법과 친해지기 - Strong, Weak, unowned, 순환 참조

Strong - 강한 참조 강한 참조는 인스턴스가 할당되고 RC가 증가하면 강한 참조라고 한다. default값이 강한 참조로 구성된다고 한다. 순환 참조 ARC의 단점으로 '순환 참조가 발생될 경우 영구적으로 메모리가 해제되지 않을 수 있다'가 있다. □ 순환 참조 예시 1 class Man { var name: String var girlfriend: Woman? init(name: String) { self.name = name } deinit { print("Man Deinit!") } } class Woman { var name: String var boyfriend: Man? init(name: String) { self.name = name } deinit { print("Woman Dein..

iOS/문법 2023.01.07

Swift 문법과 친해지기 - ARC(Automatic Reference Counting)

우리가 Swift를 사용할 때 인스턴스 클로저 등의 참조타입은 자동적으로 힙에 할당되어 사용되었다. class Human { var name: String? var age: Int? init(name: String?, age: Int?) { self.name = name self.age = age } } let sodeul = Human(name: "sodeul", age: 26) Human이라는 클래스를 우리가 인스턴스를 생성하고 초기화했을 때 다음과 같이 할당된다. 스택 영역에 먼저 지역 변수가 할당되고 실질적인 Human 클래스의 인스턴스들은 힙영역에 할당되게 된다. 스택 영역에 있는 지역 변수에는 힙영역의 인스턴스들의 주소값이 저장된다. 다른 언어에서 참조값을 다루어 보았다면 알다시피 다른 변수에..

iOS/문법 2023.01.07

Swift 문법과 친해지기 - 패턴

Swift 패턴에는 크게 두 가지가 존재한다. 어떤 종류의 값과 일치하는 패턴 어떤 종류의 값과 일치하지 않는 패턴 2가지 종류의 패턴들은 또 여러 가지 패턴으로 구분되어 있다. 어떤 종류의 값과 일치하는 패턴 와일드카드 패턴 식별자 패턴 값 바인딩 패턴 튜플 패턴 어떤 종류의 값과 일치하지 않는 패턴 열거형 케이스 패턴 옵셔널 패턴 타입 캐스팅 패턴 표현 패턴 어떤 종류의 값과 일치하는 패턴 단순 상수, 변수 및 옵셔널 바인딩에서 값을 소멸시키는 데 사용된다. 어노테이션을 지정하여 특정 유형과 일치하도록 제한을 둘 수 있다. 와일드카드 패턴 와일드카드 패턴은 모든 값을 일치시키고 무시하며 밑줄(_)로 구성된다. □ 와일드카드 패턴 예시 let hello = ("안녕","hi") switch hello{..

iOS/문법 2023.01.06

Swift 문법과 친해지기 - 제네릭

제네릭 타입에 의존하지 않는 범용 코드를 작성할 때 사용 제네릭 방법으로 코드를 작성하는 경우 같은 내용의 함수를 오버로딩할 필요 없이 한 번만 작성하여 사용할 수 있다. 제네릭 타입 제네릭은 함수뿐만 아니라 구조체, 클래스, 열거형 타입에도 선언하여 사용할 수 있다. 제네릭을 선언할 때 를 사용하여 선언한다. 제네릭을 이미 우리는 알게 모르게 사용했었다..! let array: Array = .init() swift에서는 배열이 바로 제네릭으로 구현되어 있다! 타입 제약 프로토콜 제약 만약 매개변수 2개를 받아서 반환하는 함수를 만들었을 때 func isSameValues(_ a: T, _ b: T) -> Bool { return a == b } 해당 함수는 오류를 발생시킨다. → 반환할 때 '=='연..

iOS/문법 2023.01.06

Swift 문법과 친해지기 - protocol

프로토콜 구조체, 클래스, 열거형은 프로토콜을 채택해서 특정 기능을 실행하기 위한 프로토콜의 요구사항을 실제로 구현할 수 있다. 스스로 기능을 구현하지 않는다. 하나의 타입으로 사용되기 때문에 다음과 같은 타입에서 사용가능 하다. 함수, 메소드, 이니셜라이저의 파라미터 타입, 상수, 변수, 프로퍼티 타입, 배열, 딕셔너리 원소 타입 간단히 말해 프로토콜은 해당 기능에 필요한 요구사항을 선언해두는 것이다. 다른 언어들의 인터페이스와 비슷한 개념 같다. □ 프로토콜 예시 protocol Band{ var drum: String {get set} var vocal: String {get set} var piano: String {get set} var guitar: String {get set} func pl..

iOS/문법 2023.01.04

Swift 문법과 친해지기 - Type Casting 와 Any, AnyObject

is is 연산자는 타입을 확인하는 연산자로 반환 값은 Bool 타입이다. □ 예시 class Human {} class Teacher: Human {} class Animal {} let teacher: Teacher = .init() teacher is Teacher// true teacher is Human//true teacher is Animal//false → is는 영어 문법 같은 느낌인 것 같다. → 해당 변수의 타입이 is 뒤에 오는 타입인 경우 true, 아닌 경우 false를 반환한다. as as 는 어떤 해당 Type으로 변경시킬 수 있는 문법 표현식이다. as를 사용하면 UpCasting, DownCasting을 사용하는데 UpCasting 업캐스팅은 예시를 들어서 살펴보면 조금 ..

iOS/문법 2023.01.04

Swift - Class vs Struct

Class, Struct의 공통점 값을 저장할 프로퍼티를 선언할 수 있다. 함수적 기능을 하는 메서드를 선언할 수 있다. 내부 값에 '.'을 사용하여 접근 가능하다. 생성자를 사용해 초기 상태를 설정할 수 있다. extension을 사용하여 기능을 확장할 수 있다. Protocol을 채택하여 기능을 설정할 수 있다. Class, Struct 차이점 Class 참조 타입 Heap 영역에 동적으로 할당돼서 Stack 영역보다 접근 속도가 느리다 Heap 영역은 스레드가 메모리를 공유하는 공간이기 때문에 스레드로부터 안전하지 않으므로 thread lock 기능이 필요하다 → 오버헤드 가능성 있음 같은 인스턴스를 여러 개의 변수에 할당한 뒤 값을 변경시키면 할당한 모든 변수에 영향을 준다. ARC로 메모리를 관..

iOS/Swift 상식 2022.12.31

Swift 문법과 친해지기 - Subscript

subscript 서브스크립트는 우리가 배열을 사용할 때 배열 속 원소에 접근하기 위해 사용하는 대괄호 []를 지칭한다. □ 배열 서브스크립트 정의 → index를 int타입으로 받고 Element를 반환한다. □ 딕셔너리 서브스크립트 정의 → key값을 input으로 받고 Value를 반환한다. 이를 이용해 서브스크립트를 입맛에 맞게 변형할 수 있다 서브스크립트 정의하기 subscript(index: Int) -> Int { get { } set(newValue) { } } → subscript 키워드로 작성하고 1개 이상의 매개변수 값과 반환 값을 지정 (생략 불가) → getter 혼자 사용은 가능 하지만, setter는 혼자 사용이 불가능하다. □ 배열 서브스크립트 사용해보기 let str = "..

iOS/문법 2022.12.31

Swift 문법과 친해지기 - 고차함수 (map, filter, reduce)

map map은 데이터를 변형하고자 할 때 사용한다. 기존 데이터를 입력으로 넣으면 새로운 컨테이너를 반환한다. □ 장점 for-in 구문과 큰 차이가 없지만 코드가 확 줄어든다는 장점이 있다. 재사용하기 용이하다 컴파일러 최적화 성능이 좋다. let numArray = [1,3,5,7,9] //for-in 사용 var multiArray2 = [Int]() for num in numArray{ multiArray2.append(num * 2) } // 원래 클로저 구문 let multiArray1 = numArray.map { (num: Int) -> Int in return num * 2 } // 축약시킨 버전 let multiArray = numArray.map { $0 * 2 } → for-in을..

iOS/문법 2022.12.26