각종 사이트, 대학 전공 강의자료를 정리해서 제작했습니다. Swift를 처음 공부하는 것이므로, 오류를 알려주시면 달게 받겠습니다 🙂 1. 동기, 비동기? 영어로는 각각 Synchronous, Asynchronous이다. 동기 정의 그대로 동시에 일어난다는 것. Request(요청) 생성시 Result를 반환할 때까지 다른 Request를 처리할 수 없음. 비동기 동기와 반대로, 동시에 일어나지 않음을 의미한다. Request 생성시 Result를 반환할 때까지 다른 Request를 처리할 수 있음. 대신에 동기보단 Request → Result를 획득하는 속도가 느림 2. 그래서 비동기 처리는 실제 어디에 쓰이는가? 많은 상황에서 비동기 처리 방식이 쓰인다. 간단한 실생활의 비유하자면 우리가 관심있는 ..
네트워크 통신의 이해 iOS에서 서버와의 통신과 처리 HTTP 프로토콜에 대한 이해 네트워킹 TCP / IP 프로토콜 여러가지 프로토콜의 결합 스위프트 내 프로토콜은 약속같은 느낌. 일상생활에서 와이파이를 잡을 수 있는 이유는 여러가지 약속(HTTP, IP, TCP…)의 조합을 통해서 사용할 수 있음. 앱을 만들기 위해 알아야 할 프로토콜은 HTTP 웹을 사용하기 위해선 (WWW를 구성하는 기술) → HTML, HTTP, URL HTTP 프로토콜 HyperText Transfer Protocol 하이퍼 문서를 전송하는 것에서 시작 현재는 이미지 / 영상 / 음성 / 파일 / JSON 등 모든 형태의 데이터 전송가능 인터넷의 모든 것은 HTTP로 이루어져 있음 TCP / IP 프로토콜 [4계층] 클라이언트..
메모리 구조 코드 우리가 만든 코드가 컴파일되어서 CPU가 실행될 수 있는 명령어 형태로 저장되어 있는 것 명령어 / 프로그램 앱(프로그램)의 모든 코드(Text) get-only, read-only (읽을 수만 있는 영역) 앱의 프로그램을 한번 짜면 그게 완성이 된 것 데이터 전역변수 / 타입(static/class) 변수 공통으로 공유하기 위한 데이터 앱이 실행되는 동안 불변 힙 동적할당 - 비어있는 메모리를 찾아서 할당하는 개념 일반적으로 오랫동안 긴시간 동안 저장 크기가 크고, 관리할 필요가 있는 데이터 개발자가 잘 관리해야함 스택 함수실행을 위한 임시적 공간 크기가 작고 빠르게 사용하기 위한 데이터 알아서 자동 관리됨 💡 Heap(힙) 영역에 할당되는 데이터는 관리를 해야지만, 메모리에서 해제가..
클로저의 메모리 구조 컴파일된 명령어의 주소가 힙에 저장됨. 클로저(함수)가 실제 실행되는 건, 스택프레임에서 동작 함수의 직접적인 실행은 스택프레임에서 실행된다. 클로저의 캡처 클로저의 Capturing Value 클로저 외부에 존재하는 stored 변수를 계속 사용해야 함 캡쳐현상이 발생하니 유의해서 써야함 클로저에서 저장할 필요가 있는 값을 캡쳐해서 (인스턴스와 비슷한 방식으로) 값을 저장 값을 저장 또는 참조를 저장 var stored = 0 let closure = { (number: Int) -> Int in // 클로저에서 stored의 주소를 가짐 stored += number return stored } closure(3) // stored : 3 closure(4) // stored :..
클로저 스위프트는 함수를 “일급객체”로 취급 함수는 타입이다. “함수”를 변수에 할당할 수 있음 함수를 호출할때, “함수”를 파라미터로 전달할 수 있음 함수에서 “함수”를 반환할 수 있음 기존의 함수의 형태와 클로저의 형태 비교 // 함수 정의 func aFunction(str: String) -> String { return "Hello, \(str)" } // 클로저의 형태 let _ = {(str: String) -> String in return "Hello, \(str)" } // 클로저의 형태 (타입 추론이 가능한 경우) // 타입이 결정된 거고 변수에 이를 할당하는 것 let _: (Int, Int) -> Int = {(a, b) in let result = a + b return resul..
Method Dispatch 클래스 / 프로토콜의 메서드가 실행되는 방식(Method Dispatch)에 대한 이해 공식문서에 나온 내용이 아닌 자료들을 통한 것이므로 무조건적인 신뢰는 하지 말 것 스위프트가 함수를 실행시키는 방법(3가지 방법을 모두 사용) 컴파일 타입 - [Direct/Static Dispatch] 컴파일 시점에 코드 자체에 함수의 메모리 주소 삽입 또는 함수의 명령 코드를 해당 위치에 코드를 심음(in-line) 가장 빠름 값 타입(구조체/열거형)에 사용 상속 / 다형성의 장점을 누릴 수 없음 런타임 - [Table Dispatch] , [Message Dispatch] Table Dispatch 함수의 포인터를 배열형태로 보관 후에 실행 중간 속도 클래스(Virtual Table)..
프로토콜의 상속 프로토콜도 상속이 가능 / 다중 상속이 가능 여러가지 요구사항의 나열일뿐 import UIKit protocol Remote { func turnOn() func turnOff() } protocol AirConRemote { func Up() func Down() } protocol SuperRemoteProtocol: Remote, AirConRemote { // 프로토콜끼리, 상속 구조를 만드는 것이 가능 // 자동으로 상위 프로토콜 메서드가 정의 // func turnOn() // func turnOff() // func Up() // func Down() func doSomething() } // 프로토콜의 채택 및 구현 class HomePot: SuperRemoteProtoc..
프로토콜(Protocol: 규약 / 협약) 클래스와 상속의 단점 하나의 클래스만 상속 가능(다중 상속 불가능) 기본적인 상위클래스의 메모리 구조를 따라갈 수 밖에 없음 필요하지 않은 속성/메서드도 상속됨 클래스(레퍼런스 타입)에서만 가능 자격증의 개념이라고 생각하기 프로토콜의 도입 // 요구사항을 정의 (자격증의 필수 능력만 정의) protocol SomeProtocol { func playPiano() } // 채택 및 구현 // 구조체에서의 채택 struct MyStruct: SomeProtocol { func playPiano() { //code } // 이제 자격증의 능력이 생긴 것 } // 클래스에서 채택 class MyClass: SomeProtocol { // Aclass 상속 시 -> Ac..
확장(Extension) 상속과 확장의 비교 상속 : 클래스만 가능 [수직 확장] 본질적으로 성격이 비슷한 타입을 새로 만들어 데이터를(저장속성)를 추가하거나 기능(메서드)를 변형시켜서 사용하려는 것 확장 : 클래스/구조체/열거형 모두 가능 추가적으로 메서드를 끼워넣기 [수평 확장] 현재 존재하는 타입에 기능(메서드)을 추가하여 사용 메서드 종류만 추가 가능. 추가 메모리 공간이 필요한 저장 속성을 확장하는 것은 불가 → 붕어빵 틀에 별개의 영역에 추가로 붙여넣는다고 생각하기!(Direct Dispatch) Student 클래스 저장 속성 + play () ( 기존 메서드 재정의 불가 ) id name student id 메서드 walk() -1 study() 장점 원본 소스 코드에 대한 액세스 권한이없..
타입캐스팅(Type Casting) 인스턴스 타입을 검사 인스턴스 사용시에 어떤 타입으로 사용할지(속성/메서드) 메모리구조에 대한 힌트를 변경하는 것 메모리의 값을 수정하는 것이 아님 단순히 해당 타입의 인스턴스인 것처럼 취급하려는 목적 is연산자 타입을 체크하는 연산자 이항연산자 참이면 true, 거짓이면 false 리턴 상속관계의 계층에서 포함관계를 생각해보면 쉬움. 상속 : 기본적으로 데이터(저장 속성)를 추가하는 관점에서 생각 Person() --> (true) --> String print("Index - \(index): 클로저 타입입니다.") default: print("Index - \(index): 그 이외의 타입입니다.") } } 옵셔널값의 Any 반환 의도적인 옵셔널값의 사용 Any는..