드디어 30일 챌린지가 끝이 났다! 패스트캠퍼스에서 강의로 진행한 30일 챌린지 최종 후기를 다음 순서로 몇자 적어보고자한다. 강의를 듣게된, 선택한 이유 강의 듣기 전 나의 컴공 기본 지식 상태 강의를 듣고난 소감 강의의 장단점 강의를 추천하고 싶은 대상 패스트캠퍼스 30일 챌린지를 마치며 를 듣게 된, 선택한 이유 2020년 겨울, 윈도우 프로그래밍 개발자로 개발을 1년 정도 하였을 때이다. PC 소프트웨어 그리고 회사의 제품 특성상 특수 목적을 가진 사람들만이 우리가 만든 소프트웨어를 사용하는데, 이부분이 아쉬웠던지라 좀 더 사람들에게 접근성이 높은 제품을 개발해보고 싶다는 마음이 들었다. 그러곤 생각을 해봤을 때 모든 사람이 모바일 기기를 소유하고 있기 때문에 앱 개발이 접근성이 높다는 판단을 하..
UITableView 거의 대부분의 앱이 리스트 형태로 아이템을 나열해서 보여주고 있다. 이때 iOS에서 사용하는 방법은 UITableView이다. UITableView는 여러 아이템을 리스트 형태로 보여주고 싶을 때 사용한다. UITableView는 컬럼이 오직 하나이다. TableViewCell을 통해 아이템의 내용을 표시하고 구성한다. TableViewCell은 Recycle하여 사용한다. 즉 스크롤할 때마다 전에 생성해놓은 TableCell 객체를 이용하여 사용하는 것이다. UITableView Protocol 테이블뷰 서비스를 사용하기 위해 해야할 일 테이블뷰 셀은 몇개? 테이블뷰 어떻게 보여줄까? 테이블뷰 셀 클릭하면 어떻게 반응할까? UITableViewDataSource - 테이블뷰의 셀이..
designated initialization(지정 이니셜라이져) vs. convenience initialization(간편 이니셜라이져) 이니셜라이저의 3가지 규칙 DI는 자신의 부모의 DI를 호출해야한다. CI는 같은 클래스의 생성자를 꼭 하나 호출해야한다. CI는 궁극적으로는 DI를 호출해야한다. DI는 자신의 부모의 DI를 호출해야한다. // 학생인데 운동선수 class StudentAthlete: Student { var minimumTrainingTime: Int = 2 var trainedTime: Int = 0 var sports: [String] init(firstName: String, lastName: String, sports: [String]) { // Phase1 self.sp..
생성자는 다음과 같이 사용할 수 있다. // 학생인데 운동선수 class StudentAthlete: Student { var minimumTrainingTime: Int = 2 var trainedTime: Int = 0 var sports: [String] init(firstName: String, lastName: String, sports: [String]) { // Phase1 self.sports = sports super.init(firstName: firstName, lastName: lastName) //Phase2 self.train() } func train() { trainedTime += 1 } } 만약 Phase1에서 인스턴스 메소드를 호출하게 되면 다음과 같은 에러 메시지를 띄..
생성자 이해하기 자식 클래스는 부모클래스와는 다른 형태의 생성자를 만들 수 있다. stored property를 선언하면 객체를 생성하는 시점에 프로퍼티는 초기화가 되어있어야 한다. 따라서 선언할 때 초기화를 해주거나, 생성자를 통해서 초기화를 해줘야 한다. 생성자의 규칙이 있는데, 자식 클래스의 stored property를 초기화해주고 난 뒤에 부모 클래스의 init()을 호출하여 부모 클래스의 stored Property를 초기화 해줘야 한다는 것이다. Initialization Swift에서 인스턴스를 생성시에 모든 stored property의 값은 초기화 되어야 한다. 자신뿐만 아니라 부모의 stored property도 객체 생성시 초기화 되어야 한다. 이때 부모 클래스의 초기화는 자식 클래..
상속은 언제 하면 좋을까? 장점: 중복되는 코드를 제거할 수 있다. 단점: 상속의 깊이가 깊어지면 유지보수가 어려워진다. 짬에서 나오는 바이브가 필요한 영역인 것 같다. 즉 개발 철학이 필요하다. Single Responsibility(단일 책임) 클래스는 단 하나의 책임만 지면 된다. 한가지 일에 집중해야한다. 클래스가 너무 많은 일들을 책임지게 되면 정체성도 모호해지고 유지하기도 어려워진다. Type Safety (타입이 분명해야할 때) 학생이더라도 이 학생이 어떤 역할을 하는지 그 타입이 분명해야할 때 사용할 수 있다. 예를 들어 학생 중에서도 미술을 하는 학생, 운동을 하는 학생 등이 있는데 이들이 무엇을 하는지 그 타입을 알고 싶을 때 상속을 통해 그 타입을 구분할 수 있다. Shared Bas..
상속의 규칙 자식은 한개의 super class만 상속받을 수 있다. 부모는 여러 자식들을 가질 수 있다. 상속의 깊이는 상관이 없다. 1. 자식은 한개의 super class 즉 한개의 부모 클래스만 가질 수 있다. 2. 부모 클래스는 여러 자식 클래스를 가질 수 있다. 3. 상속의 깊이는 상관이 없다. 깊이는 얼마든지 깊어져도 괜찮다는 것이다. Student is Person이므로 Student 는 Person class를 상속받을 수 있다. 이를 Swift 코드로 구현해보면 다음과 같다. struct Grade { var letter: Character var points: Double var credits: Double } class Person { var firstName: String var ..
Struct vs. Class 언제, 무엇을 쓸까? 이럴때 Struct를 쓰자! 두 object를 "같다, 다르다"로 비교해야 하는 경우 Copy된 각 객체들이 독립적인 상태를 가져야 하는 경우 코드에서 오브젝트의 데이터를 여러 스레드 걸쳐 사용할 경우 각 쓰레드가 유니크한 인스턴스를 가지고 있어서, 한 객체에 여러 쓰레드가 접근했을 때 발생할 수 있는 잠재적인 위험을 피할 수 있다. 이럴 때 Class를 쓰자 두 object의 인스턴스 자체가 같음을 확인해야 할 때 하나의 객체가 필요하고, 여러 대상에 의해 접근되고 변경이 필요한 경우 단순하게 이야기 해보자 일단 Struct로 쓰자 Swift는 structure를 많이 사용한다. Swift에서는 앞서 배웠던 string, array, dictionar..
Class Structure 설명할 때 구조체는 서로 관계 있는 속성들을 묶어서 표현하는 오브젝트라고 했었다. (Object = Data + Method) 그리고 Object는 Structure와 Class 둘 중 하나의 방법으로 구현된다고도 했었다. Class는 서로 관련 있는 속성들을 묶어서 표현하는 Object이다. 그런데 이제 Heap을 곁들인 Reference type으로... Class는 Reference type이다. 그리고 heap 메모리 영역에 생성된다. (Structure는 value type이고 stack에 생성된다) Stack Heap Fast - value type을 저장한다. - 시스템에서 당장 실행해야하거나, tight 하게 컨트롤하고 관리되어야 하는 경우. - 함수 내에 선언..