Cocoa touch Framework UIKit / Foundation / CoreData / MapKit / CoreAnimation 등을 포함하고 있는 iOS 개발환경을 구축하기 위한 최상위 Framework > Cocoa Touch Framework 계층구조
UI View 화면의 직사각형 영역에 대한 내용을 관리하는 객체, UI를 구성하는데 사용되는 객체 화면에 보이는 모든 요소들의 기본 클래스 UIButton UILabel UIImageView UIWebView UIScrollView 등 아래와 같이 여러 UI컴포넌트
💡 IB : Interface Bulider의 줄임말 @IBAction 함수 형태로 storyboard와 viewController를 연결하여 해당 UI컴포넌트의 동작을 정의한다. 즉 IBAction은 Interface Builder를 통해 받아온 정보로 Actio
[ UILabel ] 하나 이상의 정보 텍스트 줄을 표시하는 View. 쉽게말해 어떤 텍스트 정보를 표시할때 간단하게 쓸 수 있는 것이다.
UITabelView 테이블 관리를 전문으로 하는 뷰 컨트롤러 테이블을 보여주고 관리할 수 있는 컨트롤러이다. ios의 UITableView는 UIScrollView를 상속받아 스크롤이 가능하다. 하나의 열에 세로로 행들을 표시하거나, 관련된 행끼리 섹션형태로 그룹화
TableViewCell 커스터마이징 레이아웃 설정 스토리보드를 통해 ViewController에 TableView를 추가하고, TableViewCell에 ImageView, Label, Switch를 넣었다. cell의 identifier를 "myCell"로 설정했
Swift에서 마지막 요소를 지우는 방법 1. dropLast() 마지막 요소를 제외한 나머지 요소의 시퀀스를 반환한다. 2. popLast() 컬렉션의 마지막 요소를 제거하고 반환한다. 3. removeLast() 컬렉션의 마지막 요소를 제거하고 반환한다. 예
ViewController 간 데이터를 주고받는 방법 직접 프로퍼티에 접근 함수를 통한 접근 Segue Delegate Closure NotificationCenter 💡 1~3번의 방법들은 다른 ViewController에 직접적으로 의존하게 되므로 강한 결합이
음악 재생 하는 법 1. 음원 파일을 프로젝트 폴더에 저장한다. 2. import AVFoudation 오디오 플레이에 사용하고 볼륨, 속도, 반복등을 제어할 수 있는 기능, 여러 사운드를 동시에 재생할 수 있는 기능을 제공한다. 3. audioPlayer 인스턴
Segue Segue란 스토리보드에서 앱의 인터페이스 흐름을 나타내는 객체다. 쉽게 이야기 하면 스토리보드에서 뷰 컨트롤러 간의 이동을 나타내는 화살표를 추상화시킨 것이다. 1. 인터페이스 빌더에서 직접 연결시키는 방법 기존에 생성되어있는 한개의 뷰 컨트롤러와 (F
CGPoint 2차원 좌표계의 점을 포함하는 구조체이다. 쉽게 말해 x축, y축에 (1,2) 이면 1은 x좌표, 2는 y좌표이다. 코드상 CGPoint CGSize 너비와 높이 값을 포함하는 구조체이다. (CGSize도 사각형으로 나타내서 CGRect와 헷갈리지만
메모리 구조 프로그램이 실행되면 운영체제(OS)는 메모리(RAM)에 프로그램을 위한 공간을 할당한다. 그 공간은 총 4가지 Code, Data, Heap, Stack으로 나뉘어져 있다. Code 작성한 소스 코드가 기계어 형태(0,1로 구성)로 저장된다. CPU가 여기에 저장된 명령어를 하나씩 가져가 처리한다. 중간에 코드가 변경되지 않도록 Read-On...
ARC(Automatic Reference Counting) ARC: Swift에서 자동으로 메모리를 관리해주는 방식, 힙에 할당된 인스턴스의 레퍼런스 카운트(Reference Counts)가 0이 되면 더이상 참조되지 않는다고 판단하고 메모리를 해제시킨다. 참조 타
Design Pattern 💡 Pattern이 왜 필요한가? 디자인 패턴은 건축으로치면 공법에 해당하는 것으로 소프트웨어의 개발 방법을 공식화 한 것이다. 소수의 뛰어난 엔지니어가 해결한 문제를 다수의 엔지니어들이 처리 할 수 있도록 한 규칙이면서, 구현자들 간의 커
앱의 생명주기 (Life Cycle) 생명주기 앱의 최초 실행부터 앱이 완전히 종료되기까지 앱이 가지는 상태와 그 상태들 사이의 전이를 뜻한다. 앱의 상태는 앱이 현재 어떠한 것을 할 수 있는가를 결정한다. 앱의 생명주기 앱의 실행/종료 및 앱이 foreground
iOS12 이전의 AppDelegate iOS12 이전까지는 하나의 앱에 하나의 window를 갖고 AppDelegate 내에서 App Life Cycle, UI Life Cycle을 모두 담당했다. Process Life Cycle: Process 상태 UI Life
UserDefaults 앱에서 사용되거나 필요한 데이터를 영구적으로 보관하는 방법에는 네트워크 서버 이용, CoreData, UserDefaults 등이 있다. UserDefaults 는 런타임 환경에서 동작하면서 앱이 실행되는 동안 기본 저장소에 접근해 데이터를 기록하고, 검색하기 위한 인터페이스를 제공하는 iOS 및 macOS 프레임워크에서 제공하는 ...
CoreData Core Data는 iOS 및 macOS 애플리케이션에서 데이터 모델을 관리하고 지속적으로 저장하는 데 사용되는 애플에서 제공하는 프레임워크이다. (데이터베이스가 아니다!) UserDefaults보다 조금 더 복잡한 데이터를 영구적으로 저장하는데 적합하다. CoreData의 기능 영속성(Persistence) 변경사항의 Undo, Redo...
CoreData 사용하기 1️⃣ Xcode에 Create New Project를 할 때 Storage에 Core Data를 선택해서 생성한다. 기존에 존재하던 프로젝트는 cmd+n 단축키로 Data Model만 추가하면 된다. 그러면 이렇게 파일이 생성된다. 2️
MVVM Model View ViewModel Model: 앱에서 사용되는 Data와 그 데이터를 처리하는 Logic을 포함 View: 사용자에게 보여지는 화면(User Interface)을 구성 ViewModel: View에서 띄우고 싶은 정보만 Model에서 가져오고, View에서 사용자가 업데이트한 정보가 있다면 그것을 Model에 전달, View...
MVVM 동작 흐름 사용자의 동작을 Input 전달받음 Command Pattern으로 ViewModel에 명령 ViewModel에서 Model에게 데이터를 요청 및 응답 응답받은 데이터를 ViewModel에서 가공 및 저장 Data Binding을 통해 ViewModel 값이 변하면, View도 자동으로 업데이트 Data Binding View -> V...
MVVM 패턴으로 앱을 구현하면서 의존성 주입을 위해 init 생성자를 사용하려고 하는데 UIViewController의 하위 클래스에서 init(coder:) 필수 초기화 메서드를 구현해야 한다는 에러가 발생했다. required init 필수 생성자로, 슈퍼 클래
MVVM 패턴으로 앱을 구현하면서 의존성 주입을 위해 init 생성자를 사용하려고 하는데 UIViewController의 하위 클래스에서 init(coder:) 필수 초기화 메서드를 구현해야 한다는 에러가 발생했다. required init 필수 생성자로, 슈퍼 클래스에서 정의해둘 경우 서브 클래스가 슈퍼 클래스의 생성자를 상속받지 않는 한 서브클래스에서...
지난 글에 에러가 발생했을 때 알아본 것 처럼 required init이란 스토리보드나 xib파일로 뷰를 그렸을때 호출되는 이니셜라이즈로, 코드로 UI를 그렸을때 이 이니셜라이즈가 호출되면 즉시 종료하겠다는 의미로 fatalError를 사용했다.<span styl
데이터 저장 방법 iOS에는 앱에 데이터를 저장하기 위한 여러가지 방법들이 있다. 각 방법마다 사용하기 좋은 상황들이 다르기 때문에 어떤 데이터를 저장하고 싶냐에 따라 적절한 기술을 선택해야 한다. UserDefaults 사용자가 라이트모드를 선호하는지 다크모드를 선
텍스트로 꼼꼼하게 읽어야 직성에 풀리는 지독한 문과인 나는 iOS도 끝내버리겠어!! 라는 각오로 책을 샀다. 정리를 안해두면 나중에 많이 생각이 안나기 때문에 내가 보기 위해 편하게 개념을 정리해두려고 한다. (하지만 절대 안끝난다는 것을 알고 있다. 그 점이 좋아서
화면 전환 뷰를 이용한 화면 전환 하나의 뷰컨트롤러 안에 두개의 루트뷰를 준비한 다음 상태에 따라 뷰를 적절히 교체해준다. 필요에 따라 뷰를 완전히 바꿔치기 할 수도 있고 단순히 기존 뷰 위에 다른 뷰를 덮어 가려지게만 할 수도 있다. 그러나 이 방법은 하나의 뷰컨트롤
뷰컨트롤러간의 데이터 전달 직접 전달 방식 (동기 방식) 뷰컨트롤러에서 값을 직접 전달하는 방식 주로 영속적으로 값을 저장할 필요가 없는 화면 전환에서 사용한다. 데이터 전달 방법 간접 전달 방식 (비동기 방식) 저장소 사용, 주로 지속적으로 값을 저장할 필요가 있는 화면 전환에서 사용된다. 화면 전환은 빠르고 네트워크는 그보다 느리기 때문에 저장소에 ...
네트워크 통신의 종류 소켓 방식의 연결성 통신 보통 저수준 통신을 구하여 구현한다. 전구가 결합하는 소켓의 개념을 따온 소켓 방식의 연결은 일단 앱과 서버가 연결되면 한쪽에서 명시적으로 끊을 때까지 지속해서 연결을 유지하는 방식이다. 연결이 이루어진 단계, 연결이 유지
HashTable key : Value 쌍을 저장하는 데 사용되는 데이터 구조이다. 딕셔너리도 HashTable의 일종이므로 딕셔너리를 생각하면 된다. HashTable은 내부적으로는 배열로 이용해 저장하며 Key값에 해시함수를 적용해 저장할 인덱스를 결정하고 Key를
Equatable Equatable 프로토콜은 Swift에서 프로토콜로, 해당 프로토콜을 채택한 유형은 == != 연산자를 사용하여 두 인스턴스 간의 동등성을 확인할 수 있다. 예시 Int나 String 같은 기본자료형은 Equatable이란 프로토콜이 이미 채택되어
여러 데이터를 관리하고 커스텀 가능한 레이아웃을 사용해서 사용자에게 보여줄 수 있는 객체UITableView처럼 UIScrollView를 상속받는다.컬렉션뷰는 테이블뷰와 마찬가지로, UICollectionViewCell을 사용하여 데이터를 화면에 표현한다. 그 외에 S
UserNotification UserNotification을 이용하면 로컬 및 원격 푸시 알림을 관리할 수 있다. UserNotification 사용방법 UserNotifications을 import한다. 앱 시작 시 사용자에게 푸시 알림 권한을 요청한다. requestAuthorization 메소드의 completionHandler에 권한 허용 여...
기존 에러 처리 기존의 에러처리 방식은 열거형을 선언하고, 해당 열거형의 케이스를 사용하여 에러를 정의한 후, 함수에서 에러를 던져주고 이후에는 do-catch 문을 사용하여 에러를 처리하는 방식이다. 기존 에러 처리 방식 이러한 에러처리의 단점은 열거형을 사용하여
WebView 웹 콘텐츠를 표시하고 상호작용할 수 있는 뷰를 의미한다. WebView를 사용하면 앱 내에서 웹 페이지를 로드하고 표시할 수 있고, 웹과 네이티브 앱 간의 상호작용이 가능하다. WebView 종류 및 구현방법 외부 사파리 뷰 단순히 앱에서 Safari를 열어 웹 페이지를 표시하는 방식으로 매우 간단하다. 이 방법은 사용자에게 익숙한 Sa...
Compositional Layout CollectionView Compositional Layout은 item, group, section, layout으로 구성된다. Item > Group > Section 순서로 각 요소들의 크기와 위치를 정의하고 지정하여 Com
Compositional Layout CollectionView 사용하기 섹션을 정의한다. 컬렉션뷰를 생성하고 사용할 셀과 헤더뷰를 등록해준다. 레이아웃을 설정한다. DataSource를 설정한다.
Diffable Data Source WWDC 2019 > Advances in UI Data Source 에서 소개되었고, iOS 13부터 사용 가능하다. 그리고 WWDC 2021 > Make blazing fast lists and collection views 에
캐싱 캐싱은 재사용될 수 있는 자원을 특정 영역에 저장해놓는 것을 의미한다. 캐싱된 데이터가 있다면 추가적인 자원을 소모하지 않고 캐싱 데이터를 가져다 쓸 수 있기 때문에 자원을 절약할 수 있고 애플리케이션의 처리 속도가 향상된다. 이미지 캐싱 방법 메모리 캐싱 메모리 캐시는 휘발성 메모리(RAM)에 데이터를 저장하여 빠른 접근이 가능하지만, 앱이 종료되...
SwiftData CRUD SwiftData를 공부하면서 아직 SwiftUI는 다뤄본 적이 없는데 대부분의 블로그 글들이 SwiftUI로 작성되어있었다. SwiftData가 SwiftUI와 자연스럽게 통합되기 때문인 것 같은데 아직 어떤 부분이 자연스럽게 통합된다는건
WebView, JS 양방향 통신 iOS 애플리케이션에서 WKWebView를 사용하면 웹 콘텐츠를 표시할 수 있을 뿐만 아니라, JavaScript와 네이티브 코드 간의 양방향 통신도 가능하다. 이를 통해 네이티브 코드와 웹 콘텐츠 간의 상호작용을 구현할 수 있다. 네이티브 -> JavaScript evaluateJavaScript 메서드 iOS에서 e...
WebSocket 양방향 통신 웹소켓을 이용하면 웹브라우저와 서버간의 양방향 실시간 통신이 가능하다. 자세한건 해당 글을 참고하자! 웹소켓 WebSocket 구현 소켓 연결 소켓 연결 해제 메세지 보내기 메세지 받기
StarScream 라이브러리로 WebSocket 구현 StarScream은 WebSocket 클라이언트 라이브러리로 WebSocket 연결을 쉽게 설정하고, 메시지를 주고받으며, 연결 상태를 모니터링할 수 있는 기능을 제공한다. StarScream 구현 방법 WebSocket 연결 Swift Packagr Manager로 라이브러리 설치 후, StarS...
UIKit에서 SwiftUI 사용하기 UIKit 프로젝트에 SwiftUI 뷰를 추가하려면 SwiftUI 뷰를 포함할 수 있는 UIKit 컨트롤러인 UIHostingController를 사용하면 된다. UIViewController 에서 메소드 구현하기 SwiftUI
SocketIO 먼저 Socket.IO를 사용해서 웹소켓 연결을 설정하고 통신을 처리하는 코드를 살펴보자! SocketIO Version SocketIO 버전 변화를 살펴보자! Socket.IO 12.x 클라이언트 생성: 소켓 클라이언트를 직접 생성하고 관리했다. 네임스페이스: 각 클라이언트는 고유의 엔진을 가졌고, 네임스페이스를 사용하기 위해 여러 개...