3월 30일 월요일
WORK 코로나 사태로 일이 줄어들지 않을까 했는데 아직 영향은 없다. 오늘은 9시간 작업 예정이고 이번주는 계속 바쁘다.
3월 27일 금요일
COURSE Udemy <iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp>
- 섹션 11: Advance Swift Programming - Classes, Inheritance & Advanced Optional
- 옵셔널의 값이 nil일 경우 적용할 기본값을 지정할 수 있다. 그 역할을 하는 기호 ??를 nil 병합 연산자라 한다.
- 값이 단순한 상수나 변수에는 강제 해제, nil 값 검사, 옵셔널 바인딩, nil 병합 연산자를 쓰고, 구조체나 클래스 같이 값이 복잡할 경우에는 옵셔널 체이닝을 활용한다.
3월 26일 목요일
COURSE Udemy <iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp>
- 섹션 11: Advance Swift Programming - Classes, Inheritance & Advanced Optional
- 없는 것을 실행하면 오류가 난다. nil 값을 실행하여 런타임 오류가 발생하는 것을 막기 위해 값이 nil이 아닌 경우에만 옵셔널을 해제한다는 조건을 달아주는 것이 좋다. 옵셔널 바인딩은 nil 값 검사와 옵셔널 해제를 보다 손쉽게 할 수 있도록 만들어진 함수이다.
3월 25일 수요일
READING EBS, <자본주의>
- 대출한 돈에서 발생하는 이자는 시중에 존재하지 않는 잉여의 돈이기에 누군가가 돈을 모두 갚으면 누군가는 파산한다. 시중에 있는 돈의 양과 대출금+이자의 양이 맞지 않기 때문이다. 그래서 중앙은행은 계속 돈을 찍어낼 수밖에 없다. 은행이 존재하는 한 돈의 양은 계속 늘어나고 물가도 계속 오른다. 그것이 자본주의의 핵심이다.
WORK 오늘은 일을 하는 날. 11시간짜리 작업이 기다린다.
3월 24일 화요일
READING EBS, <자본주의>
- 일독 후 정리 중
COURSE Udemy <iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp>
- 섹션 11: Advance Swift Programming - Classes, Inheritance & Advanced Optional
- 이전 화면으로 돌아가는 코드를 배웠다. 앱 화면은 새로운 화면이 이전 화면 위에 쌓이는 구조이기 때문에, 현재 화면을 사라지게 하는 dismiss 코드 하나로 이전 화면을 불러올 수 있다.
- 옵셔널을 활용하는 다섯 가지 방법(강제 해제, nil 값 검사, 옵셔널 바인딩, nil 병합 연산자, 옵셔널 체이닝)에 대한 학습을 시작했다. 이것은 Swift를 통해 처음 배우는 개념이라 머리가 복잡하다 @_@
3월 23일 월요일
- 많은 사람들이 인생을 바꾸는 획기적인 방법이나 실력을 올리는 특별한 비법 같은 걸 찾는다. 하지만 무언가를 꾸준히 해내는 것만큼 특별한 방법은 없다. 성공을 이룬 사람들이 아무리 그럴싸한 말로 자신의 비법을 광고해도 결국 핵심을 들여다 보면 포기하지 않고 끝까지 해냈다는 말이다. 어떤 방법이든 계속 하다 보면 스스로 그 효용성을 판단할 수 있을 만한 실력이 쌓인다. 그러니 방법을 찾지 말고 우선 시작하자.
- Udemy <iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp>의 섹션 11: Advance Swift Programming - Classes, Inheritance & Advanced Optional를 계속 수강했다.
- Cocoa Touch Class 프레임워크의 UIViewController 템플릿을 사용하여 ViewController를 만드는 방법과 직접 코드를 작성하지 않고 세그웨이로 ViewController 간 데이터를 전달하는 방법을 배웠다.
- 세그웨이로 ViewController를 연결하고 데이터를 전달하는 방식은 프로그래밍 방식으로 코드를 직접 작성하는 방식보다 복잡하게 느껴진다. 세그웨이는 스토리보드 기반인데, 대부분의 개발자들이 스토리보드 없이 코드를 작성하는 것을 추천한다는 점에서 이 기술이 정말 유용한 것인지 의문이 들기도 하고. 하지만 몰라서 못쓰는 것과 효율적이지 않아서 안쓰는 것에는 큰 차이가 있으니 개념이 확실히 잡힐 때까지 조금 더 들여다봐야겠다.
3월 20일 금요일
- Udemy <iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp>의 섹션 11: Advance Swift Programming - Classes, Inheritance & Advanced Optional를 계속 수강했다.
- 사용자 지정 ViewController를 생성하는 방법과 스토리보드를 사용하지 않고 코드만으로 UI를 생성하는 방법을 배웠다.
- A라는 화면에서 사용자 행동을 토대로 특정한 값을 도출하고 그 값을 B라는 화면에 출력하려는 경우, 새로운 ViewController를 만들어야 한다. ViewController는 화면당 하나가 필요하다.
- iOS 프로젝트를 생성했을 때 기본 ViewController도 자동으로 생성되고 여기에는 템플릿 코드가 적용되어 있다. 하지만 새롭게 추가하는 ViewController에는 이러한 코드가 적용되지 않기 때문에 직접 입력해줘야 한다. 기본 ViewController는 UIKit이라는 프레임워크를 사용하는데, 사용자 지정 ViewController는 Foundation이라는 프레임워크를 사용한다. UILabel, UISlider, UIViewController 등 UI라는 키워드로 시작하는 모든 요소는 UIKit 프레임워크의 클래스이기 때문에 이를 사용하려면 import Foundation이라는 코드를 import UIKit로 바꿔야 한다.
- 앱 화면에 UI 요소를 추가하는 방법에는 두 가지가 있다. 하나는 라이브러리를 통해 스토리보드에 UI 요소를 끌어다 놓는 것이고 다른 하나는 ViewController 파일에 코드를 직접 작성하는 것이다.
- 기본 ViewController에서 새롭게 추가한 사용자 지정 ViewController를 보려면 두 ViewController를 연결해야 한다. 기본 ViewController 안에 사용자 지정 ViewController를 초기화하면 된다. ViewController도 클래스이기 때문에 일반적인 클래스와 동일하게 초기화한다.
- 두 ViewController를 연결한 후에는 새로운 화면을 불러올 동작 함수 안에 self.present() 메서드를 작성한다. 여기서 self는 기본 ViewController를 가리킨다.
3월 19일 목요일
- Udemy <iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp>의 섹션 11: Advance Swift Programming - Classes, Inheritance & Advanced Optional를 수강했다.
- 드디어 구조체와 클래스의 차이를 배웠다. 클래스는 JavaScript 강의에서도 한 번 배운 개념인데 확실히 두 번째 배우는 것이 이해가 더 잘 된다.
- 구조체와 클래스 모두 초기화하여 객체를 생성할 수 있다는 공통점이 있지만 이렇게 생성한 객체를 새로운 객체에 할당할 때 차이가 발생한다. 구조체는 기존 객체에서 새로운 객체로 전달될 때 복제가 되는 반면, 클래스는 기존 객체에서 새로운 객체로 전달될 때 참조가 된다. 그래서 전달된 구조체는 수정하거나 삭제해도 다른 객체에 영향을 안미치지만 전달된 클래스는 수정할 경우 다른 객체에도 영향을 미친다. 구조체는 리소스를 객체마다 하나씩 가져가는 것과 같고 클래스는 하나의 리소스를 여러 객체가 동시에 사용하는 것과 같다.
- 클래스는 구조체보다 더 복잡하고 오류도 발생하기 쉽다. 그래서 Apple은 기본적으로 구조체를 사용하고 상속이 필요하거나 Object-c 코드 작업을 해야 할 때 구조체를 클래스로 변경할 것을 권장한다.
3월 16일 월요일
- 월요일은 생업으로 바쁘다. 오늘은 일과 시간이 다 끝날 때까지 일을 했고 저녁에 잠깐 구조체 속성의 불변성에 대해 학습했다.
- 구조체에 속성을 생성할 때 배경에서 self도 자동으로 생성이 된다. 그래서 self.를 불러올 수 있는 것이다. self 키워드가 붙은 요소는 변경이 불가능하고, 따라서 구조체에 생성된 모든 속성(상수, 변수 모두 포함)은 구조체 내의 메서드로 변경이 불가능하다(일단은). 외부에서는 가능하다.
- 구조체에 사용되는 메서드에는 두 가지가 있다. 하나는 구조체를 변형하지 않고 특정한 값만 반환하는 일반 메서드이고, 다른 하나는 구조체의 상태를 변형하는 변형 메서드(mutating method)이다. 구조체의 속성을 변경하는 메서드의 경우, 메서드 앞에 mutating이라는 키워드를 추가해야 한다. mutating 키워드를 추가하면 self가 var와 같이 기능하여 구조체의 모든 속성을 변경할 수 있게 된다.
- 감기 기운이 희미하게 느껴진다. 이 시국에 감기라니 큰일 날 소리.. 오늘은 서둘러 잠자리에 들어야겠다.
3월 15일 일요일
- MVC 디자인 패턴을 계속해서 복습했다.
- 함수가 인수를 받기 위해서는 함수에 매개 변수가 있어야 하는데, 이 매개 변수는 외부 이름과 내부 이름을 가질 수 있다. Swift 함수에서 매개 변수를 표현하는 방법에는 세 가지가 있다. func functionName(Parameter: DataType) { } 같이 매개 변수를 하나만 사용하는 방식, func functionName(externalParameter internalParameter: DataType) { } 같이 외부 매개 변수 이름과 내부 매개 변수 이름을 모두 사용하는 방식, func functionName(_ internalParameter: DataType) { } 같이 외부 매개 변수 이름을 사용하지 않고 그 자리에 밑줄을 넣는 방식이다. 외부 매개 변수는 함수를 호출하면서 인수를 받을 때에만 사용되며 함수 안에는 사용할 수 없다.
- 함수 안에 return 키워드를 넣어 값을 반환하는 함수를 만들 수 있다. func functionName(parameter: DataType) -> DataType과 같은 형태로, return 키워드를 사용하기 위해서는 먼저 이 함수가 어떤 데이터 타입의 값을 반환할 것인지 표시해주어야 한다. 이를 나타내는 것이 -> DataType이다.
- Swift 함수에는 일반 함수, 인수를 받는 함수, 값을 반환하는 함수 세 가지가 있다.
- if-else 조건문에서 조건의 데이터 타입이 Bool이고 true와 false 중 하나로 값이 정해져 있는 경우, 조건으로 굳이 == true, == false를 입력할 필요가 없다. if 조건은 true로, else 조건은 false로 자동 인식된다.
3월 14일 토요일
- 구조체 복습을 마무리하고 MVC 디자인 패턴 복습을 시작했다.
- 구조체를 별도의 파일로 분리해서 코드를 보다 간결하게 할 수 있다. 다른 파일에 구조체를 넣고 메인 코드 파일에서는 필요에 따라 초기화하여 사용하면 된다. 파일을 연결하는 작업은 필요하지 않다.
- 하나의 파일에 너무 많은 코드가 있으면 각 코드의 역할과 기능을 알아보는 것이 어렵다. 본인이 작성한 코드를 3개월 후에 다시 본다고 했을 때, 그때에도 이해할 수 있도록 간결하게 코드를 작성해야 한다. 이를 도와주는 것이 디자인 패턴이다. 말만 들었을 땐 UI 디자인과 관련한 패턴인 줄 알았지만 '코드를 설계하는 패턴'에 가깝다. 디자인 패턴은 코드의 복잡성 문제를 해결하기 위한 도구로 활용된다.
- 단 하나의 완벽한 디자인 패턴 같은 것은 존재하지 않는다. 디자인 패턴은 건축 설계도와 같다. 요구 사항(개발하고자 하는 앱)과 스타일에 따라 필요한 디자인 패턴도 달라진다.
- MVC 디자인 패턴은 Apple이 요구하는 디자인 패턴으로, 프로젝트를 Model, View, Controller라는 세 가지 영역으로 나눈다. Model은 데이터와 데이터 처리 논리를 다루는 영역이고 View는 UI와 사용자 상호 작용을 다루는 영역이다. Controller는 모든 영역의 중간자 역할을 하는데, View에서 이루어진 사용자 상호 작용으로 무엇을 할지 결정하여 Model에 요청하고 Model에서 받은 데이터를 토대로 View에 무엇을 표시해야 하는지 전달한다. Model과 View는 직접적으로 통신하지 않고 Controller를 통해서만 상호 작용이 이루어진다.
- 정확히 어떤 코드를 Model에 작성하고 어떤 코드를 Controller에 작성해야 하는지 헷갈리는 부분이 있는데 우선은 함수의 호출을 기준으로 생각하면 될 것 같다. Model에서 함수를 정의하고 Controller에서는 그 함수를 호출한다. 다른 함수를 정의하기 위해 필요한 경우가 아니라면 Model에서는 함수를 호출하지 않는다.
- 얼었던 땅이 녹고 꽃이 피는 계절이다. 겨우내 함께했던 숲의 나무들이 말없이 초록잎을 틔우는 모습에 마음이 뭉클해졌다. 요즘은 하루하루 변하는 숲의 모습을 관찰하는 데 푹 빠져 있다.
3월 13일 금요일
- Swift의 구조체 개념을 계속 복습했다.
- 구조체의 속성에 구체적인 값을 부여하지 않고 데이터 타입만 부여하는 경우, 구조체 안에 이니셜라이저를 반드시 생성해야 초기화가 가능한 것인 줄 알았는데 이니셜라이저가 없어도 구조체 밖에서 인수와 함께 구조체를 초기화할 수 있다. 이니셜라이저를 언제 사용하는 것이 좋은지 확인이 필요하다.
- 구조체 안에 속성의 데이터 타입만 부여하는 경우, 속성은 =가 아닌 콜론(:)으로 정의한다. var name = String이 아니라 var name: String이다. 구체적인 값을 선언할 때는 기존 방식대로 =를 쓴다.
- 이니셜라이저의 매개 변수 이름과 구조체의 속성 이름이 달라야 Swift가 인수로 전달된 값을 어디에 적용할지 판단할 수 있다. 하지만 이름을 다르게 쓸 경우 코드가 복잡해지기 때문에 이름은 동일하게 쓰되, 구조체의 속성 이름 앞에 self.를 붙여준다. JavaScript의 this와 유사하다.
- UIColor는 iOS에 내장되어 있는 컬러이다. 점 표기법을 이용하여 sender.backgroundColor = UIColor.green과 같은 방식으로 색상을 지정할 수 있다. UIColor.까지 입력하면 사용할 수 있는 컬러 목록이 표시된다.
3월 12일 목요일
- Swift의 구조체(Structure) 개념을 복습했다.
- String, Int, Float, Double, Bool, Array, Dictionary 같은 데이터 타입은 Swift에 사전 정의된 데이터 타입이고, 구조체는 서로 관련 있는 속성과 행동을 그룹지어 만들 수 있는 사용자 정의형 데이터 타입이다. 구조체 이름은 대문자로 시작한다.
- 구조체 안에 변수와 상수로 선언된 요소를 속성(Property) 혹은 프로퍼티라 하고, 이 속성은 점 표기법을 이용하여 가져올 수 있다. StructureName.variableName과 같은 방식으로 가져온다.
- 함수와 메소드가 가리키는 기능은 동일하다. func 키워드와 함께 일정한 동작을 수행하도록 작성한 코드를 말하는데, 이러한 동작이 어디에서 선언이 되었느냐에 따라 이름이 바뀔 뿐이다. 구조체나 클래스 안에서 선언이 된 경우에는 메소드(method)라고 부른다.
- 구조체는 객체를 생성하기 위한 설계도와 프레임에 가깝다. 이 객체 안에 담을 정보를 구조체에 넣는다. 구조체의 속성은 객체의 모양새를 나타내고, 메소드는 객체가 수행할 동작을 나타낸다.
- 구조체라는 설계도를 실제 객체로 전환시키는 과정을 초기화(initialize)라고 하는데, var variableName = StructureName( )과 같은 방식으로 초기화할 수 있다.
- 만들고자 하는 객체가 여러 개일 경우, 공통된 프레임을 구조체로 만들고 새로운 객체가 필요할 때마다 속성값만 부여하는 방식으로 구조체를 활용할 수 있다. 이 경우에는 구조체 안에 이니셜라이저를 생성해야 한다. 이니셜라이저는 init( ) { }과 같은 메소드 형식으로 이루어져 있다. 이니셜라이저 자체를 하나의 매개 변수라고 생각하면 된다. 이니셜라이저는 구조체 안으로 전달되는 인수를 받아서 구조체의 프레임에 따라 속성을 완성하는 역할을 한다.
- 배워야 할 것은 아주 많은데 내가 아는 건 손톱만큼도 되지 않아서 무기력해지는 시간이 있다. 하지만 이런 시간은 모든 공부에서 겪을 수밖에 없는, 혼자서 이겨내야 하는 시간이라는 것도 잘 안다. 그렇게 견뎌내면서 오르다 보면 어느새 변곡점에 도달하게 된다는 것도. 어떻게 백지 상태에서 영어 공부를 했었는지 생각해보면 지금 느끼는 불안함을 조금이나마 떨쳐낼 수 있다. 그래서 승리의 경험은 중요하다. 그 한 번의 경험이 좌절에 대한 면역을 키우고 미래를 기대할 수 있게 만든다.
- 예전엔 드립 커피의 가벼운 맛이 싫었는데 요즘엔 또 나름의 매력이 있는 것 같다. 아침의 커피는 무거운 에스프레소 베이스 커피, 오후의 커피는 조금 더 가벼운 느낌의 드립 커피가 좋다. 물론 여기서 말하는 가벼움이란 단순히 맛을 가리키는 것이고, 카페인은 에스프레소보다 드립 커피에 더 많이 함유되어 있다.
3월 11일 수요일
- Udemy <iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp>의 섹션 9: iOS App Design Patterns and Code Structuring에서 배운 개념을 하나씩 복습했다.
- override func viewDidLoad() { }는 앱을 로드했을 때 맨 처음에 보여 줄 화면을 구성할 수 있는 함수다. 이 함수 안에 있는 코드는 앱을 로드했을 때 딱 한 번만 실행된다.
- 인덱스와 요소 개수의 차이. 인덱스는 0부터 시작하고 개수는 1부터 시작하기 때문에 항상 전체 개수가 마지막 인덱스보다 1이 더 많다. 인덱스와 개수를 동등한 수준에 놓고 비교하려면 인덱스에 +1을 해야 한다. 요소가 3개 있는데 인덱스 상에서 세 번째 요소를 가져오려고 하면 오류가 발생할 것이다.
- 여러 개의 버튼을 하나의 IBAction에 연결한 경우, 사용자가 어떤 버튼을 입력했는지 프로그램이 파악할 수 있어야 한다. 이를 위해 let constantName = sender.currentTitle 같은 코드를 사용한다. 사용자가 클릭한 버튼의 타이틀을 변수/상수에 담는 것이다.
- 2차원(2D) 배열은 배열 안에 배열이 있는 것을 말한다. var array = [[a, b], [c, d], [e, f]]와 같은 형태를 이루는데, array[i][j] 같은 방식으로 각 요소를 가져올 수 있다. [i]에는 바깥 배열을 기준으로 한 요소 인덱스, [j]에는 내부 배열을 기준으로 한 요소 인덱스를 입력한다.
- 좋은 코드는 각 요소가 무엇을 나타내는지 손쉽게 알아볼 수 있는 코드이다. 그런데 2D 배열의 경우, 요소 간의 관계를 이해하는 것이 어렵다. 배열의 이름 하나만으로 모든 정보를 설명하기에 한계가 있다. 그래서 2D 배열보단 구조체(Structure)를 사용하는 것이 낫다.
3월 10일 화요일
- Udemy <iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp>의 섹션 9: iOS App Design Patterns and Code Structuring을 수강했는데, 새롭게 배운 개념이 많아서 다시 짚고 넘어가야 한다. 2시간짜리 강의 하나를 온전히 내 것으로 소화하는 데 많게는 며칠이 걸린다. 처음엔 나만 이렇게 더딘 것인가 자괴감이 들기도 했지만 지금은 속도를 자랑할 시기가 아니라 조금 돌아가더라도 착실하게 기초를 쌓아올릴 때라 생각하고 너무 조급해하진 않기로 했다.
- MVC 디자인 패턴이 무척 흥미롭다. 디자인 패턴은 자바스크립트를 기반으로 한 초급 웹 개발 강의에서는 다루지 않았던 내용인데, 주어진 규칙에 따라 컨텐츠를 분류하고 정리하는 게 내가 제일 좋아하고 잘하는 일이라 매우 흥분; 잘 배워서 매력적인 코드를 짜보고 싶다.
- 오늘도 씩씩하게 산에 다녀왔는데 주변 지역의 확진자가 더 많아지고 있다는 우울한 소식이 들려온다. 이 긴 싸움은 언제쯤 끝이 날런지.
3월 9일 월요일
- Udemy <iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp>의 섹션 8: Intermediate Swift Programming - Control Flow and Optionals를 (드디어!) 완료했다. 타이머 개념이 잘 이해되지 않아 따라가는 게 쉽지 않았다. 계속 붙잡고 있는 것보다는 우선 Swift에 대한 이해도를 높인 다음에 다시 학습하는 것이 낫겠다. 왜 타이머 대신 DispatchQueue를 사용하는 게 좋은지도 다시 살펴볼 것. 삼보 전진을 위해 일보 후퇴한다..
- Swift에서는 숫자나 숫자가 담긴 변수/상수를 Int( ), Float( ), Double( ) 같은 데이터 타입으로 감싸면 해당 데이터 타입으로 변형할 수 있는데 이게 모든 경우에 다 적용되는 것은 아니다. 언제나 그렇듯 프로그래밍에서는 순서가 중요하다. 정수를 Float( )으로 감싼다고 해서 정확한 소수가 되는 것은 아니다. Float(5 / 2)의 값은 2.0인데 Float(5) / Float(2)의 값은 2.25가 되는 것도 그러한 이유에서다. 계산의 순서가 중요하다.
- 조건/반복문에서 변수를 증감하는 코드를 위아래 중 어디에 위치시키느냐에 따라서도 결과가 달라진다.
- 디버깅을 하자. 코드가 원하는 대로 구현이 되지 않을 땐 print( )를 이용하여 코드를 각 단계별로 모두 출력해본다.
- 진행바(Progress View)의 Progress 속성은 진행 상태를 나타낸다. Progress 속성의 값은 0.0~1.0이고, 데이터 타입은 Float이다. 진행된 정도 / 전체 범위로 현재의 Progress 값을 구할 수 있다. 퍼센트를 구하는 공식과 일치하나 100만 곱하지 않은 것이다(Progress는 0.0~1.0으로 이루어져 있으므로). 점 표기법을 사용하여 진행바UI아울렛이름.progress = 원하는Progress값 또는 진행바UI아울렛이름.progress = 진행된 정도 / 전체 범위 같은 코드를 작성할 수 있다.
- 주말에 CBS에서 새로 시작한 Tommy를 띄엄띄엄 봤다. 빅재미는 아니고 소소한 재미인데, 이디 팔코가 너무나 전형적인 '사람 좋은 상사' 이미지여서 기시감이 든다. 저 사람 분명히 어디서 봤는데 싶은 그런 마음.. 관리자로서 어떠한 언어를 사용해야 하고 어떤 방식으로 사람들에게 확신을 주어야 하는지 생각하게 만들어서 앞으로 좀 지켜볼듯하다.
3월 6일 금요일
- Udemy <iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp>의 섹션 8: Intermediate Swift Programming - Control Flow and Optionals를 수강했고, 딕셔너리와 옵셔널 개념을 배웠다.
- 딕셔너리는 배열과 비슷하게 사용되는데, key-value가 하나의 쌍을 이룬다. 딕셔너리에서 각 요소 값을 가져올 때는 dictionaryName["key"]와 같이 쓴다. 배열의 인덱스 번호를 key로 바꾼 것과 같다.
- 기존 딕셔너리에 새로운 키와 값을 추가할 때에는 변수를 수정하듯 새로운 키-값만 선언해주면 된다. 기존 딕셔너리를 전부 다시 쓸 필요는 없다. 기존 키-값을 수정할 때도 마찬가지다.
- 지금은 없지만 향후 어느 시점에 채워질 값을 위해 존재하지 않는 값을 변수에 담아야 하는 경우가 있다. 이러한 상태와 값을 nil이라 한다. 변수에 nil 값을 저장하기 위해서는 변수의 데이터 타입이 옵셔널이어야 한다. 옵셔널은 nil 값인 변수/상수를 출력하여 오류가 생기는 것을 방지하기 위해 존재한다.
- 옵셔널 데이터 타입의 경우, 유효한 값이 있으면 출력했을 때 Optional()이 표시되고 값이 nil이면 출력이 되지 않는다(없는 걸 어찌 출력하리).
- Xcdoe에서 변수/상수를 강제로 해제하라는(force unwrap) 오류 메시지가 뜰 경우, 해당 변수/상수의 값이 nil이라는 의미이다. 데이터 타입이 옵셔널인 변수에 !를 붙이면 옵셔널을 해제할 수 있다. 해당 변수/상수의 값이 코드 내에서 nil이 되지 않을 것임을 확신할 때 옵셔널을 해제한다.
3월 5일 목요일
- Udemy <iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp>의 섹션 8: Intermediate Swift Programming - Control Flow and Optionals를 수강했다.
- View Controller는 아래에서 위를 쳐다보는 방식이다. 따라서 맨 밑에 있는 요소가 제일 먼저 노출되고 그 위에 있는 요소는 아래 요소에 가려진다. 포토샵의 레이어와 반대되는 개념이라고 생각하면 된다.
- if-else 조건문에서는 첫 if에서 조건이 충족되면 다음 조건으로 넘어가지 않는다. if-else if-else 대신 if-if-if로 표현하면 입력된 모든 조건을 다 검사한다. 여러 조건을 동시에 만족하는 값을 구해야 하는 경우, && 연산자로 복잡하게 연결하는 것보다 if만 사용하는 것이 나을 때도 있다. 모든 윤년 조건을 만족하는 연도를 구할 때 if-if-if를 사용할 수 있다.
- 케이스가 5개 이상인 경우 if-else보다 switch 조건문을 쓰는 게 낫다. 더 보기 쉽고 빨리 돌아간다.
3월 4일 수요일
- 컴퓨터과학 전공 수업 <인터넷과 정보사회>를 4강까지 수강했다.
- 시스템 소프트웨어는 응용 소프트웨어 실행과 하드웨어 제어를 위한 소프트웨어로, 운영체제와 컴파일러, 유틸리티가 여기에 해당한다. 운영체제에는 DOS, OS/2, Windows, Unix, Linux, Mac OS 등이 있다. USB와 플러그앤플레이 기능을 최초로 지원한 것이 Windows이다. Mac OS는 Unix 기반의 OS로, GUI 방식을 도입한 최초의 개인용 컴퓨터 운영체제였다. 사실 Windows의 UI는 Mac OS의 UI를 따른 것이다.
- Swift 함수의 범위 개념을 복습했다. 어떤 함수는 다른 함수 안에서 쓰이는데 또 어떤 함수는 다른 함수 안에서는 못 쓴다고 한다. 텍스트로만 정리했을 땐 그러려니 했는데 막상 코드로 보니 헷갈렸다. 간단하게 정리하자면 문제의 함수가 어디에서 선언이 되었는지에 따라 다르다. 더 간단히 말하면 최상위 함수만 다른 함수 안이나 함수 밖에서 사용될 수 있다.
- 카드 뒤집기 앱을 만들려고 했는데 여러 개의 이미지를 중복되지 않게 무작위로 표시하는 방법을 잘 모르겠다. 아직 수련이 더 필요하다..
3월 3일 화요일
- 14시간짜리 생업을 이틀에 걸쳐 끝냈고 컴퓨터과학 전공 수업 <인터넷과 정보사회>를 2강까지 수강했다.
- 데이터는 관찰이나 측정을 통해 얻은 질적/양적 값을 의미하고 정보는 특정 문제를 해결할 수 있게 데이터를 처리한 결과물을 의미한다. 그리고 이러한 정보가 쌓여 지식이 된다. 알아볼 것: 각종 소프트웨어 마케팅 자료에 등장하는 Data insight는 이 데이터-정보-지식의 도식 중 어디에 위치할까? Insight와 Knowledge는 혼용 가능한 용어인가?
- 프로그래밍 언어는 발생 단계에 따라 1~4세대로 나뉜다. 0과 1로만 이루어져 기계가 곧바로 해석할 수 있는 기계어가 1세대 프로그래밍 언어에 해당하고 거기서 몇몇 명령어만 영어 단어로 대체한 것이 2세대 어셈블리어이다. 3~4세대 언어는 C, C++, Java, Visual Basic 등의 현대 프로그래밍 언어를 가리킨다. 1~2세대 언어는 저급 언어, 3~4세대 언어는 고급 언어로 분류되는데 여기서 저급과 고급을 나누는 기준은 언어의 품질이 아니라 사람에게 가까운(사람이 이해하기 쉬운) 정도이다. 하지만 컴퓨터는 0과 1이라는 신호만으로 동작하고 프로그래밍 언어 또한 0과 1로 표현되어야 하기 때문에 3, 4세대의 언어를 컴퓨터가 바로 이해할 수는 없다. 컴파일러와 인터프리터는 3, 4세대의 언어를 컴퓨터가 이해할 수 있는 기계어로 바꾸어 주는 역할을 한다.
'학습 노트' 카테고리의 다른 글
4월 결산 (0) | 2020.05.01 |
---|---|
4월 학습 기록 (0) | 2020.04.14 |
3월 결산 (0) | 2020.03.29 |
Xcode에서 Constraints 값이 입력되지 않는 문제 (0) | 2020.02.22 |
#100DaysofCode 챌린지 진행 기록 (3) | 2020.02.17 |