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가 여
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 는 런타임 환경에서 동작하면서 앱이 실행되는 동안 기본 저장소에 접근해 데이터를 기
CoreData Core Data는 iOS 및 macOS 애플리케이션에서 데이터 모델을 관리하고 지속적으로 저장하는 데 사용되는 애플에서 제공하는 프레임워크이다. (데이터베이스가 아니다!) UserDefaults보다 조금 더 복잡한 데이터를 영구적으로 저장하는데 적합하
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에서 가
MVVM 동작 흐름 사용자의 동작을 Input 전달받음 Command Pattern으로 ViewModel에 명령 ViewModel에서 Model에게 데이터를 요청 및 응답 응답받은 데이터를 ViewModel에서 가공 및 저장 Data Binding을 통해 ViewMod
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한다. 앱 시작 시 사용자에게 푸시 알림 권한을 요청한다. re
기존 에러 처리 기존의 에러처리 방식은 열거형을 선언하고, 해당 열거형의 케이스를 사용하여 에러를 정의한 후, 함수에서 에러를 던져주고 이후에는 do-catch 문을 사용하여 에러를 처리하는 방식이다. 기존 에러 처리 방식 이러한 에러처리의 단점은 열거형을 사용하여
WebView 웹 콘텐츠를 표시하고 상호작용할 수 있는 뷰를 의미한다. WebView를 사용하면 앱 내에서 웹 페이지를 로드하고 표시할 수 있고, 웹과 네이티브 앱 간의 상호작용이 가능하다. WebView 종류 및 구현방법 외부 사파리 뷰 단순히 앱에서 Safar
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 에
캐싱 캐싱은 재사용될 수 있는 자원을 특정 영역에 저장해놓는 것을 의미한다. 캐싱된 데이터가 있다면 추가적인 자원을 소모하지 않고 캐싱 데이터를 가져다 쓸 수 있기 때문에 자원을 절약할 수 있고 애플리케이션의 처리 속도가 향상된다. 이미지 캐싱 방법 메모리 캐싱 메모
SwiftData CRUD SwiftData를 공부하면서 아직 SwiftUI는 다뤄본 적이 없는데 대부분의 블로그 글들이 SwiftUI로 작성되어있었다. SwiftData가 SwiftUI와 자연스럽게 통합되기 때문인 것 같은데 아직 어떤 부분이 자연스럽게 통합된다는건
WebView, JS 양방향 통신 iOS 애플리케이션에서 WKWebView를 사용하면 웹 콘텐츠를 표시할 수 있을 뿐만 아니라, JavaScript와 네이티브 코드 간의 양방향 통신도 가능하다. 이를 통해 네이티브 코드와 웹 콘텐츠 간의 상호작용을 구현할 수 있다.
WebSocket 양방향 통신 웹소켓을 이용하면 웹브라우저와 서버간의 양방향 실시간 통신이 가능하다. 자세한건 해당 글을 참고하자! 웹소켓 WebSocket 구현 소켓 연결 소켓 연결 해제 메세지 보내기 메세지 받기
StarScream 라이브러리로 WebSocket 구현 StarScream은 WebSocket 클라이언트 라이브러리로 WebSocket 연결을 쉽게 설정하고, 메시지를 주고받으며, 연결 상태를 모니터링할 수 있는 기능을 제공한다. StarScream 구현 방법 Web
UIKit에서 SwiftUI 사용하기 UIKit 프로젝트에 SwiftUI 뷰를 추가하려면 SwiftUI 뷰를 포함할 수 있는 UIKit 컨트롤러인 UIHostingController를 사용하면 된다. UIViewController 에서 메소드 구현하기 SwiftUI
SwiftUI에서 UIKit 사용하기 SwiftUI 프로젝트에 UIKit 뷰를 추가하려면 UIViewControllerRepresentable 프로토콜을 사용하면 된다. UIViewRepresentable을 준수하는 struct 정의 makeUIView(conte
SocketIO 먼저 Socket.IO를 사용해서 웹소켓 연결을 설정하고 통신을 처리하는 코드를 살펴보자! SocketIO Version SocketIO 버전 변화를 살펴보자! Socket.IO 12.x 클라이언트 생성: 소켓 클라이언트를 직접 생성하고 관리했다.
Socket.IO Server Setting 서버를 어떻게 구축하는건지 Visual Studio도 안깔려있었지만 Node.js로 구축할 예정이다! 일단 하고보자! 우선, JavaScript란 웹 개발에서 가장 널리 사용되는 프로그래밍 언어 중 하나로 iOS로 따지면
RxSwift가 왜 생겼을까? 반응형 프로그래밍 기존에는 Completion Handler나 Delegate 패턴을 사용하여 비동기적인 작업을 처리했지만, 이러한 방식은 비동기 코드가 복잡해지고 중첩된 구조가 생길 수 있으며, 코드의 가독성과 유지보수성을 저하시킬 수
Observable Observable을 생성할 때 직접 Observable을 생성할 수도 있고, RxSwift의 sugar API를 사용해서 만들 수도 있다. 💡 Sugar API란? RxSwift에서 "Sugar API"는 코드의 간결성을 높이고 가독성을 향상
Subject Subject는 Observable과 Observer의 역할을 모두 수행할 수 있는 특별한 형태의 Observable로 데이터를 발행하고 구독할 수 있는 능력을 모두 가지고 있다. Observabel과 Subject의 차이 데이터 방출 시점 Observ
Socket.IO 데이터 통신 JavaScript로 서버를 구현하고, Swift로 클라이언트를 구현해서 Socket.IO를 이용해 데이터를 주고 받는 과정에서 엄청 고생을 했다. 그래서 서버와 클라이언트 간에 데이터를 주고받는 방법을 정리하려고 한다! String 타
Async & Await 기존의 비동기 작업을 실행할때 사용하던 completionHandler Closure는 코드의 흐름이 동기적이지 않아 읽기가 어렵고, 콜백이 중첩될때는 코드가 장황해지고, 호출을 잊을 수 있다는 단점이 있다. 이를 보완하고, 효율적으로 비동기
Unit Test Unit Test는 Unit(소프트웨어의 개별 구성 요소)이 예상대로 작동하는지 검증하는 테스트 방법이다. Swift에서는 XCTest 프레임워크를 사용하여 유닛 테스트를 작성할 수 있다. Unit Test의 원칙 First 테스트는 빨라야 한다. Independent 각각의 테스트가 서로 독립적으로 실행되어야 한다. Repeata...
TCP 통신 TCP(Transmission Control Protocol) 통신은 데이터 전송을 위한 프로토콜 중 하나로, 신뢰성 있는 연결형 통신을 제공한다. TCP 통신은 Swift에서는 Network 프레임워크, SwiftSocket, StarScream 라이브