본문 바로가기

분류 전체보기46

LLDB (Low-Level Debugger) 사용법 출처 : https://yagom.net/ 무료강의이므로 편하게 글 올린다 강의가 궁금하다면 & 이 글이 도움됐다면 사이트 들어가서 야곰에게 커피 선물을 LLDB란? LLVM 프로젝트의 컴포넌트 중 디버깅과 관련된 LLVM의 서브 프로젝트 Xcode는 LLVM과 LLDB를 사용하므로 디버깅하려면 LLDB 사용법을 익혀야 한다 print문 이제 Naver.. LLVM이란? 오픈 소스 컴파일러 프로젝트의 이름이다. 애플에서 적극 지원중이며 Swift를 완전히 지원한다 참고로, Swift를 만든 사람과 LLVM을 시작한 사람이 같음 -> 크리스 래트너 Xcode가 LLVM을 사용한다 LLVM 구조와 장점 한 스푼 LLVM에서는 우리가 작성하는 high-level 언어와 기계어 사이에, IR(Intermedia.. 2021. 10. 1.
Git 사용하기 - (하) Github편 로컬 -> Github 업로드하기 (건너뛰고 repository부터 만들어도 됨) 1-1. git init 1-2. git add 1-3. git commit - Github에 올릴 코드를 commit까지 한다 2. github에 접속하여 new repository를 생성한다 3. git remote add origin - 현재 프로젝트에 "origin"이라는 이름으로 해당 repository를 등록 - origin이라는 이름은 추후 push 할때 사용된다 - origin이라는 이름은 master를 포함한 모든 branch에서 공유한다 4. git push -u - "-u"옵션을 주면 을 기억하여 최초 1회 이후부터 "git push"만으로 수행이 가능하다 이후 코드 수정이 발생하면 아래 세 명령어로 G.. 2021. 9. 30.
Trouble Shooting merge나 commit했더니 vi가 켜짐 1. merge 시, commit 메시지를 남기라고 vi가 자동으로 켜지는 경우 [ 해결법 ] - 침착하게 :wq로 저장 후 빠져나오면 된다 - 윈도우는 안뜨는데 mac은 뜬다고 함 merge 중 충돌 발생 1. 서로 다른 branch간 충돌. 서로 다른 branch가 동일한 파일을 변경한 경우 [ 해결법 ] - 해결하려면 두 branch 중 하나는 변경을 되돌려야 한다 - 충돌이 발생한 이후에는 다시 merge가 아닌 add+commit만 하면 merge가 이루어진다 - 협업할때 같은 파일을 다른 branch에서 작업하는 일을 최대한 피해야 한다 2. 동일한 branch를 다루는 서로 다른 로컬 간 충돌 한 로컬이 Github에 push하였지만 다른 로컬에서 .. 2021. 9. 29.
Git 사용하기 - (상) 혼자작업편 본 내용은 유튜브 채널 "얄팍한 코딩사전"의 동영상에 기반하였음 출처 : https://www.youtube.com/watch?v=FXDjmsiv8fI&t=20s 구독 좋아요 필수 준비물 1. git 설치 2. code editor 설치 (ex. VSC) 사용법 최초 Repository 생성 -> commit 까지 1. 프로젝트를 진행할 폴더를 생성 2. 해당 폴더를 code editor로 open 3. 파일을 만들고 작업 4. git init - 해당 폴더를 git의 관리 하에 들어가게 함 (처음 1회만 필요) 5-1. git conifg --global user.name "" 5-2. git conifg --global user.email "" - git에 이름과 이메일 등록 (필수 아님) 6. gi.. 2021. 9. 29.
Command 설명 초기화 git init - 프로젝트의 root 폴더를 지정 - 해당 폴더의 모든 수정내역을 저장하겠다 (하위 폴더 포함) - .git이라는 폴더가 생성됨 커밋 staging git add -A - git add는 staging이라고도 표현한다 - 현재 상태를 임시 저장하는 개념으로, 코드가 변경되었다면 항상 commit과 pair로 수행된다 - 새로운 파일은 추가된 사실을 / 삭제된 파일은 삭제된 사실을 / 수정된 파일은 수정된 사실을 git에 추가한다 - "-A" 옵션을 주면 해당 폴더의 모든 파일에 수행 commit 하기 git commit -m "" - 현재 시점까지의 내용을 박제시킴 - 코드 수정을 했다면 git add를 선행해야 한다 상태보기 & commit 내역보기 commit 내역 보기 gi.. 2021. 9. 29.
(미해결) 함수들은 어떻게 배치하는게 좋을까? 여러 함수를 정의해야 할 때, 정의 순서를 어떻게 주는게 읽기 좋을까? 왠지 이 문제는 convention이 있을 것 같다 우선 문제 이해를 위해 예제를 보자 func ab() { a() b() } func a() { ... } func b() { ... } func cd() { c() d() } func c() { ... } func d() { ... } 함수 ab( )는 함수 a( )와 b( )를 호출하는 상대적으로 상위 계층(?)의 함수로 볼 수 있다 Q1. 그럼 정의 순서는 하위 함수가 먼저일까 / 상위 함수가 먼저일까? A1. 상위/하위 함수를 모두 읽어야 하는 상황이라면, 코드 flow상 먼저 읽게 되는 건 상위 함수일 것이다 사람들은 위에서 아래 방향으로 읽기 때문에, 상위 함수를 위에 정의.. 2021. 9. 29.
(미해결) if-else가 중첩될때 어떤 구현이 깨끗할까? if-else를 중첩시켜야 하는 경우가 꽤 있는데, 코드를 어떻게 짜는게 가장 클린할지 고민해보았다 1. 먼저, if와 else가 유사한 weight를 갖는 구조이다 func leaf() { if { left() } else { right() } } func left() { if { leftLeft() } else { leftRight() } } func right() { if { rightLeft() } else { rightRight() } } 이 구조는 이렇게 구현하면 딱히 논란의 여지가 느껴지지 않는다 2. 문제는 이 경우인데, 한쪽으로 쏠린 구조이다. 특정 조건을 부합하지 못하면 다음 단계가 없는 경우이다. 예로, 누르면 값이 1씩 올라가며 다양한 동작을 하는 버튼이 있는데 / 새로이 설정될 값.. 2021. 9. 29.
정렬은 언제 해야 할까? 주소록을 관리하는 프로그램을 짠다고 가정해보자 각 주소들을 Array로 저장한다 두 가지 기능이 있다 1. 새로운 주소 추가 2. 전체 주소록 보여주기 (이름기준 오름차순으로) 2번 기능인 오름차순으로 보여주기 위해 정렬을 해야한다 (A) 2번 기능이 호출될 때마다 출력용으로 임시 정렬 (주소록 Array 변경 X) (B) 미리 정렬된 채로 저장하고 있다가 2번 기능 호출 시 그대로 출력 나는 (B) 미리 정렬된 값을 가지고 있는다를 선택하였다 그 이유는, B는 2번 기능 호출때마다 매번 정렬할 필요가 없기 때문이다 B가 불리한 경우를 생각해보면, 어쨌든 Memory Write가 추가로 필요하기에 2번 기능이 단 한번만 호출되는 경우는 A가 나을지도 모르겠다 (B)를 선택했다면, 정렬을 언제 해야 할까?.. 2021. 9. 27.
(작성중) Extension extension은 이미 구현되어 있는 클래스, 구조체 등의 타입(+프로토콜)에 프로퍼티, 메소드를 추가하는 것이다 원본을 수정하지 않고 추가만 하게 되는데, 이를 Retroactive modeling이라고 표현한다고 한다. 그래서인지 원본 코드에 접근이 불가해도 extension은 가능하다 ◼ Extension으로 추가할 수 있는 것들을 알아보자 computed 프로퍼티 메소드 subscript new Nested Type 프로토콜 채택 🔹stored 프로퍼티는 extend할 수 없다 extension에 stored 프로퍼티가 가능하다면 타입이 요구하는 메모리 사이즈가 늘어난다 타입을 위한 메모리 사이즈를 정의하는 과정은 컴파일 타임에 이루어지는데 (효율성을 위해) extension에 따라 사이즈가 가.. 2021. 9. 21.
(작성중) Concurrency ◼ Swift에서 Asychronous & parallel 코드가 지원되며 본문에선 두 개념의 combination으로 "Concurrency"라 표현하겠다 예로, - 외부 시스템의 응답을 기다리는 동작을 병렬적으로 suspend시키고 - 메인 코드는 그대로 진행시키는 구현이 있겠다 여기서 suspend된 코드와 메인 코드를 수행하는 core가 다르며 suspend된 동작은 외부 시스템 응답이 도착하면 이어서 진행된다 ◼ 하지만, 이런 병렬성이 항상 좋진 않을 수 있음을 경고한다 느리고 후진 코드는 속도나 정확성이 오히려 떨어질 수 있고 디버깅이 어려워진다 그래서 Swift가 language-level에서 concurrency를 지원하여 컴파일 타임에 문제를 잡을 수 있도록 도와줄 것이다 🔹 NOTE S.. 2021. 9. 19.
Nested Types Swift에서는 타입 내에서 타입을 정의하는 것이 허용된다 struct BlackjackCard { // nested Suit enumeration enum Suit: Character { case spades = "♠", hearts = "♡", diamonds = "♢", clubs = "♣" } // nested Rank enumeration enum Rank: Int { case two = 2, three, four, five, six, seven, eight, nine, ten case jack, queen, king, ace struct Values { let first: Int, second: Int? } var values: Values { switch self { case .ace: re.. 2021. 9. 19.
Inheritance (상속) ◼ Swift에서 상속이 가능한 타입은 클래스가 유일하며 어떤 1개 클래스는, 다른 1개 클래스를 상속할 수 있다 ◼ 자식 클래스는 subclass / 부모 클래스는 superclass라고 표현한다 ◼ subclass는 superclass의 메소드/프로퍼티/subscript를 상속받으며, 이를 재정의할 수도 있다 ◼ 상속한 프로퍼티에 대해 property observer를 추가할 수 있다 (저장프로퍼티든 계산프로퍼티든) Base Class 정의하기 ◼ 어떤 클래스도 상속받지 않는 클래스를 Base class라고 부른다 상속없는 클래스를 정의하면 자동으로 base class가 된다 예시 class Vehicle { var currentSpeed = 0.0 var description: String { re.. 2021. 9. 18.
Subscripts Subscript는 Array나 Dictionary에서 사용했던 대괄호 인덱스 [index] 접근을 말한다 직접 만든 타입에서도 subscript를 정의하여 이 접근을 구현할 수 있고 Collection의 element 추출뿐만 아니라 다양한 기능을 가질 수 있다 넣어주는 index의 타입을 달리하면 subscript를 여러개 구현할 수도 있다 또한, 여러 index를 받는 다차원 배열처럼 구현될 수도 있다 Subscript 구문 ◼ subscript라는 이름으로, 마치 메소드 구문과 계산프로퍼티 구문을 합쳐 놓은듯한(?) 형태로 구현된다 ◼ 계산 프로퍼티처럼, read-only일 경우 getter를 생략할 수 있다 ◼ setter에서 newValue를 다루어 적절한 행위를 하면 된다 subscript(.. 2021. 9. 17.
Enumerations(열거형) 열거형은 어떤 값들을 group으로 묶어 경우의 수를 제한하는 타입이다 개념적으로는 C언어의 것과 유사하나 Swift에서는 각 case에 정수 외의 String/Float 등을, 심지어 여러 개도 할당할 수 있다는 차이가 있다 연관값(associated value)이라는 개념으로 case마다 다양한 타입과 여러 개의 값을 저장시킬 수 있다 Swift의 열거형은 계산 프로퍼티, 인스턴스 메소드, 생성자 등도 사용할 수 있다 익스텐션과 프로토콜도 적용할 수 있다 목차 1. 열거형의 구문 2. 열거형 + switch문 조합 시 유의사항 3. 모든 case 루프 돌리기 4. 연관값 (Associated Value) 5. Raw Value 6. 순환 열거형 (Recursive Enumerations) 열거형 구문.. 2021. 9. 16.
Closures 클로저는 우리가 사용하거나 전달할 수 있는 기능 블럭이다 참고로, 다른 언어에도 비슷한 개념이 있는데 C언어 / Obj-C에서의 block과, 코틀린의 람다와 유사하다 클로저는 외부 상.변수의 참조를 캡쳐하여 저장할 수 있다 이를, closing over라고 표현한다 (캡쳐에 대해서는 본문에서 다룰 예정이니 넘어가자) 클로저는 함수와 같은 기능 블럭들 중 가장 포괄적인 개념이다. 함수는 일종의 special 클로저로 정의된다. (이름을 가지고 캡쳐가 없는 클로저) Swift의 클로저 표현은 깔끔하고 명확한 코드를 짤 수 있도록 최적화 기법들이 있다 parameter와 return 타입 알아서 추론하기 return이란 말을 굳이 안써도 되는 "암시적 return" shorthand 버전의 argument .. 2021. 9. 15.
Error Handling - #1/1 Optional이 값의 부재를 해결하고 Pass/Fail을 구분해주지만 에러 원인이 어느 케이스냐?를 알려주진 않는다 Representing and Throwing Errors Error handling을 구현하려면 우선 Error를 나타낼 타입을 만들어야 한다 참고로 에러 케이스를 나타낼 타입은 열거형이 딱이다 그리고, "Error"라는 프로토콜을 채택해야 하는데 사실 이 프로토콜은 비어 있고 단지 indication 용이다 enum VendingMachineError: Error { case invalidSelection case insufficientFunds(coinsNeeded: Int) //associated Value case outOfStock } 코드 Flow 도중 뭔가 예기치 않은 상황.. 2021. 9. 13.
Access Control - #1/1 다른 소스 파일, 모듈에서 우리가 짠 구조체 / 클래스 / 열거형에 접근하는걸 제한할 수 있다 (프로토콜이나 전역 상.변수도 가능한 것 같은데 더 읽어보자) 구현을 어떻게 했는지 디테일은 숨기고 싶다거나 인터페이스를 강제하는(?) 효과도 있다 참고로 entity라는 용어에 대해 잠깐 정리를 하면, 이런 access control을 적용할 수 있는 프로퍼티, 타입, 함수 등을 표현하는 것이다 Modules and Source Files Access control을 이해하려면 먼저 모듈과 소스파일의 개념을 알아야 한다 먼저 모듈은, 코드 배포의 단위이다 프레임워크나 어플리케이션이 될 수 있고 import 키워드로 또 다른 모듈에서 사용될 수 있다 (Xcode에서 하나의 app bundle이나 framewor.. 2021. 9. 13.
Basic Operators - #1/1 연산자는 값들을 확인 / 변경 / 결합하는 특별한 심볼 혹은 어구를 뜻한다 용어 정리를 잠깐 하고 넘어가자 Unary 연산자 : single target일 경우. (예)-a / !b / c! Binary 연산자 : two targets일 경우. (예) 2+3 Ternary 연산자 : three targets. (예) a ? b : c 그나마 조금은 알고 있는(?) C와 겹치는건 Skip하자 Assignment Operator : = Arithmetic Operator : +, -. *, /, % Unary Minus Operator : -three Compound Assignment Operator : a += 2 Ternary Conditional Operator : (hasHeader ? 50 : 2.. 2021. 9. 13.
Optional Chaining - #1/1 옵셔널 체이닝은 "Optional이 가진 Optional이 가진 Optiona이 가진..." 이렇게 연쇄적으로 필요한 nil check를 우아한 구문으로 바꿔주는 기법이다 예시를 보자 적용 전 //owner가 가진, home이 가진, guard가 가진, guardJob에 대한 nil check if let owner = owner { if let home = owner.home { if let `guard` = home.guard { if let guardJob = `guard`.job { print("우리집 경비원의 직업은 \(guardJob)입니다") } else { print("우리집 경비원은 직업이 없어요") } } } } 적용 후 jang?.home?.guard?.job ✅ Point Chain.. 2021. 9. 13.
Automatic Reference Counting(ARC) - #1/1 서문 Swift는 APP의 메모리 usage를 관리하고 추적하기 위해 ARC를 사용한다 그래서 대부분의 경우, 메모리는 알아서 관리되므로 고려하지 않아도 된다 ARC는 Class 인스턴스가 더이상 필요없다고 판단될때 자동으로 메모리를 해제한다 하지만 일부 케이스에선, ARC가 코드들 간의 관계에 대한 정보를 요구하기도 한다 이 예외 케이스에 대해 구체적으로 알아보고 ARC가 어떻게 메모리를 자동으로 관리하는지 살펴보자 참고로, Reference Count 라는건 참조타입인 Class의 인스턴스에만 해당된다 동작이해 Class의 인스턴스를 생성하면 ARC가 메모리를 할당하게 된다 이 메모리에는 인스턴스의 타입이나 저장 프로퍼티의 값들이 저장된다 이후에 인스턴스가 더이상 필요없다고 판단되면, 메모리 자원 활.. 2021. 9. 13.