iOS 개발자가 알아야할 네트워크 관련 개념 정리: TCP/IP, HTTPS, URLSession
·
iOS
1. 네트워크 프로토콜네트워크 통신은 여러 계층의 프로토콜이 협력하여 이루어진다. 주요 모델로 OSI 7계층 모델과 TCP/IP 모델이 있다.OSI 7계층물리 계층: 전기 신호, 광 신호 등의 물리적 전송 담당데이터 링크 계층: 오류 감지 및 수정, MAC 주소 기반 통신네트워크 계층: IP 주소를 사용하여 경로 설정 (예: IP)전송 계층: 데이터의 신뢰성 있는 전송 보장 (예: TCP, UDP)세션 계층: 세션 설정, 관리, 종료프레젠테이션 계층: 데이터 표현 형식 변환 (예: 암호화)응용 계층: 사용자와 직접 상호작용 (예: HTTP, FTP)TCP/IP 모델응용 계층 (HTTP, FTP, DNS)전송 계층 (TCP, UDP)인터넷 계층 (IP)네트워크 액세스 계층 (이더넷, Wi-Fi)2. SSL..
컴퓨터 시스템과 iOS 개발의 기초 개념
·
iOS
효율적인 개발과 문제 해결에 필수적인 CS 기초 개념을 정리해본다.CPU, RAM, 저장 장치의 상호작용부터 iOS의 메모리 관리 및 멀티스레딩 기술까지, 각 요소의 원리를 숙지함으로써 더 나은 성능과 안정성을 갖춘 앱을 개발할 수 있다. 1.  컴퓨터 시스템의 주요 구성 요소컴퓨터 시스템은 CPU, RAM, 저장 장치로 구성된다. 각 구성 요소는 서로 협력하여 데이터를 처리하고 저장한다.CPU (Central Processing Unit)컴퓨터의 핵심 연산 장치로, 명령어를 처리하고 산술 및 논리 연산을 수행한다.데이터 처리를 담당하며 RAM에서 데이터를 가져와 연산 후 결과를 저장한다.RAM (Random Access Memory)현재 실행 중인 데이터와 프로그램을 임시 저장하는 휘발성 메모리이다.C..
Design Patterns: MVVM, MVVM-C, MVP, Clean Architecture
·
iOS/Swift
디자인 패턴은 앱의 규모와 요구사항에 따라 선택할 수 있으며, 단순한 앱에서는 MVP나 MVVM, 복잡한 네비게이션이 포함된 앱에서는 MVVM-C를 선호할 수 있다. 유지 보수를 위해 가독성이 좋고 의존성을 줄이고자 사용하는 것이기 때문에 누구나 알기 쉽게 작성하는 데 중점을 두어야 하고, 디자인 패턴을 위해 코드가 복잡해지는 것은 바람직하지 않다.참고로 Apple에서 권장하는 디자인패턴은 Swift는 MVC, SwiftUI는 MVVM이라고 한다.  1. MVP (Model-View-Presenter)Model, View, Presenter로 구성된 디자인 패턴으로, View와 Model을 분리하여 코드의 유지보수성을 높이는 구조이다.Model: 애플리케이션의 비즈니스 로직과 데이터 관리 부분을 담당한다..
iOS 앱 개발자를 위한 RESTful API 실전 적용과 WebSocket
·
iOS/Swift
1. RESTful API 설계와 특징RESTful API는 서버와 클라이언트 간의 통신을 효율적으로 설계하기 위해 널리 사용되는 방식이다.RESTful API 설계의 주요 원칙리소스를 나타내는 명사형 URI:GET /users: 유저 목록 읽기POST /users: 새로운 유저 생성Stateless 통신:클라이언트는 매 요청 시 필요한 모든 정보를 포함하여 서버에 전달한다. 서버는 이전 요청 상태를 기억하지 않는다.RESTful하지 않은 API 란모든 요청을 POST로 처리URI에 리소스 대신 동작을 나타내는 동사가 포함된 경우 (예: /students/update)2. RESTful API를 위한 서버 - 클라이언트 협업앱 개발에서 가장 기본이 되는 RESTful API는 화면의 데이터 제공이다. 특..
스타트업: 지속 가능한 XCode 프로젝트 유지 보수를 위한 방법
·
스타트업
스타트업에 입사했을 때, 내가 맡을 앱이 평범한 반려견 관리 앱인 줄 알았다. 하지만 비전에 대한 설명을 들으며 이 앱이 모든 반려견과 함께 하는 사람들의 필수 앱이 되었으면 좋겠다는 생각이 들었다. 나는 원래 내 눈 앞에 있는 일에 몰입하는 성격인데, 열정까지 생기자 내 모든 시간과 노력을 쏟게 되었다. 스토리보드 기반의 거대한 프로젝트이 프로젝트는 초기에 약 30개 이상의 화면으로 이루어졌음에도 불구하고 스토리보드 기반으로 만들어져 있었다.또 그 때 당시에는 Combine이 널리 알려지지 않았던 때라 RxSwift + MVVM 패턴을 기반으로 했지만 이상하게도 모델들의 의존성이 지나치게 복잡하게 얽혀 있었다. JSON 처리에도 키 값이 모두 하드코딩으로 되어 있었으며 Codable 대신 SwiftyJ..
iOS 개발만 하던 앱개발자가 스팀 게임 런칭하기
·
글쓰기/회고
퇴사 후 4개월: 첫 스팀 게임 개발 이야기오늘은 퇴사 후 4개월 동안 내가 집중했던 스팀 게임 개발에 대해 간단히 기록하려고 한다.게임 개발은 개발자라면 누구나 해보고 싶지 않나?나는 유튜브에서 스팀 게임을 하는 게임 유튜버들을 보면서 게임 개발에 관심을 가지게 됐다. 게임을 하는 모습이 정말 재밌어 보였고, 그래서 게임을 개발해보기로 결심했다. 그때부터 유니티와 블렌더 강의를 듣고, 기본적인 게임 개발 생태계를 공부하기 시작했다.처음에는 강의가 순조로웠다. 이미 아는 내용들이 많아서 꽤 쉽게 따라갔다. 그런데 실제로 게임을 만들어보니, 강의와는 다른 현실이 펼쳐졌다. 따라 했는데도 결과물이 전혀 달라서 좀 당황스러웠다.유니티와 블렌더: 강의 후 현실강의를 듣고 나서 유니티와 블렌더를 사용하기 시작했는..
Blender 블렌더 초보 맥에서 단축키가 잘 안되는 것 같을 때 해결방법
·
공부하기/다른 PL
맥에서 블렌더 사용 시 어느 순간부터 G키와 S키 등 특정 단축키가 안 되는 현상이 있었다.검색도 하고 챗GPT에게 물어봐도 알맞은 답변이 나오지 않았다. 아무 키나 누르다가 갑자기 왼쪽 상단 툴박스에 이 녀석이 표시되어 있는 걸 보게 됐다. 원래는 이렇게 표시되어 있었던 녀석이다. 이것 때문인가 싶어서 이전 툴로 바꾸고 싶었는데, 초기 상태에 선택되어 있던 툴로 바꾸려면 T키를 눌러 툴박스를 선택 후 W를 누르면 된다고 챗GPT가 알려줬다. 그런데 뭘 눌러도 이 녀석이 원래대로 돌아가지 않았다. 한참을 아무거나 막 누르다가 갑자기 의심스러운 생각이 들었다. 모든 단축키 표시들의 알파벳이 모두 대문자로 되어 있었다.그래서 설마하고 Caps Lock 키를 눌러 대문자를 활성화한 뒤 다시 단축키들을 입력했더..
Create React App 4주차 - 클래스 & 함수 타입 컴포넌트와 라이프사이클
·
공부하기/React
클래스 & 함수 타입 컴포넌트 새로운 폴더를 만들고 새 프로젝트를 만든 후 터미널에서 create-react-app을 설치한다. npx create-react-app . npm start 클래스 & 함수 방식 컴포넌트의 props 클래스 방식의 컴포넌트에서는 외부에서 전달된 props 값을 받을 때 this를 사용하지만 함수 방식의 컴포넌트에서는 파라미터를 이용하여 props 값을 받는다. 함수 방식의 인자는 아무 이름으로 정해도 된다. // App.js import React from 'react'; import './App.css'; function App() { return ( Hello World ); } // 함수 방식으로 작성한 컴포넌트 function FuncComp(props) { retu..
Create React App 3주차 - Create/Update/Delete
·
공부하기/React
Create 구현하기 1. Control 컴포넌트를 작성하고, 이 컴포넌트가 mode를 변경할 수 있도록 onChangeMode props를 추가한다. // Control.js import { Component } from 'react'; class Control extends Component { render() { return ( create update ); } } export default Control; // App.js ... import Control from './components/Control' class App extends Component { ... ... 디버거를 추가하고 create, update, delete를 클릭하면 mode가 변경되는 것을 볼 수 있다. 2. Create..
Create React App 실행해보기 - 2주차
·
공부하기/React
크롬 브라우저에서 React Developer Tools 확장 프로그램 설치하기 https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi React Developer Tools Adds React debugging tools to the Chrome Developer Tools. Created from revision 7f673317f on 5/31/2022. chrome.google.com 확장 프로그램으로 설치된 Components 탭을 클릭하면 페이지의 실제 컴포넌트를 보여준다. 클릭하면 각 컴포넌트의 props와 값을 볼 수 있다. 직접 값을 변경할 수도 있다. 컴포넌트를 파일로 분..
Create React App 실행해보기 - 1주차
·
공부하기/React
개발환경 만들기 1. Node 설치 https://nodejs.org/en/ Node.js Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. nodejs.org Create React App 링크 https://github.com/facebook/create-react-app GitHub - facebook/create-react-app: Set up a modern web app by running one command. Set up a modern web app by running one command. Contribute to facebook/create-react-app development by creating an..
RxSwift vs URLSession 이미지 다운로드 비교
·
iOS/RxSwift
RxSwift와 조금 더 친해지기 위해 기존 코드를 RxSwift를 이용한 코드로 변경해보는 간단한 예제를 실습해보았다. 1. Storyboard 에 다음과 같이 UIImageView와 버튼들을 Constraint와 함께 추가한다. 2. Cocoapods 필수! Podfile에 RxSwift 라이브러리를 추가한 후 install 한다. ///Podfile pod "RxSwift" 3. 메인 ViewController 상단에 import를 추가한다. ///ViewController.swift import RxSwift 4. 상단에 IBOutlet을 연결하고 url 주소를 선언한다. 다운로드받을 이미지는 구글 검색에서 찾은 1920X1080 크기의 배경화면 이미지이다. ///ViewController.swi..
ReactiveX 사이트 방문해보기
·
iOS/RxSwift
reactivex.io ReactiveX CROSS-PLATFORM Available for idiomatic Java, Scala, C#, C++, Clojure, JavaScript, Python, Groovy, JRuby, and others reactivex.io RxSwift를 공부하기 위해서 ReactiveX 사이트를 방문해보았다. RxSwift는 Microsoft사의 ReactiveX의 시리즈 중 하나이고 "An API for asynchronous programming with observable streams(Observable 스트림을 이용한 비동기 프로그래밍 API)"라는 한 줄 요약으로 설명하고 있었다. 홈페이지 상단의 Introduction 버튼을 클릭하면 Reactive X에 대..
Python 기초) 파일 입출력
·
공부하기/Python
1. 파일 쓰기 1. w모드로 open() myFile = open("file.txt", "w", encoding="utf8") print("강아지 망고는 갈색푸들", file=myFile) print("강아지 망고는 갈색푸들", file=myFile) myFile.close() 2. a모드로 open myFile = open("file.txt", "a", encoding="utf8") myFile.write("망고는 강아지 갈색푸들") myFile.write("망고는 강아지 갈색푸들") myFile.close() 2. 파일 읽기 1. read() myFile = open("file.txt", "r", encoding="utf8") print(myFile.read()) myFile.close() # 강아..
알고리즘 문제풀이 - 선형검색과 보초법 & 이진탐색 (Python)
·
공부하기/다른 PL
1. 선형 검색 선형 검색 알고리즘은 직선 모양으로 늘어선 요소의 배열에서 앞부터 순차적으로 검색을 수행한다. 선형 검색 알고리즘에서 종료 조건은 2가지이다. 1. 배열의 끝 2. 검색할 값을 발견 보초법은 배열의 마지막 요소로 검색 요소를 추가하여 반복문에서 종료 판단 횟수를 2회에서 1회로 줄이는 역할을 한다. # search 함수 def search(array, n, key): i=0 array.append(key) # array의 마지막에 key를 추가 while(True): if(array[i] == key): break i+=1 # 마지막 요소까지 없으면 i = n으로 while문을 빠져나오게 된다. return i if i != n else -1 # 마지막 요소까지 검색하지 않았다면 인덱스를..
Python 기초) 입출력 기초
·
공부하기/Python
1. sep & end print문에 쉼표(,)를 사용할 때 sep키워드로 구분자를 지정할 수 있다. sep의 기본 값은 빈칸(띄어쓰기)하나이다. print("망고", "강아지") # 망고 강아지 print("망고", "강아지", sep=",") # 망고,강아지 print문의 마지막은 end키워드로 지정할 수 있다. end의 기본 값은 줄바꿈 문자(\n)이다. print("망고", "강아지", sep=",", end="?") # 망고,강아지? 2. 왼쪽 정렬, 오른쪽 정렬, 0으로 채우기 왼쪽 정렬 ljust() & 오른쪽 정렬 rjust() animals = {"망고" : 3, "초코" : 5, "레오" : 10} for name, age in animals.items(): print(name, age..
Swift) 값 타입과 참조 타입 그리고 클래스와 구조체 (Value type & Reference type, Class & Struct)
·
iOS/Swift
값 타입과 참조 타입 값 타입 변수를 할당하면 스택 영역에 값이 저장된다. 변수를 복사한 후 복사본을 변경하더라도 원본에 영향을 주지 않는다. 힙 영역을 사용하지 않고 레퍼런스 카운팅이 필요하지 않다. 참조 타입 스택 영역에는 포인터(레퍼런스)만 할당되고 실제 데이터는 힙 영역에서 할당된다. 변수를 복사하더라도 하나의 값을 가리키고 있기 때문에 복사본과 원본이 모두 같은 값을 갖는다. 변수를 복사하더라도 레퍼런스 카운트만 +1되고 실제 값이 복사되지는 않는다. Swift의 Class와 Struct는 생김새와 사용법이 유사하다. 구조체는 1. 값 타입이다. 2. 상속이 불가능하다. 3. 생성자를 구현하지 않아도 default initializer를 사용할 수 있다. struct Car { var name ..
알고리즘 문제풀이 - 소수구하기 & 기수 (Python)
·
공부하기/다른 PL
1. 소수구하기 자연수 n의 소수는 n의 제곱근이하의 어떤 소수로도 나누어 떨어지지 않는 수이다. #소수를 구하는 프로그램 def program(n): prime = [2, 3] # 얻은 소수 i = 5 while i
Python 기초) 함수
·
공부하기/Python
Python의 함수 형태는 def functionName(argument): 이고 타입을 명시하지 않는다. 함수의 리턴값이 여러개일 수 있다. def plusAndMinus(a, b): return a+b, a-b print(plusAndMinus(3, 5)) # (8, -2) 함수의 인자에 이름을 붙여서 사용할 수 있다. def family(name, age, position): print("이름 : {0}\t나이 : {1}\t호칭 : {2}".format(name, age, position)) family("망고", 3, "강아지") # 이름 : 망고 나이 : 3 호칭 : 강아지 family("망고", position = "강아지", age = 3) # 이름 : 망고 나이 : 3 호칭 : 강아지 인자..
Python 기초) 제어문과 반복문
·
공부하기/Python
1. 제어문 score = int(input("점수를 입력하세요:")) if score >= 90: print("{0}점은 상위권입니다.".format(score)) elif 70
Python 기초) 튜플과 Set
·
공부하기/Python
튜플 튜플은 리스트와 달리 값 변경이나 추가가 불가능하지만 연산 속도가 리스트에 비해 빠르다.(단. 튜플의 내부에 가변요소가 있다면 그 요소를 변겅하는 것은 가능함.)리스트에 사용가능한 함수들 중 값 변경을 제외한 조회 관련 함수들(count, index 등)도 사용할 수 있다. 1. 표기 fruits = ("사과", "딸기") print(fruits[0]) # 사과 2. 활용 animal, name, age = "강아지", "망고", 3 print(animal, name, age) Set Set은 집합의 특성을 가지기 때문에 순서가 없고 중복값이 허용되지 않는다. 1. 표기 language = {"JAVA", "JAVA", "C", "Python"} print(language) # {'JAVA', 'C..
Python 기초) 리스트와 딕셔너리
·
공부하기/Python
리스트 1. 표기 fruits = ["사과", "배", "망고", "파인애플"] 2. 추가 append fruits.append("딸기") print(fruits) # ['사과', '배', '망고', '파인애플', '딸기'] 3. 중간에 삽입 insert fruits.insert(1, "사과") print(fruits) # ['사과', '사과', '배', '망고', '파인애플', '딸기'] 4. 마지막 요소를 꺼냄 pop print(fruits.pop()) # 딸기 print(fruits) # ['사과', '사과', '배', '망고', '파인애플'] print(fruits.pop()) # 파인애플 print(fruits # ['사과', '사과', '배', '망고'] 5. 특정 요소의 개수를 체크 coun..
Swift 앱의 생명주기와 헷갈리는 UI 관련 개념 정리
·
iOS/Swift
* 생명주기 1. ViewController 생명 주기 2. App 생명 주기 3. Scene 생명 주기 * UI 관련 개념 1. UIWindow - The backdrop for your app’s user interface and the object that dispatches events to your views. - UIView를 상속받은 객체로 유저 인터페이스의 배경으로서 UIView들에게 이벤트(터치, 드래그 등)를 전달하는 역할을 한다. 2. Frame과 Bounds - 두 가지 모두 UIView의 위치와 크기를 가진 프로퍼티이다. - 두 가지 모두 CGRect형으로 나타난다. - Frame은 SuperView내에서의 절대적인 위치 좌표를 가지고 Bounds는 상대적인 위치 좌표를 갖는다. ..
Swift 중요한 용어와 개념
·
iOS/Swift
프로그래밍 언어 공통 1. 라이브러리와 프레임워크 - 라이브러리는 재사용이 가능하도록 미리 만들어둔 최소 기능 단위이다. 보통 라이브러리는 API를 제공한다. 크게 표준 라이브러리와 사용자 라이브러리가 있는데 표준 라이브러리는 언어에서 제공해주는 것(ex. printf 함수)이고 사용자 라이브러리는 보통 표준 라이브러리를 이용하여 만들어진다. - 프레임워크란 라이브러리들과 또다른 프레임워크들을 모두 포함한다. 자바를 편하게 쓸 수 있도록 만든 스프링, 파이썬을 편하게 쓸 수 있도록 만든 장고 등을 예로 들 수 있다. - 라이브러리와 프레임워크 모두 편리하고 개발시간을 단축시키는데 도움이 되며, 재사용이 가능하다는 장점이 있다. 또 여러 사람이 사용하기 때문에 대부분 신뢰할 수 있다. - 라이브러리의 경우..
Python 기초) 문자열 포맷
·
공부하기/Python
1. 기본 포맷 print("a" + "b") # ab print("a", "b") # ab print("망고는 %d살입니다." % 3) # 망고는 3살입니다. print("망고는 %s을 좋아합니다." % "간식") # 망고는 간식을 좋아합니다. print("알파벳은 %c %c %c ..." % ('A', 'B', 'C')) # 알파벳은 A B C ... 2. format print("망고는 {}과 {}를 좋아합니다.".format("형", "누나")) # 망고는 형과 누나를 좋아합니다. print("망고는 {age}살이고 {favorite}을 좋아합니다.".format(age = 3, favorite = "간식")) # 망고는 3살이고 간식을 좋아합니다. 3. f-string age = 3 favori..
Python 기초) 연산자
·
공부하기/Python
Python도 일반적인 연산자(+, *, -, =, % 등)들을 사용할 수 있다. 익숙하지 않은 연산자는 다음과 같다. 제곱 연산자 ** print(3**2) # 9 몫 연산자 // print(10//2) # 5 & 연산자와 | 연산자는 각각 and와 or로도 사용가능하다. 일반적인 수학 함수 예제 print(abs(-10)) # 10 print(pow(4, 2)) # 4 ^ 2 = 16 print(max(5, 12)) # 12 print(min(10, 6, 13)) # 6 print(round(3.14)) # 3 print(round(8.9)) # 9 math 라이브러리를 import하면 아래 함수도 사용가능하다. from math import * print(floor(3.99)) # 3 print(c..
Python 기초) 요소들
·
공부하기/Python
1. 숫자와 문자 print(3.14) #3.14 print(10000000000000000000) #10000000000000000000 print(3*(3+5)) #24 print("풍선") #풍선 print('T' * 8) #TTTTTTTT print('풍' + '선') #풍선 2. 참과 거짓 print(5 > 10) #False print(5 10) #True 3. 변수 name = '망고' category = '강아지' age = 3 favorite = '간식' is_dog = category == '강아지' print(name + "는" + category + "입니다.") print("나이는 " + str..
피그마 컴포넌트
·
공부하기/Figma
피그마의 가장 큰 특장점 : 컴포넌트 컴포넌트는 재사용이 가능한 최소의 단위라고 정의할 수 있다. 컴포넌트라는 개념은 개발 / 디자인 분야에서 많이 사용하는데, 처음에는 이해하기 어려울 수 있다. UI/UX를 구성하다 보면, 복사 + 붙여넣기를 많이 이용하게 된다. 이 때 복사 + 붙여넣기가 필요한 부분이 아주 작은 부분(ex. 일반 텍스트, 도형, 단순 글꼴이나 색상)일 수도 있고, 앱 또는 웹의 한 페이지 정도의 많은 요소들로 이루어진 복잡한 부분일 수도 있다. 목차 - 간단한 텍스트 추가하기 - 간단한 텍스트를 컴포넌트로 만들기 - 컴포넌트를 변경하여 인스턴스에 함께 적용하기 - 컴포넌트화 되돌리기(Undo) - Tip 간단한 텍스트 추가하기 피그마 프로젝트를 하나 만들고, 간단한 텍스트를 추가한다..
객체지향과 상속
·
공부하기/다른 PL
흔히 객체지향 언어라고 하면 클래스를 떠올리지만, 객체지향 언어는 크게 클래스 기반 언어(ex: java, swift)와 프로토타입 기반 언어(ex : javascript)로 분류할 수 있다. 다음은 클래스 기반 객체지향 언어의 클래스와 객체 개념에 대한 글이다. 클래스는 '틀', 객체는 '실체' 자동차를 예로 들면 클래스는 자동차를 만드는 틀, 객체는 실제로 만들어진 자동차를 의미한다. 클래스는 속성(property)과 메소드로 구성된다. 아래 Car 클래스로 만들어진 자동차는 엔진, 바퀴, 차체 등의 속성을 가지고 있고 시동을 거는 기능, 브레이크를 밟는 기능을 메소드로 가지고 있다. Car 클래스 class Car { var engines : String //엔진 var wheels : String..
Swift 클로저와 일급 함수
·
iOS/Swift
일급 시민(함수 or 객체) 1. 변수나 데이터 구조(컬렉션) 안에 담을 수 있다. 2. 파라미터로 전달할 수 있다. 3. 리턴값으로 사용할 수 있다. Swift 클로저 let add: (Int, Int) -> Int = { (a: Int, b: Int) in return a + b } let res: Int = add(1, 2) print(res) // 3 swift의 함수는 일급함수가 아니다. swift의 클로저는 일급함수이다. 함수가 일급함수인 경우 : javascript, kotlin, python .. javascript는 함수를 변수 안에 담고, 리턴값으로 사용할 수 있다. function calculator(mode){ var options = { '+' : function(left, rig..