분류 전체보기

    [iOS] Core Data는 무엇인가.

    코어데이터 코어데이터란 넓은 의미에서 앱의 모델계층이자, 데이터베이스, ORM등의 기능을 가진 객체 그래프 관리 프레임워크이다. CoreData는 경량의 고성능 관계형 데이터베이스 엔진인 SQLite를 기반으로 구축되었고 개발자가 복잡한 SQL문을 작성하지 않고도 데이터베이스와 상호작용 할 수 있도록 직관적이고 사용하기 쉬운 인터페이스를 제공한다. 객체 그래프 관리 프레임워크 객체 그래프란 메모리에 있는 객체들과 객체들 간의 관계를 말한다. 예를 들어 Person이라는 객체와 Family라는 객체가 이와 같은 관계로 메모리에 올라간다면 객체들이 어떤 관계를 갖고 있는지를 객체 그래프라고 하는 것이다. 예를 들어 실제 앱의 예시로 보자면 SNS앱에서 게시글이 있고, 게시글에는 댓글들이 있을텐데 두 객체의 ..

    [iOS] - Realm을 활용한 Widget(위젯)

    Realm과 Widget(위젯) WWDC 에선 Personalized하고 glanceable한 위젯이 좋은 위젯이라고 한다. personalized한 위젯이란? 날씨 위젯처럼 개인이 사는 지역마다 다른 정보를 알려줘야한다. 이런 개인에 따라 맞춤 정보를 제공하는 것을 Personalized라고 한다. glanceable한 위젯이란? 어떤 동작을 하지 않아도 바로 간편하게 원하는 정보를 확인할 수 있는 것을 glanceable한 위젯이라고 한다. WWDC에서 강조한 부분은 위젯은 작은 앱이 아님(Widget are not mini-apps)이다. 위젯은 사용자가 필요한 정보를 볼 수 있게 해주는 전광판이라고한다. 하지만 여러 위젯들을 보면 아래처럼 버튼이 있는 것을 볼 수 있는데 실질적으론 위젯 내부에서 ..

    RxSwift - Single, Maybe, Completable

    Single, Maybe, Completable은 다른 옵저버블보다 좁은 범위의 옵저버블이다. 선택적으로 사용할 수 있는데, 이런 좁은범위의 옵저버블을 사용하는 이유는 코드 가독성을 높이는데 있다. Single Single은 두가지 이벤트만 방출한다. .success(): next event와 complete 를 합친것과 같다. 값을 포함해서 방출한다. .error() 파일 저장이나 다운로드, 디스크에서 데이터 로딩과 같이 기본적으로 값을 산출하는 비동기적 연산에 사용되게된다. 사진을 저장하는 옵저버블이 있을 때 저장을 했느냐, 에러가 났느냐 처럼 정확히 한가지 요소만을 방출하는 연산자를 매핑할 때 유용하다. 정확히 한가지 요소만을 방출할 수 있다. NextEvent와 Completed Event를 합친..

    [iOS] Realm과 사용법

    Realm이란? 오픈소스이며 모바일에 최적화된 라이브러리이다. 객체지향 데이터베이스로, iOS, Android, React Native등 다양한 플랫폼에서 사용할 수 있으며 로컬에 저장된다. UserDefault는 간단한 데이터만 저장하는 용도이다(id, pw, 간단한 설정과 같은..) 큰 용량을 저장하기엔 무리가있다. ORM이 아닌 *데이터 컨테이너 모델을 사용하고 데이터 객체는 Realm에 객체로 저장된다. *컨테이너가 뭘까. 컨테이너란 OS상에 논리적인 구획(컨테이너)을 만들고, 어플리케이션을 작동시키기 위해 필요한 라이브러리나 어플리케이션등을 하나로 모아, 별도의 서버인 것처럼 사용할 수 있게 만든것이다. OS의 리소스를 논리적으로 분리시키고 여러개의 컨테이너가 공유하여 사용한다. 컨테이너는 오버..

    [Swift] 연산자 메서드와 사용자 정의 연산자

    연산자 메서드 struct Vector2D{ var x = 0.0 var y = 0.0 } let vector1 = Vector2D(x: 3.0, y: 1.0) let vector2 = Vector2D(x: 1.0, y: 0.5) extension Vector2D{ // static(타입)메서드인 이유는 서로 다른 인스턴스를 더하기 때문에 타입 메서드이다. // 중위연산자⭐️(infix)는 생략이 가능하다 static func + (lhs: Vector2D, rhs: Vector2D) -> Vector2D{ return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } // let plusVector = vector1 + vector2 static func - (lhs..

    [Swift] 비트연산자

    비트연산 메모리 비트단위로 직접적인 논리연산을 수행하고, 비트 단위 이동시에 사용하는 연산 비트연산은 연산속도가 빠르다. 직접적으로 메모리의 실제 비트를 컨트롤하기 때문이다. 짧은 코드로 복잡한 로직을 구현할 수 있다. 비트 논리 연산자 [ ~ ] Bitwise Not Operator ~a 부정 연산자, 기존의 메모리 비트를 반전시킨다. let a: UInt8 = 0b0000_1111 // 15 let b1 = ~a // 0b1111_0000 // 240 [ & ] Bitwise And Operator a & b 비트 논리 곱 연산자. let a: UInt8 = 0b0111_1000 // 120 let b: UInt8 = 0b1011_0111 // 183 let c = a & b//0b0011_0000 ..

    [Swift] 단락평가와 사이드이펙트

    단락평가 논리평가식에서 결과 도출에 필요한 최소한의 논리식만 평가한다. true || true // 왼쪽부터 평가하는데, ||(or)로 연결되어있기 때문에 뒤의 표현식이 true or false 에 상관없이 항상 true가 되기 때문에 뒤의 표현식은 검사하지 않는다. false && true // 이도 마찬가지로 &&(and)로 연결되어있기 때문에 뒤의 표현식인 true는 평가하지 않는다. 사이드이펙트 사이드 이펙트의 사전적인 의미는 '원래 의 목적과 다른 효과 또는 부작용'이라는 상태를 말한다. 마치 고혈압 약을 먹었는데 머리가 풍성해지는것과 같은..? 꼭 부정적인일만은 아니다. 하지만 좋은 결과를 나타낸다고해서 좋은 사이드 이펙트는 없다. var some = 0 func checking() -> Bo..

    객체간의 인터페이스를 추상화한다?(Swift)

    무슨소린지 못알아듣겠어서 공부하고 정리. 인터페이스 Swift에서 인터페이스는 Protocol이다. JAVA에는 인터페이스가 존재하는데, Swift의 Protocol과 비슷한 기능을 한다. 자바의 인터페이스와 프로토콜은 비슷하지만 차이가 있다. 기본값을 설정한다 ? 자바의 인터페이스는 기본값을 설정할 수 있다고 한다. Swift의 Protocol은 기본값을 설정할 수 없다. 요구사항의 구현정도? 자바의 인터페이스는 요구한 구현을 모두 정의해야한다. Swift의 Protocol은 optional로 선택 구현이 가능하다. 객체간의 인터페이스 추상화 객체간의 인터페이스를 추상화한다는 것은, 객체간의 상호작용에서 필요한 기능들을 분리하고 명확하게 정의한다는 것이다. 예를 들어, 학생 정보를 저장하고 관리하는 프..

    [Swift] - 프로토콜의 연관타입(associatedtype)과 제네릭

    제네릭은 특히 프로토콜에서 빛을낸다. 프로토콜에 제네릭이 적용되면 다형성을 구현하는데 큰 도움이 된다. 특정 프로토콜이 서로 다른 타입에 더욱 자유롭게 채택할 수 있도록 하여 통일성을 높이고, 재활용성도 함께 높아진다. 하지만 프로토콜 자체가 제네릭 파라미터를 가질 순 없다. 프로토콜은 메서드나 속성을 구체화할 의무가 없고 최소 요구사항만을 갖기 때문이다. 프로토콜에서 타입이 제네릭하게 메서드나 속성을 구현할 수 있도록 연관타입(associatedtype)을 활용한다. 연관타입을 요구사항으로 갖는 프로토콜을 채택하면 해당 연관타입을 각 타입에서 구체화할 수 있고 그 전까지는 명시되지 않는다. 연관타입과 제네릭을 함께 사용 protocol Container{ associatedtype Item // 연관 ..

    [Swift] 제네릭(Generic)

    제네릭 제네릭을 이용해 코드를 구현하면 어떤 타입에도 유연하게 대응할 수 있다. 제네릭으로 구현한 기능과 타입은 재사용하기 쉽고, 코드의 중복을 줄일 수 있다. 타입 파라미터는 함수 내부에서 타입의 이나 리턴형으로 사용된다. 관습적으로 T를 사용하지만 사용하지만 다른문자를 사용해도 되면 Upper camel case를 사용한다. 처럼 2개이상을 선언해도 된다. 제네릭이 필요한 이유 var numA = 10 var numB = 20 print(numA, numB) // 10 20 // 두 숫자를 서로 교환하는 함수 func swapInt(_ a: inout Int, _ b: inout Int){ let tmp = a a = b b = tmp } swapInt(&numA, &numB) print(numA, ..