All
28 posts
<C++/백준 16637> 괄호 추가하기

괄호 추가하기 📌 문제 패턴 인식 연산자가 등장할 때마다 2가지 선택(괄호 유무)이 가능하고, 이전까지의 계산 결과를 기반으로 다음 선택을 해야 하는 유형 🔍 특징 수식에서 ”누적되는 값 + 다음 선택” 형태 psum(prefix_sum, 누적합 문제!) 괄호 위치 결정 문제 매 시점 2가지 선택 가능 💡 핵심 아이디어 1. 누적값 + 방향 결정 지금까지의 계산 결과를 가지고 다음에 어떤 연산을 할지 결정! 형태로 구현 2. 매 시점 2가지 선택 괄호 없이 그냥 계산 다음 두 수를 묶어서 계산 (인덱스 주의) 🔨 코드 구현 기본 뼈대 주요 자료구조 🎯 문제 해결 접근법 1. 첫 번째 단계 “누적값 + 선택” 패턴 인식하기 형태 떠올리기 2. 두 번째 단계 매 위치에서 가능한 선택지 정리 재귀로 모든 경우 탐색 👀 비슷한 문제 패턴 수식 계산 + 괄호 추가/삭제 매 시점 2가지 이상 선택지 이전 결과로 다음 선택하는 경우 📝 예시 입출력 ⚠️ 주의사항…

<C++/백준 1992> 쿼드트리

코드 해당 문제의 솔루션은 주석과 함께 정리해보았다. 해당 문제를 보고, 내가 특히 부족하다고 느낀 점은. 크게 두 가지다. 이 문제를 이해하는 데 꽤 시간이 걸렸다는 것. ( 이 시간을 단축시켜야 한다. ) 문제를 이해하고 규칙도 파악했으나, 그것을 코드로 표현하지 못했다. ( 재귀 함수를 구현하는 데 아직 경험이 부족해서 이다. ) 해당 문제를 보면, ‘재귀 함수’로 풀어야지가 떠올라야 한다. 큰 문제를 동일한 형태의 작은 문제로 나눌 수 있다는 점이 재귀의 특징이다. 파라미터를 변화시키면서, (4등분으로 나누는 패턴을 반복시킬 수 있다.) 재귀 함수 구현력을 향상 시키고, 해당 문제와 비슷한 문제를 반복 연습하자! 그러면 비슷한 문제가 와도 어렵지 않게 해결할 수 있을 것이다.

<코드트리/C++> 그 요일은

문제 설명 2024년은 윤년입니다. m1월 d1일이 월요일일 때, m2월 d2일까지 특정 요일 A가 몇 번 등장하는지 구하는 문제입니다. 입력 조건 첫 번째 줄: m1, d1, m2, d2 (공백으로 구분) 두 번째 줄: A (요일 문자열) 1 ≤ m1 ≤ m2 ≤ 12 1 ≤ d1, d2 ≤ 31 A는 , , , , , , 중 하나 출력 조건 A 요일이 등장하는 횟수 풀이 접근 💡 Key Insight 소스 코드 주요 학습 포인트 날짜 계산의 기본 월별 일수를 배열로 관리 누적 일수 계산 방법 요일 처리 요일의 숫자 표현 (0-6) 모듈러 연산을 통한 요일 순환 자료구조 선택 작은 크기의 고정 데이터는 단순 if-else가 효율적 unordered_map 같은 복잡한 자료구조는 불필요 코드 구조화 기능별 함수 분리 명확한 변수명 사용 개선 가능 사항 ans를 전역 변수로 선언하는 대신 지역 변수로 사용 요일 변환 함수를 switch-case 문으로 변경하여 가독성 향상 날짜 유…

<코드트리/C++> 만나는 그 순간

약 10일 전 쯤 내가 풀었던 문제 같은데, 다시 보니까 못풀고 있어서, 여기에 다시 정리해보았다. [시뮬레이션] 만나는 그 순간 💡 문제 이해 두 사람 A, B가 동일한 시작점에서 출발하여 각자의 이동 명령(L 또는 R)에 따라 1초에 1m씩 움직일 때, 최초로 만나는 시간을 구하는 문제입니다. 🤔 문제 해결 방향 A와 B 각각의 매 초별 위치를 배열에 기록합니다. 시간을 1초부터 검사하면서, A와 B의 위치가 일치하는 최초의 시점을 찾습니다. 주의할 점 전체 이동 시간이 큰 배열을 필요로 할 수 있습니다. (MAX_T = 1000000) A와 B의 시작 위치는 0으로 초기화되어야 합니다. 만약 움직임이 끝날 때까지 만나지 않으면 -1을 출력해야 합니다. ✍️ 코드 내 코드 해설 코드 🔎 코드 비교 분석 두 코드는 동일한 아이디어로 구현되었으나, 몇 가지 구현 방식의 차이가 있습니다: 시간 관리 방식 내 코드: 변수로 누적 시간 관리 해설 코드: , 변수로 개별 시간 관리 반복…

<알고리즘 노트> dx, dy 테크닉 기법

dx, dy 테크닉 기법 은 격자 문제나 방향 시뮬레이션 문제를 풀 때 유용하게 사용되는 기법. 방향 전환, 인덱스 고려 등을 추가로 신경 써야 하는 경우도 있다. 기본 개념 방향이 , 배열의 인덱스가 됨. 문제를 보면 먼저 격자나 그래프를 간단히 그림으로 그려보고, 각 방향에 맞는 x, y 증감값을 설정. 예시 문제 풀이 순서 , 배열을 먼저 작성. 문제의 요구사항에 맞게 방향과 이동을 구현. 방향 전환 방향 전환은 변수로 관리. 반시계 방향 90도 회전 시계 방향 90도 회전 격자 문제에서의 주의점 , 테크닉 활용하기. 인덱스가 0부터 시작인지, 1부터 시작인지 확인. 격자에서의 는 2차원 배열의 와 동일. 각각을 행(row, r), **열(column, c)**로 생각. 그림을 그려 , 를 구성. 예시: 동서남북 인덱스 범위 오류 주의! 가 격자 안에 있는지 확인하는 bool 함수 설계. 조건문에서 함수 순서를 신경 쓰기: 범위 확인 함수 예시

<알고리즘 노트> Carry 피하기 2

알고리즘 노트: Carry 피하기 2 문제 설명 문제 유형: 완전탐색 n개의 숫자 중 서로 다른 3개의 숫자를 선택하여, carry가 발생하지 않으면서 나올 수 있는 숫자 합의 최댓값을 계산하는 프로그램을 작성합니다. Carry란? 각 자리수를 더했을 때 10을 넘어가는 경우 carry가 발생합니다. 예를 들어: 3 + 6 = 9 (carry 발생하지 않음) 5 + 7 = 12 (carry 발생) 입력 형식 첫 번째 줄에 n이 주어집니다. 두 번째 줄부터 n개의 줄에 숫자가 주어집니다. 3 ≤ n ≤ 20 1 ≤ 숫자의 범위 ≤ 10,000 출력 형식 carry가 발생하지 않으면서 3개의 숫자의 합의 최댓값을 출력합니다. 모든 숫자쌍에서 carry가 발생할 경우 을 출력합니다. 예제 입력 출력 설명 522, 6, 7311을 선택하면, 각 자리수의 합에서 carry가 발생하지 않으므로 합은 7839입니다. 내 풀이 코드 풀이 설명 숫자를 으로 변환하여 각 자리수를 비교. 세 숫자의 …

Linked List

단일 연결 리스트(Singly Linked List) 1. 연결 리스트란? 연결 리스트: 여러 노드가 모여 만들어진 자료구조. 단일 연결 리스트: 연결 방향이 단방향으로 고정된 구조. (마치 일방통행 도로처럼) 노드: 데이터()와 다른 노드의 참조()를 포함. 2. 단일 연결 리스트의 구조 단일 연결 리스트의 노드는 다음과 같은 구조를 가집니다: : 저장할 값. : 다음 노드의 위치를 가리킴. 리스트의 끝에서는 가 null로 설정됩니다. 구조 예시 3. 단일 연결 리스트의 노드 생성 3.1 새로운 노드 생성 새로운 노드는 다음과 같이 생성할 수 있습니다: 혹은 데이터를 나중에 추가하는 방식으로 생성할 수도 있습니다: 3.2 노드 연결 새로운 노드를 생성합니다: 기존 노드와 새 노드를 연결합니다: 3.3 연결된 노드의 접근 는 를 가리킵니다. 따라서 다음과 같이 출력할 수 있습니다: 3.4 노드 연결 해제 노드 간 연결을 끊으려면 에 null을 설정합니다: 4. 시작점과 종료점 4.…

UI/UX 기반 개인정보보호 실무

개인정보 교육 보고서 1. 개인정보 보호의 어려움 Quiz 1 개인정보 약관: X 개인정보 처리 방침: O [개인정보보호법] 위치정보 이용약관: O [위치정보법] Quiz 2 개인정보 필수 수집항목은 고객의 사전 동의 없이 수집 가능하다. 답: O 개정된 개인정보보호법에 따르면, 서비스 제공에 필요한 필수 개인정보는 고객의 사전 동의 없이도 수집할 수 있습니다. 단, 개인정보 처리 방침에 이 사실을 고지해야 합니다. Quiz 3 1년 동안 미접속한 휴면회원은 별도로 관리해야 한다. 답: X 2. 개인정보 해당 사례 지하철 이용 정보 블랙박스 영상 주민등록번호 연계정보(CI) 3. 개인신용정보 [신용정보법] 거래 상대방의 신용도를 판단하는 데 필요한 개인에 관한 정보로, 예를 들면 연락처나 금융거래 기록 등이 있습니다. 개인정보보호법과 신용정보법이 상충할 경우, 신용정보법이 우선 적용됩니다. Quiz 회사 건물 출입기록은 개인정보에 해당하는가? 답: O 출입 기록은 개인을 식별할 수…

Swift - Firebase 사용하기 (1)

Firebase Authentication Firebase 사이트에서 프로젝트를 만들고, 해당 프로젝트에서 iOS 앱을 만들고 GoogleService-Info.plist 파일을 추가 그리고 Firestore configure 코드(초기화 코드)까지 추가한 상태이다. 서버 백엔드를 따로 구축한다고 해도, Firebase Authentication은 따로 쓰는 것도 괜찮다. 왜냐하면 Firebase Authentication은 따로 만드는 것보다 더 간편하고 효율적이기 때문이다. Firebase auth 에서 볼 수 있듯이 인증 한도도 일일 활성사용자량 3000명 정도로, 초기 앱에 사용하기에는 괜찮은 편이다. 사용자의 인증 상태를 관리하는 AuthViewModel 코드를 살펴보자. listenToAuthState 라는 함수를 호출 시 addStateDidChangeListener 를 통해 파이어베이스 서버로부터 인증 상태를 계속 관리할 수 있다. 사용자의 인증 상태가 변경될 때마다…

JavaScript 복습

자바스크립트 기초 공부를 다시 하면서 한번 더 짚고 가볼만한 부분만 정리해보았다. add() vs add add()는 함수를 즉시 호출하는 것이고, add는 함수의 이름만 전달하는 것이다. add는 함수를 바로 실행하고 싶지 않을 때, 예를 들어 일부 이벤트가 발생할 때 그 때 실행시키고 싶을 때가 있다. 이럴 때는 함수를 직접 호출하는 add() 대신에, add를 제공하도록 한다. 그런데 아래와 같이 쓰게 되면, 이벤트 리스너를 등록하는 즉시 (스크립트를 읽었을 때) 함수를 실행하기 때문에. 잘못된 코드이다. 그리고, 만약 아래와 같이 코드 어딘가에 add를 추가하는 것도 잘못되었다.(그냥 . 이 문장이 무시가 됨) 그 add 함수 이름으로 무엇을 해야하는지. (이벤트 리스너) 와 같은 곳에 추가하는 것이 일반적이다. 숫자 & 문자열 섞기 3 + ‘3’ = ‘33’ 이는 ’+’ 연산자가 문자열에도 적용하기 때문. 참고로, ‘hi’ - ‘i’ = Nan js에서는 ’+’ 연산자를 …

Server Side Swift

Swift 의 ARC 와 GC(가비지 컬렉터)의 차이점 Swift의 ARC(Automatic Reference Counting)와 GC(Garbage Collection)는 메모리 관리를 자동화하는 두 가지 다른 방식입니다. 이 두 시스템은 프로그램이 더 이상 필요하지 않은 메모리를 자동으로 회수하여 메모리 누수를 방지하고 성능을 최적화합니다. 그러나 그 구현 방식과 동작 원리가 다릅니다. Swift ARC(Automatic Reference Counting) 1. 동작 방식: 2. 장점: 3. 단점: GC(Garbage Collection) 1. 동작 방식: 2. 장점: 3. 단점: 요약 이 두 메모리 관리 방식은 각각의 장단점이 있으므로, 애플리케이션의 요구 사항에 따라 적합한 방식을 선택하는 것이 중요합니다. Swift Vapor Init Example Project Initialize Model property wrapper _ @ID 는 Model 프로토콜에서 id 프로퍼…

Dictionary - init(grouping:by:)

init(grouping:by:) func groupMenuByCategory(_ menu: [MenuItem]) -> [MenuSection] { if menu.isEmpty { return [] } return Dictionary(grouping: menu, by: { $0.category }) .map { key, value in MenuSection(category: key, items: value) } .sorted { $0.category > $1.category } } 이 함수는 MenuItem 배열을 받아서 카테고리별로 그룹화하고, 각 그룹을 MenuSection 배열로 변환합니다. 각 단계는 다음과 같습니다: 빈 배열 검사: if menu.isEmpty { return [] } 메뉴가 비어 있는 경우, 빈 배열을 반환합니다. 그룹화: Dictionary(grouping: menu, by: { $0.category }) 메뉴 항목을 category 기준으로 그룹화합니…

Test Driven Development (테스트 주도 개발)

테스트 주도 개발 테스트 사용자에게 제공되기 전에 소프트웨어의 품질, 성능 등을 확립하기 위한 절차 수동 테스트의 비효율성 제품이 출시될 때 실제로 필요한 코드가 아닌 코드를 만들어야 하는 경우. 자동화된 테스트 소프트웨어로 다른 소프트웨어를 자동화 테스트 주도 개발 (Test Driven Development) 테스트 코드를 먼저 만들어놓고, 테스트하기 쉬운 소프트웨어 설계 예를 들어 개발자가 아닌 기획자도 경우의 수, 요구사항을 먼저 다 정의해놓고 시작. 필요한 모델을 먼저 구상 거기에 필요한 것을 하나씩 채워가며 ‘테스트’ 특징 단, 높은 응집력과 낮은 결합도를 가진 컴포넌트로 구성된 소프트웨어를 구축하게 됨 요구사항에 대한 이해도 향상에 도움이 됨 구현이 완료된 후 테스트를 작성하는 것보다 먼저 작성하는 것이 더 좋은데, 해당 동작에 대한 구현이 없을 때 테스트가 실패하는 것을 보면 향후 회귀를 잡아낼 수 있다는 것을 신뢰할 수 있기 때문 구현 후 테스트를 시작하면, 내가 …

Core ML

애플의 머신러닝 애플의 머신러닝은 통번역, 이미지 인식 등 상당히 강력한 기능을 제공하고 있다. 특징은, 사용자의 기기 안에서만 실행되기 때문에 네트워크에 연결할 필요가 없다는 것이다. 애플의 CoreML을 사용하여, 기존 앱에 쉽게 날개를 달아줄 수 있을 것이다. CoreML 이라는 형식으로 저장된 머신 러닝 모델을 iOS 프로젝트에 추가해보자. ML 위 사이트에서 CoreML 모델을 다운받을 수 있다. 이번에는 이미지 인식기능과 자연어 언어감지 기능을 사용해보겠다. 일반적으로 .mlmodel 파일은 용량이 크기 때문에, gitignore에 추가하는 것이 일반적이다. 이미지 인식 mlmodel을 프로젝트에 추가했다면, 이제 필요한 라이브러리를 import 한다. SqueezeNet 라는 모델을 사용했으며, 코드는 다음과 같다. 모델 파일을 로드하고 MLModelConfiguration를 통해 모델을 설정한다. SqueezeNet 는 이미 제공하는 (학습이 완료된) 이미지 분류 모…

에러 핸들링

에러 핸들링 Guard 진행하기 전에 무언가가 참인지 확인하기 위해 guard 문을 사용. do catch try?, try!

얼굴인식 사용하기

얼굴 인식 기능 실습 얼굴 인식 기능은 Vision framework 를 사용한다. vision Framework 여러 명의 얼굴을 인식할 수 있는 이미지를 준비한 뒤, 이미지를 분석할 analyzeImage 함수를 정의한다 얼굴 인식 VNImageRequestHandler An object that processes one or more image analysis requests pertaining to a single image. VNImageRequestHandler에는 core graphics Image, 줄여서 cgImage라는 싱글 이미지를 파라미터로 받는다. 그렇기 때문에 UIImage를 CGImage로 변환하여 VNImageRequestHandler를 초기화 한다. 이를 통해 단일 이미지를 Vision 프레임워크에 요청을 수행할 수 있는 핸들러를 인스턴스화할 수 있다. 그리고 이미지 안에 있는 페이스를 찾기 위한 요청(얼굴인식)인 VNDetectFaceRectangl…

음성 인식 사용하기

24-07-08 TIL Skip.tools SwiftUI 를 사용해서, iPhone과 Android를 동시에 개발할 수 있는 tool https://github.com/skiptools/skip 음성 인식 사용하기 Text To Speech Speech To Text Speech 프레임워크를 통해, 앱이 탭과 제스처를 보완하는 오디오 명령을 인식할 수 있음 음성을 텍스트로, 혹은 텍스트를 음성으로. 음성 인식 기능을 추가함으로써 앱을 누구나 쉽게 사용 할 수 있도록 함 (시각장애인 분들을 위한 앱 개발 가능) 마이크 액세스와 음성 인식 사용 권한 필요 Speech To Text App Speech Framework의 AudioEngine Object 에 대해서 알아야 한다. AVAudioEngine은 오디오 처리 그래프를 관리하는 객체로, 다양한 오디오 노드를 연결하여 오디오 신호를 처리합니다. 각 노드는 입력 및 출력이 있으며, 서로 연결되어 오디오 신호를 변환하거나 전달할 수 …

SwiftUI + UIKit

SwiftUI와 UIKit 같이 사용하기 아직 레거시 코드가 많기 때문에, UIkit 과 SwiftUI 를 같이 사용하는 경우가 있다. SwiftUI with UIKit SwiftUI 프로젝트에 UIKit 를 같이 사용하는 방법에 대해서 알아보겠다. 예를들어 Pdf 파일을 볼 수 있는 PDFKit의 PDFView 는 UIKit으로 되어있는데, 이걸 SwiftUI 프로젝트에서 사용하려면, UIViewRepresentable 프로토콜을 사용하면 된다. 그리고 그 ViewMe 를 SwiftUI 에 추가하면 끝이다. 이번에는 WebKit에 있는, WKWebView() 를 나타내기 위해서 UIViewRepresentable를 사용해보겠다. updateUIView 에서 load(URLRequest) 까지 다 하고나서, SwiftUI 에서는 WebView를 url과 함께 호출하면 된다. UIViewRepresentableContext Contextual information about the…

Photo, Camera App

Picture App Photo와 Camera 같이 사용자의 개인정보에 접근하기 위해서는 사용자로부터 권한 승인을 먼저 받아야 한다. info.plist에 NSCameraUsageDescription와 NSPhotoLibraryUsageDescription 의 값에 적절한 문구를 추가한다. SwiftUI 에서는 PhotosUI 라는 프레임워크로 사진에 쉽게 접근할 수 있지만, 이번에는 UIKit의 UIViewControllerRepresentable 코드를 사용해보고자 한다. 적용 예시 코드 Coordinator는 UIKit의 Delegate 패턴 등을, SwiftUI의 선언형 프레임워크의 패턴에 맞춰주도록 하는 애플에서 제공하는 기능이다. 다시 말해 UIRepresentable과 SwiftUI를 이어주는 class. PhotosUI 사용 photosUI PhotosUI 사용

Youtube API, AVFoundation, SharePlay 사용

개요 지난 AVFoundation-시작하기 포스트에 이어, 직접 앱을 개발해보기로 했다. 내가 개발하기로 한 앱의 초기 요구사항은 다음과 같다. 앱 초기 디자인은 Youtube Music App 을 클론 미디어 콘텐츠는 Youtube Search API 를 사용 AVFoundation, AVKit 등을 사용하여 미디어 플레이어 앱 개발하기 [추가] WWDC 2023에 공개된 Share Play의 기능 추가해보기 문제 해결 과정 Draggable Sheet View 구현 과정 How to create Draggable Sheet View? Youtube Music App 의 경우, Draggable Sheet View 가 존재한다. 그래서 처음에는 일반적인 sheet 모디파이어로는 구현할 수 없을 것이라 생각하고 DragGesture 를 추가하는 쪽으로 생각했다. 그러나 더욱 간단한 방법으로 시도해보았다. presentationDetants 값에서 sheet view의 최소 높이와 …

AVFoundation-시작하기

AVFoundation-시작하기 오늘은 오디오/비디오를 다루기 위한 AVFoundation, AVKit 에 대해서 알아보고, ‘로컬 재생’의 간단한 예제를 통해서 다루어보았습니다. 주의 사항 대용량 미디어 파일의 앱 크기 영향 - (하루에 2~3만원 정도의 서버 비용이 발생할 수 있다.) 저작권 및 라이선스 확인 - (사용자가 불법적으로 컨텐츠를 사용하고 있지 않은지, 실시간 모니터링 운영 팀이 있어야 한다.) 접근성 고려 (자막, 오디오 설명 등) - AVAudioPlayer (Audio - Video Player) Audio App 그리고 만든 플레이어를 ContentView 에 적용한다. Video App GPU, HardWare 의 영향을 많이 받는 코드이기에, 따로 커스텀이 필요하지만, 간단히 Video 를 앱에서 재생해보는 코드를 작성해보았다. AVKit 을 사용하면 아주 간단하게 비디오를 추가할 수 있다. 아래 코드는 videoOverlay 를 추가하여, 비디오 위에 …

MapKit - 현재위치를 사용한 경로 탐색 앱 만들기

MapKit 을 사용한 예제 앱 개발 이번엔 최신 코드인 @Observable 매크로를 사용하여 viewModel 을 사용하였습니다. @Observable는 @Published 를 따로 쓰지 않아도 상태 추적이 가능하도록 해주는 매크로입니다. MapViewModel 생성 @Observable 를 사용한 ViewModel 은 View에서 @StateObject가 아닌, @State로 불러올 수 있습니다. 만약 하위 뷰에서 해당 viewModel 을 사용하고자 한다면? 바인딩도 필요없고, environmentObject도 사용하지 않습니다. ContentView 에서 viewModel 을 완전히 소유하고 있기 때문에, 그냥 변수를 전달하면 됩니다. Search Bar 그리고 이제 Navigation Title 과 검색바(searchable)를 추가하였습니다. 그리고 mapStyle 을 사용하기 위해서, viewModel 에 MapStyle 타입의 프로퍼티를 추가하고, mapStyle …

문장모아 - (생애 첫 프로젝트)

[프로젝트 회고] - 문장모아 (생애 첫 프로젝트) 안녕하세요. 이 글은 23.10월, 개발을 처음 접해보고 여러 번의 삽질을 통해 얻은 경험을 담은 회고입니다. 자유롭게 읽어주세요. 23년 9월, 교내 진로탐색학점제에서, 자신이 흥미를 가지고 있는 주제에 대하여 자유롭게 탐색하고 활동할 수 있는 비교과 프로그램에 참여했던 적이 있습니다. 어떤 활동을 해야할까 고민하다가, 1학기 때 제대로 배우지는 않았지만 Swift 를 조금 찍먹한 적이 있어서, 잘 모르지만 한번 앱을 개발해보자! 라는 마음을 가지고 도전을 하였습니다. 많이 부족한 실력, 그리고 기초도 부족했기에 이게 왜 돼? 라는 의문도 많이 들지 않았습니다. 그저 기획한 기능을 개발하고 빌드만 되는 것을 목표로 잡았습니다. 여러 번의 시도 끝에 드디어 원하는 모든 기능을 개발하였습니다. 앱스토어 출시 가이드라인을 보고 처음부터 리젝을 받지 않기 위해, 사용자 차단 기능. 신고기능 개발을 하고, HIG(Human Interfa…

멋쟁이사자처럼 - iOS 앱스쿨

멋쟁이 사자처럼 - iOS 앱스쿨 회고 안녕하세요. 이 글은 24.03 ~ 24.09 진행된 iOS 앱스쿨을 수강하면서 얻은 회고입니다. 자유롭게 읽어주세요.

동기 vs 비동기 프로그래밍

Contents 프로세스와 스레드 동기 vs 비동기 프로그래밍 비동기 프로그래밍 구현 방법 GCD (Grand Central Dispatch) async await async await 를 사용할 때 주의점 프로세스와 스레드, 교착상태 이해하기 라면을 끓이는 과정으로 비유해서 이해할 수 있다. 프로세스와 스레드 CPU = 요리사: 요리사는 CPU처럼 주방에서 여러 요리를 처리하는 사람입니다. 프로세스 = 라면을 끓이는 과정: 라면을 끓이는 과정이 하나의 독립된 작업, 즉 프로세스입니다. 각 라면 요리는 독립적으로 수행되며, 다른 요리(프로세스)와 직접적으로 영향을 주지 않습니다. 스레드 = 작은 업무: 스레드는 프로세스 내에서 작은 작업들입니다. 예를 들어, 라면을 끓이는 과정에서 면을 끓이고, 국물을 만드는 것이 각각의 스레드라고 할 수 있습니다. 또 다른 예로, 게임을 다운받는 동안 브라우저의 다른 탭에서 작업하는 것이 스레드입니다. 이때, 스레드는 ‘주방 칼’처럼 하나의 자원…

2024 TIL (~24.05)

2024년 04월 06일 오늘 배운 내용 객체지향, 함수형 프로그래밍의 개념 이해 Swift 함수의 정의와 호출 오버로딩, 오버라이딩 오늘 푼 문제 짝수와 홀수 (프로그래머스) 오늘은 Swift 함수와 더불어 Swift의 언어적 특성에 대해서 기초부터 다시 공부하기 시작했다. ChatGPT에 너무 의존해서는 안된다. ChatGPT가 알려주는 정보가 틀릴 수 있기 때문이다. 나는 그 틀린정보를 구분할 수 있는 능력이 필요하고, 어떤 질문을 해야 좋을지 그 ‘바탕’이 되어줄 것이 필요하다. 좋은 코드를 짜기 위해서는 기본부터 다시 시작해서 배울 필요가 있다고 생각한다. 2024년 04월 07일 오늘 배운 내용 흐름 제어 (조건문, 반복문) 오늘 푼 문제 평균 구하기 (프로그래머스) 두 개 뽑아서 더하기 (프로그래머스) 느낀점 오늘 Swift로 문제를 풀면서 이중 반복문을 구현할 때 조금 헷갈렸다. 스위프트 프로그래밍 책을 다시 보면서 반복문, 흐름 제어 관련해서 다시 한번 꼼꼼히 공부…

async, await 를 사용하면서 겪은 UI thread(Main Thread) 관리 문제

async, await? 비동기 프로그래밍을 쉽게 구현하기 위해서 등장한 async, await. 이것을 사용하면서 아래와 같은 런타임 에러가 발생했다. async, await를 사용하는 코드는 메인 스레드가 아닌 메인 스레드에서 동작하기 때문에, 만약 UI update 와 같은 코드에 async, await 사용해야 할 때에는 스레드 관리를 따로 해줘야한다. UI 갱신은 메인 스레드에서 동작해야 하기 때문이다! 이것을 해결하는 방법은 아주 간단하다. UI update 를 담당하는 부분 (예를들어, button 의 action 부분)에 @MainActor 매크로를 추가하면 된다. 결론 UI를 변경할 수 있는 코드가 포함된 async 메서드를 await으로 실행하게되면 해당 메서드는 MainActor를 붙여줘야한다! async, await? 결론

Combine 시작하기

WWDC Introducing Combine Combine in Practice 해당 WWDC의 핵심 내용을 정리하면서, 내 프로젝트에 어떻게 적용할 수 있을지 고민해보았다. Introduction Reactice Programming? Observable User Input, sensor data, API response Observer An entity that listens to events emiited by observables. Application components, views Operators Functions to transform and manupulate data map, filter, merge Reactive Programming - Benefits Improved code readability Handling complex asynchronous scenarios Real-time and event-driven applications 비동기 프로그래밍의 …