분류 전체보기
[Swift] 에러처리(Error Handling)
Error(에러) 에러의 종류 컴파일 오류: 컴파일러가 코드가 잘못되었음을 알려준다(문법적 오류/에러) 런타임 오류 : 다양한 이유로 앱이 실행하는 동안 발생한다 ==> 앱이 꺼진다. 에러처리가 필요한 이유 런타임에러는 프로그램이 실행하는 동안 발생하며, 크래시(앱 강제 종료)가 발생한다. 서버와 통신하는 앱등을 만들 때 정보를 서버에 요청하고, 서버는 데이터를 보내준다. 실제 앱에서 데이터를 받아오지 못한다면 어떻게될까? 데이터를 요청하는 함수가 제대로 실행이 되었다면? 함수의 결과로 데이터를 가져올 것이다. 하지만 데이터를 제대로 가져오지 못해서 에러가 발생하면 ? 앱이 꺼질 수 있다. 그 이유론 수많은 이유가 있을 수 있다. 네트워킹오류, 서버다운이슈 등.. 수 많은 경우의 수가 있다. 그래서 앱이..
[Swift] ARC와 메모리누수(Memory Leak), weak, unowned
ARC란 자동으로 메모리 관리를 해주는 친구 객체에 대한 참조카운트를 관리하고 0이 되면 자동으로 메모리해제 메모리 누수가 발생할 수 있다. 옛날 Objective-C에선 MRC => 수동으로 관리 Compile time할때 실행된다. 과연 Compile time에 실행되는 ARC가 동적으로 할당되는 메모리의 refrence count를 하고 메모리관리를 어떻게할까? 사전에 알아야 할 지식은 MRC이다. MRC 엣날 objc에선 retain. release, sutorelease등을 통해 수동으로 메모리 관리를 했다. class Person{ let name: String init(name: String){ self.name = name } } let clamp = Person(name: "clamp")..
[Swift]. 함수형 프로그래밍(Functional Programming)
함수형 프로그래밍을 알기 전에.. 명령형 프로그래밍 변수를 지정하고 다양한 for문, if문들을 써서 어떻게 구현해 낼까.. 라는 고민, 설계를 하는게 명령형 프로그래밍이다. 예) var sum = 0 for num in 배열{ sum += num } person.name = "clamp" 함수형 프로그래밍 함수를 쓰는것. ==> 다양한 함수들이 구현되어있고 이 함수들을 어떻게 조합해서 구현해 낼까.. 라는 고민, 선언하는게 함수형 프로그래밍이다. 함수(map, filter, reduce)등 을 이용해서 사이드 이펙트가 없도록 선언형으로 프로그래밍 하는것이다. 예) 배열.map{ 클로저 } .filter{ 클로저 } .reduce{ 클로저 } //함수를 이용해서 선언형으로 프로그래밍하는 것 *추가 자료 ..
[iOS]. MVVM 정리
MVC 정리 MVC패턴에서 사용자의 입력을 받게되는 부분은 Controller이다. Controller는 사용자의 입력을 받으면 Model에 데이터를 요청하거나, 데이터를 변형하거나 작업을 한다. 이후 Model은 View를 업데이트한다. View는 그리하여 Model과의 *의존성을 갖게된다. View와 Controller역시 데이터를 주고 받는 때들이 있기 때문에 의존성이 생길 수 있다. 가장 큰 문제는 View와 Model의 의존성이 생기는 것! *의존성: 서로 다른 객체 사이에 의존 관계가 있는것. 의존하는 객체가 수정되면 다른 객체도 영향을 줄 수 있다 iOS에선 사실 View와 Controller는 떼어놓기가 힘들다? iOS의 viewController라는 클래스 파일에 예를 들어 화면에 버튼을..
[Swift]. self vs Self
self 클래스/구조체 내에서 해당 인스턴스(자기자신)을 가르킴 프로토콜에서의 Self사용(프로토콜을 채택하는 해당 타입을 가르킴) 프로토콜 내에서 Self를 선언하면 채택한 타입을 의미한다. //BinaryInteger이란 프로토콜의 확장 extension BinaryInteger{ func squared() -> Self{ //BinaryInteger이란 프로토콜을 채택한 해당타입(Int, UInt등등..) return self * self } } // 위의 Self를 Int나 UInt로 적는다면 BinaryInteger을 채택한 모든 타입을 확장해줘야한다 아래처럼 /* extension BinaryInteger { func squared() -> Int { return self * self } } ..
[Swift]. Method Dispatch
Method Dispatch 실제로 Method는 CPU에대한 명령어이며, 실제론 코드 영역에만 존재한다. 그렇기 때문에 코드 영역에 있는 메서드를 실행시키려면 메서드 주소가 필요하다. 그런데 그 메서드 주소를 기억하고, 어떤 메서드를 실행시킬지에 관련된 내용이다. 한 마디로 "어떤 메서드를 부를지 선택하는것" Swift가 함수(메서드)를 실행시키는 방법은 3가지가 있다. 컴파일타임/런타임 컴파일타임: 작성된 소스코드는 컴파일이라는 과정을 통해 기계어 코드로 변환되어 실행 가능한 프로그램이 된다. 이러한 편집 과정을 컴파일타임(Compiletime)이라고 부른다. 런타임: 컴파일과정을 마친 프로그램이 사용자에 의해 실행되며, 이러한 프로그램이 동작되는 때를 런타임(Runtime)이라 부른다 @컴파일타임 ..
[Swift]. 프로토콜지향 프로그래밍(POP)
프로토콜 지향 프로그래밍(Protocol - Oriented - Programming) 객체지향 프로그래밍 장점 - 상속을 이용한 코드의 재사용성 단점 - 하나의 클래스만 상속이 가능하다.(다중 상속 불가능) - 상위클래스의 메모리 구조를 따라갈 수 밖에 없음.(필요하지 않은 속성/메서드도 상속된다.) - 클래스(참조타입)에서만 사용 가능 프로토콜 지향 프로그래밍 스위프트의 표준 라이브러리의 타입과 관련된 것을 살펴보면 대부분 구조체로 구현이 되어있다. 객체지향 프로그래밍 패러다임에 기반을 둔 언어는 대부분 클래스의 상속을 사용해 타입에 공통된 기능을 구현한다. 상속도 되지 않는 구조체로 다양한 공통 기능을 가질수 있는가.. 이는 프로토콜과 익스텐션으로 이루어져있다. 프로토콜은 특정 역할을 수행하기 위한..
[디자인 패턴] 싱글톤 패턴 (Singleton Pattern) feat. Swift
싱글톤 패턴 (Singleton Pattern) - 앱 구현시에, 유일하게 한개만 존재하는 객체가 필요한 경우에 사용 (특정한 유일한 데이터/관리 객체가 필요한 경우) - 한번 생성된 이후에는 앱이 종료될때까지, 유일한 객체로 메모리에 상주 - 유일하게 한 개만 존재하는 객체이기 때문에 타입속성과 유사하다. class Singleton { // 타입 프로퍼티(전역변수)로 선언 static let shared = Singleton() // 자신의 객체를 생성해서 전역변수에 할당 var userInfoId = 58132 } Singleton.shared //처음 접근하는 순간 shared객체 생성 let object = Singleton.shared //같은 싱글톤을 가리키게 할 수 있다. object.us..
[Swift]. 속성 감시자(Property Observer)
속성 감시자(Property Observer) 저장속성을 관찰하는 역할 class Profile { // 일반 저장 속성 var name: String = "이름" // 저장속성 + 저장 속성이 변하는 시점을 관찰하는 메서드 var statusMessage: String = "기본 상태메세지" { //저장속성 willSet(message) { //속성감시자, 바꿀 값이 파라미터로 전달 print("메세지가 \(statusMessage)에서 \(message)로 변경될 예정입니다.") print("상태메세지 업데이트 준비") } didSet(message){ //속성감시자, 바뀌기 전의 값이 파라미터로 전달 print("메세지가 \(message)에서 \(statusMessage)로 변경되었습니다") pr..
클래스(class) vs 구조체(struct), 객체지향프로그래밍 feat. Swift
클래스 클래스는 참조타입(RefrenceType)이다. 힙의 영역에 실제 데이터를 저장하고 스택영역에선 힙영역의 주소를 가리킨다. 그래서 주소를 참조하는 참조타입이다. 복사시 값을 복사하는게 아니라 주소를 전달해서 동일한 데이터를 가리키게 만든다. (메모리 변경 X) 그러므로 복사된 객체의 값을 바꾸면 원본값도 함께 바뀐다. 힙(Heap)의 공간에 저장하므로, ARC시스템을 통해 메모리를 관리한다. class Person{ var name = "사람" } var p = Person() //p에 담긴값 주소: x123124 var p2 = p //p2에 담긴값 주소: x123124 //p와 p2는 클래스이므로 같은 주소값을 갖는다. p.name //사람 p2.name = "미진" //미진 p.name //..