
[iOS] Floating Custom TabBarController
2023. 7. 22. 19:33
iOS/iOS
이번 포스팅에선 Floating TabBar를 구현해보고자 한다. 전체 코드는 여기에서 볼 수 있다. 처음에는 UIKit에서 제공하는 UITabBarController를 이용하고자 했다. https://stackoverflow.com/questions/65771446/how-to-create-floating-tab-bar-swift How to create floating Tab Bar Swift I'm trying to create a Pinterest style Tab Bar. Is it possible to customise UITabBar in that way or do you have to write a separate view to sit on top of everything if so how..

[Architecture Pattern] MVVM
2023. 5. 27. 17:45
iOS/Pattern
Architecture Pattern들은 Logic 측면에서 "관심사의 분리(SoC)"를 목표로 한다. 그중 MV(X) 계열의 Architecture Pattern들은 UI Logic(View)과 Business Logic(Model)을 분리를 중점으로 여겼다. UI Logic과 Business Logic의 분리로 인해, 둘 간의 중계자가 필요하게 되었고, 중계자에 따라 MVC, MVP, MVVM으로 나뉘게 된다. MVC 패턴은 중계자 역할을 Controller가 맡게 되었다. 하지만, Controller을 UIViewController가 담당하게 되면서, Controller는 View와 결합성이 강해, View의 일부 역할까지 담당하게 되었다. 이를 해결하고자, MVP 패턴에선 UIKit과 독립된 Pr..

[Architecture Pattern] SoftWare Architecture
2023. 5. 24. 11:52
iOS/Pattern
아키텍처(Architecture)란 위키피디아에 따르면 "소프트웨어의 구성요소들 사이에서 유기적 관계를 표현하고 소프트웨어의 설계와 업그레이드를 통제하는 지침과 원칙"을 의미한다. 말이 어렵지만, 아키텍쳐(Architecture)를 한국말로 직역하면 "구조"다. 즉, SW 아키텍쳐란 SW구조를 말한다. 좋은 집을 설계하기 위해 집의 구조(도면)를 잘 설게 해야 하듯이, 좋은 SW를 위해 SW 아키텍쳐를 잘 설계해야 한다. 그렇다면 좋은 SW, "좋은 품질의 SW"란 무엇일까? 일반적으로 사용자에게 좋은 서비스를 제공하는 것만으로는 "좋은 품질의 SW"라 부르지 않는다. SW의 품질은 2가지로 나뉘는데, 이는 단순히 External Quality를 만족한 것에 지나지 않는다. External Quality..

[iOS] Modularization(2) - Loose Coopling
2023. 5. 18. 01:31
iOS/iOS
"모듈화"란 Software를 각 기능별로 분할하여 설계하는 기법이다. 지난 포스팅에서 모듈화가 적용이 안된 모노리틱 앱 구조는 코드의 영향 범위를 파악하기 어렵고, 앱의 규모가 커질 경우 빌드시간이 오래 걸리게 된다. 이에 따라 Swift에서 모듈화를 진행하는 방법에 대해 알아보았다. 하지만, 이러한 물리적인 코드의 분리는 반쪽짜리 모듈화에 지나지 않는다. "좋은 모듈화"는 용도에 맞게 잘 구분된 기능을 가진 독립적인 모듈로 나누는 것이다.모듈의 독립성은 응집도와 결합도로 판단하게 된다. 모듈의 "응집도"란 모듈 내부의 기능적인 집중도를 의미한다.모듈의 "결합도"란 다른 모듈간의 상호 의존성을 의미한다. 즉, 좋은 모듈이란 응집도는 높고 결합도는 낮아야 한다. 이번 포스팅에선 모듈간의 느슨한 결합..

[OS] File System(2) - Implementation
2023. 5. 18. 00:40
CS/Operating System
File System은 Interface와 Implementation으로 나뉠 수 있다. 저번 포스팅에선 User와 File System 간의 상호작용을 위한 "Interface"를 다뤘다면, 이번 포스팅에선 실제 내부적으로 어떻게 구현되는지 "Implementation"에서 다뤄볼 것이다. Main Memory와 Disk간의 데이터 교환 단위는 "Block"인데, File System은 Disk에서 "Sequence of Block"으로 표현된다. 각 "Block"은 하나 이상의 Sector로 구성된다. Disk에는 MetaData와 File Data가 저장되어야 한다. Unix에선 inode(MetaData)를 위한 공간과 File Data를 위한 공간이 따로 할당되어 있다. inode의 경우 사이즈..

[OS] File System(1) - Interface
2023. 5. 17. 15:57
CS/Operating System
Disk의 기본 단위는 Sector이다. 이러한 Sector들을 묶어서 논리적으로 독립적인 Disk를 만들 수 있었다. 이를 Partition이라 부르며, 각 Partition은 Logical Formatting 단계를 거쳐 File System을 설치하거나 Swap-Space로 활용할 수 있다. "File System"는 SSD, Disk 등과 같은 각 저장장치에 설치되어 File을 저장하고 관리하며, 검색할 수 있는 등의 기능을 제공하는 SW이다. File System은 User 관점 혹은 저장장치 관점에 따라 2가지로 나뉠 수 있다. "File System Interface"는 File System과 사용자 간의 상호작용을 위한 추상화 계층이다. 예를 들어, 우리는 File의 실제 어떻게 저장되어 ..

[OS] I/O Systems
2023. 5. 16. 03:05
CS/Operating System
PC System에는 다양한 I/O Device가 존재한다. 예를 들어 우리는 마우스를 사용하기 위해 본체에 마우스를 연결한다. 이렇게 연결된 마우스는 Device Controller에 의해 CPU와 상호작용 할 수 있게 된다. Device Controller에는 Data를 Read & Write를 할 수 있는 "Data Register"를 가지고 있다. 마우스에서 클릭이 이루어지고, 우클릭을 하였는지 좌클릭을 하였는지 CPU에게 정보를 전달해 줄 필요가 있다. 또한, I/O Device에서 특정하게 수행해야 할 Instruction이 있다면, CPU는 Device Controller의 Regsiter에 Instruction들을 저장한다. 추가적으로 Device Controller는 I/O Device의..

[OS] Mass-Storage Structure
2023. 5. 15. 00:02
CS/Operating System
Main Memory는 휘발성이기 때문에, 영구적으로 데이터를 저장할 때는 비휘발성인 Disk에 저장하여야 한다. Hard Disk Hard Disk는 자기 패턴을 이용해 데이터를 읽고 쓴다. Hard Disk는 다음과 같이 구성 된다. Head : 데이터를 읽고 쓰는 역할을 담당한다. Disk Arm : Head를 데이터가 있는 곳으로 움직인다. Platter : 위 아래 Surface에 자기적 성질을 통해 데이터를 기록한다. Spindle : Platter를 회전 시킨다. Track : Platter에서 회전축을 중심으로 동심원이다. 하나의 Platter에 여러개 존재할 수도 있다. Cylinder : Platter가 여러 장일 때, Head가 동시에 접근하는 Track들의 집합이다. Sector :..

[OS] Virtual Memory
2023. 5. 13. 20:19
CS/Operating System
"Virtual Memory"란 Process전체가 Memory에 할당되지 않아도 실행시키도록 하는 메모리 관리 기법 중 하나이다. 즉 이를 통해, Process는 Memory Space보다 더 큰 가상 주소 공간을 할당할 수 있게 된다. 저번 포스팅에서 Physical Address와 Logical Address의 차이점을 비교하였다. "Logical Address"는 CPU 입장에서의 주소이다. Contiguous Allocation에선, Process의 시작위치를 0으로 하는 상대 주소와 (Load Time Binding, Run Time Binding) 실제 Main Memory에서의 주소인 절대 주소가 (Compile Time Binding) Logical Address가 될수 있다. 하지만, ..

[OS] Main Memory(2) - Memory Allocation
2023. 5. 11. 01:17
CS/Operating System
Process를 Memory에 할당하는 방식은 Contiguous Allocation과 Non-Contiguous Allocation방식으로 나눌 수 있다. Contiguous Allocation "Contiguous Allocation"이란, Process를 Memory의 한 곳에 연속적으로 Load하는 방식이다. Memory Protection OS와 User 모두 Memory를 사용할 수 있기 때문에, Main Memory는 OS를 위한 공간과 User Process를 위한 공간으로 나눈다. 따라서 User Process를 OS를 위한 Kernel Space를 침범하면 안되며, 다른 Process의 영역도 침범해서는 안된다. 즉, Process가 자신이 소유한 범위를 넘지 않도록 할 필요가 있다. ..

[OS] Main Memory (1)
2023. 5. 9. 16:34
CS/Operating System
File이 Executable(실행가능한) File이면 이를 Program이라 부른다. Program이 "실행 중"인 상태라면 이를 Process라 부른다. "실행 중"이란 말은 CPU에 의해 Instruction이 수행 중인 상태를 의미한다. CPU는 Main Memory와 내부의 Register에 직접 접근할 수 있기 때문에, "실행 중"인 상태로 만들기 위해선 Disk의 Program을 Main Memory로 Load하여야 한다. 즉, Program이 Process가 되기 위해선 Main Memory에 Load되어야 한다. Multistep Processing of a User Program 우선, Program이 Main Memory에 Load되기 까지의 과정을 살펴보자. Source File이 ..

[Design Pattern] DI(Dependency Injection)
2023. 5. 8. 01:10
iOS/Pattern
"의존성 주입"이란, 객체가 의존관계에 있을 때 "직접 생성"하는 것이 아닌, DIP를 적용하여 "외부에서 제공"받는 패턴을 말한다. 한 번에 이해하기 어려우니 천천히 알아보자. Dependency 대부분의 프로그램에서 여러 객체들은 협력하게 되기 때문에, 객체 사이의 의존성은 존재하게 된다. 예를 들어, User의 정보를 Networking을 통해 가져와 이를 화면에 출력시키는 객체가 있다 하자. class UserRepository { func fetchUser() -> User { ... return User(name: "Jung", id: "111") } } class UsersPresentation { private let usersRepository = UserRepository() func ..