# 문제 만들기
## 코비, 맥스, 레드망고
---
## 🤔 최종 문제
- [x] ### 1 - 코비 1번(깃,깃헙)
- [x] ### 2 - 맥스 2번(NSCache)
- [x] ### 3 - 망고 1번(LLDB)
- [x] ### 4 - 코비 4번(타입(일반화/추상화/캡슐화/은닉화))
- [x] ### 5 - 맥스 5번(RDBMS)
- [x] ### 6 - 망고 2번(AppDelegate)
- [x] ### 7 - 코비 2번(Swift - Optional)
- [x] ### 8 - 맥스 6번(Drawing Cycle)
- [x] ### 9 - 망고 5번(ARC)
- [x] ### 10 - 코비 5번(스크롤뷰)
- [x] ### 11 - 맥스 3번(iOS File System)
- [x] ### 12 - 맥스 9번(CoreData)
- [x] ### 13 - 코비 9번(SOLID)
- [x] ### 14 - 망고 6번(UIGestureRecognizer)
- [x] ### 15 - 망고 7번(UIGestureRecognizer)
- [x] ### 16 - 코비 8번(프로토콜)
- [x] ### 17 - 맥스 4번(ARC - 순환참조)
- [x] ### 18 - 망고 9번(Dynamic,Static Dispatch)
---
## 코비
- [ ] ### Git, Github
- pull을 실행하면, 원격 저장소의 내용을 가져와 자동으로 병합 작업을 실행하게 됩니다.</br>그러나 단순히 원격 저장소의 내용을 확인만 하고 로컬 데이터와 병합은 하고 싶지 않은 경우에는 이 명령어를 사용할 수 있습니다.</br>여기서 이 명령어는 무엇일까요?
- 이 명령어를 실행하면, 원격 저장소의 최신 이력을 확인할 수 있습니다.</br> 이 때 가져온 최신 커밋 이력은 이름 없는 브랜치로 로컬에 가져오게 됩니다. 이 브랜치는 'OOOO_HEAD'의 이름으로 체크아웃 할 수도 있습니다.</br>여기서 OOOOO은 무엇일까요?
- 소문자로 써주세요~
- 정답 : fetch
- 해설
- fetch 명령어는 원격저장소에 있는 변경내역들을 노컬저장소로 pull하기 전에 변경된 내열들만 가져와서 확인시켜주는 기능입니다.
- 원격저장소에 있는 내용을 pull 하기 전에, 어떠한 변경 내역들이 있는지 변경 내역에 대한 로그를 확인하고 결정할 수 있습니다.
- fetch는 원격 저장소의 최신 이력을 확인할 수 있으며 최신 거밋 이력은 이름 없는 브랜치로 로컬에 가져오게 됩니다.
- [ ] ### Swift
- 1 ) 이것은 Swift Standard Libray입니다.</br> 이것은 Enumeration으로 만들어졌습니다.</br> 이것은 래핑된 값 또는 값의 부재를 나타내는 형식입니다. 이것은 무엇일까요?
- 소문자로 써주세요 ~
- 정답 : optional
- 해설
- optional은 nil을 사용할 수 있는 타입과 없는 타입을 구분하기 위함이며, nil을 사용할 수 있는 type을 optional type이라고 부릅니다.
- nil 이라는 값을 가질 수 있으면 optional type이고, 이 optional type을 선언할 땐 타입 옆에 ?(물음표)를 붙입니다.
- [Optional Docs](https://developer.apple.com/documentation/swift/optional)
### CS
- 1 ) CPU에 관련된 설명 중 옳지 않은 것을 골라주세요.
- 1 ) CPU는 메모리에 저장된 값을 읽어 들이고, 해석하고, 실행하는 장치입니다.
- 2 ) CPU 내부에는 ALU, 레지스터, 제어장치가 있습니다.
- 3 ) CPU는 메인보드 내 시스템 버스와 연결되어 있습니다.
- 4 ) CPU는 메모리보다 크기가 크고 전원이 꺼져도 저장된 내용을 잃지 않는 메모리를 보조할 저장 장치입니다.
- 정답: 4번
- 해설
- 4번은 보조기억장치에 대한 설명입니다.
- [ ] ### 타입(일반화/추상화/캡슐화/은닉화)
- 다음 설명으로 옳은 것을 골라주세요.</br>"iOS 프로그래밍, 특히 Swift에서의 타입의 이것은, 구체적인 데이터 타입의 세부사항에 의존하지 않고 일반적이고 유연한 코드를 작성하는 데 초점을 맞춥니다.</br>타입의 이것을 사용하면 다양한 데이터 타입에 대해 동일한 연산을 수행할 수 있게 되며, 이는 코드의 재사용성과 확장성을 향상시킵니다.</br>iOS 프로그래밍 관점에서의 이것과 관련된 핵심적인 개념은 프로토콜, 제네릭, 타입 알리아스, 프로토콜 익스텐션이 있습니다."
- 1 ) 일반화
- 2 ) 추상화
- 3 ) 캡슐화
- 4 ) 은닉화
- 정답 : 2번
- 해설
- 1번 : 한 클래스에서 정의된 속성이나 메서드를 다른 클래스에서 재사용 할 수 있도록 합니다. 이를 통해 중복된 코드를 최소화학소 유지 보수를 용이하게 합니다, 기존의 클래스를 변경하지 않고, 새로운 기능이나 특성을 추가하려 할 때 상속을 통해 쉽게 확장할 수 있습니다, 부모 클래스의 참조를 통해 다양한 자식 클래스의 인스턴스를 참조할 수 있게 함으로써, 유연하고 확장 가능한 코드를 작성하는 데 도움을 줍니다.
- 3번 : 객체의 내부 상태를 직접적으로 접근하거나 변경하는 것을 제한하므로, 데이터의 무결성과 안정성을 보장할 수 있습니다. 사용자나 다른 개발자가 해당 클래스나 객체의 내부 구현을 알 필요가 없이 사용할 수 있게 합니다. 이는 코드의 변경이 필요할 때 유연성을 제공하며, 내부 구현을 바꾸더라도 외부 API는 유지될 수 있게 합니다. 객체는 필요한 메서드와 프로퍼티만을 외부에 노출함으로써, 사용자에게 명확한 사용 인터페이스를 제공합니다.
- 4번 : 클래스나 객체의 중요한 데이터나 메서드가 외부에서 잘못 사용되거나 변형되는 것을 방지합니다. 외부에서 사용할 필요가 없는 내부 메서드나 프로퍼티를 숨김으로써 클래스나 모듈의 사용법을 간결하고 명확하게 만듭니다. 내부 구현을 변경해야 할 경우, 해당 구현이 외부로부터 잘 숨겨져 있다면 그 변경이 외부 코드에 영향을 미치는 범위를 줄일 수 있습니다.
- [ ] ### UIKit
- 저를 맞춰주세요.
- "저는 UITableView 및 UITextView를 포함한 여러 UIKit 클래스의 부모랍니다 :)"
- "저는 콘텐츠를 프레임에 맞게 위,아래 또는 오른쪽 왼쪽으로 움직일 수 있으며, 손가락의 움직임을 추적하고 그에 따라 원점을 조정한답니다 :)"
- "저는 포함된 뷰를 움직일 수 있으며 확대/축소를 허용하는 뷰입니다 :)"
- 정답 : 스크롤 뷰
- 해설
- iOS 개발세어 사용되는 기본 뷰 컴포넌트 중 하나로, 내용이 뷰의 경계를 넘어갈 경우 사용자에게 스크롤 기능을 제공하여 내용 전체를 볼 수 있게 해줍니다. 즉, UIScrollView 는 큰 콘텐프를 화면에 맞게 스크롤 하여 표시할 수 있게 해주는 컨테이너 역할을 합니다.
- [UIScrollView](https://developer.apple.com/documentation/uikit/uiscrollview)
### MVC, Design Patterns
- MVC 패턴에서 다음 역할 설명과 일치하는 영역을 골라주세요.
- "앱의 데이터와 비즈니스 로직을 갖고 있는 영역입니다."
- 1 ) Controller
- 2 ) View
- 3 ) Model
- 정답: 3번
- 해설
- Model: 애플리케이션의 데이터와 비즈니스 로직을 관리합니다.
- 데이터 저장소와 상호작용
- 비즈니스 로직 실행
- 애플리케이션의 상태 변경을 관찰할 수 있는 메커니즘 제공
- View: 사용자에게 보여지는 UI 요소들을 나타냅니다.
- 사용자 인터페이스 요소를 표시
- 사용자 액션을 감지
- Controller: Model과 View 사이의 중재자 역할을 합니다.
- View에서 발생한 사용자의 액션을 해석하고, 적절한 비즈니스 로직을 Model에 요청
- Model의 변경을 관찰하고, 필요한 UI업데이트를 View에 지시
- 데이터 흐름과 애플리케이션 로직을 조정
- [ ] ### 프로토콜
- 다음은 무엇을 설명하는 것일까요?
- "어떤 기능에 적합한 특정 메서드, 프로퍼티 및 기타 요구 사항의 청사진을 의미합니다."
- "이것은 클래스, 구조체, 열거형에 의해 채택되며, 이것에 정의된 요구사항의 실제 구현을 제공합니다."
- "이것의 요구 사항을 모두 충족하는 모든 유형(클래스/구조체/열거형)은 해당 OOOO에 부합하다고 합니다."
- 정답 : 프로토콜(protocol)
- 해설
- 프로토콜은 메서드, 프로퍼티, 기타 요구사항들의 청사진을 정의합니다.
- 프로토콜 자체로는 기능적 구현을 포함하지 않지만, 다른 타입에서 이 프로토콜을 채택(adopt)하면 그 타입은 프로토콜에 정의된 요구사항을 모두 구현해야 합니다.
- 다향한 타입이 하나의 프로토콜을 채택할 수 있기 때문에, 코드의 유연성과 재사용성이 증가합니다.(유연성)
- 프로토콜을 채택한 여러 타입을 하나의 프로토콜 타입으로 다룰 수 있습니다. 이를 통해 다양한 타입들에게 동일한 인터페이스를 제공할 수 있습니다.(다형성)
- 구체적인 타입에 의존하지 않고 프로토콜에만 의존함으로써, 각 구성 요소간의 연결을 약화시키고 유닛 테스팅을 쉽게 만듭니다(의존성 분리)
- [ ] ### 9️⃣ SOLID
- 다음은 SOLID 원칙 중 어떤 원칙일까요?
- 클라이언트는 자신이 사용하지 않는 인터페이스에 의존해서는 안된다는 원칙입니다.
- 이 원칙은 인터페이스를 작은 단위로 분리하여 클라이턴트가 필요로하는 기능만 포함된 인터페이스에 의존하도록 하는 것을 목표로 합니다.
- 이 원칙을 통해 유연성, 재사용성, 응집성을 개선하고, 코드 간 결합도를 낮추는데 도움이 됩니다.
- 이 원칙을 준수하는 설계를 위해 "인터페이스 분리", "인터페이스 분리를 위한 추상화", "의존성 주입"과 같은 접근 방법을 사용할 수 있습니다.
- 1 ) 단일 책임 원칙 : SRP(Single Responsibility Principle)
- 2 ) 개방 - 폐쇄 원칙 : OCP(Open-Closed Principle)
- 3 ) 리스코프 치환 원칙 : LSP(Liskov Substitution Principle)
- 4 ) 인터페이스 분리 원칙 : ISP(Interface Segregation Principle)
- 5 ) 의존관계 역전 원칙 : DIP(Dependency Inversion Principle)
- 정답 : 4번 인터페이스 분리 원칙
- 해설
- 1. SRP : 하나의 클래스는 하나의 택임만을 가져야 한다는 원칙, 이 원칙은 코드의 유지보수성, 확장성, 재사용성을 향상시킵니다.
- 2. COP : 소프트웨어의 구성 요소는 확장에 대해서는 열려 있어야 하며, 변경에 대해서는 닫혀 있어야 한다는 원칙, 이 원칙은 앱의 유연성, 확장성을 보장합니다.
- 3. LSP : 하위 타입은 기본 타입의 객체를 대체할 수 있어야 한다는 원칙, 클래스 상속과 관련된 문제를 예방하며, 타입의 일관성과 예측 가능성을 보장하는 데 중요합니다.
- 5. DIP : 상위 모듈이 하위 모듈에 의존하지 않도록 설계해야 함을 의미합니다. 대신에 둘 다 추상화에 의존해야 합니다. 즉, 의존성은 추상화된 것을 향해야 합니다. 이 원칙은 프로토콜과 클래스의 관계, 의존성 주입 등에서 중요한 의미를 갖습니다.
- [참고 자료](https://morgan-kang.notion.site/230520-TIL-SOLID-d77c52091c874ef4848376d248ee1eae)
---
## 맥스
### 1️⃣ SOLID 원칙
- 다음 중 SOLID 원칙에 포함되지 않는 것은?
- 1 ) SRP
- 2 ) OOP
- 3 ) ISP
- 4 ) DIP
> 정답 : OOP
> OOP는 객체지향프로그래밍. SOLID의 O는 OCP
### 2️⃣ NSCache
- 다음 중 NSCache에 대한 설명이 아닌 것을 모두 고르시오
- 1 ) key-value 형태로 저장된다.
- 2 ) 캐시 저장 위치를 디스크와 메모리 중 선택할 수 있다.
- 3 ) 자원이 부족하면 시스템에서 캐시를 자동으로 제거할 수 있다.
- 4 ) URL 로드 요청에 대한 응답을 캐싱한다.
> 답 : 2, 4
> URLCache에 대한 설명
### 3️⃣ iOS File System
- 다음 중 iTunes 또는 iCloud를 통해 백업이 되는 디렉토리를 모두 고르시오
- 1 ) AppName.app
- 2 ) Documents/
- 3 ) Library/
- 4 ) tmp/
> 답: 2, 3
> 1번은 백업되지는 않으나, iTunes의 경우 App Store에서 구매한 모든 앱의 초기 동기화를 수행함. 4번은 임시 폴더라 백업되지 않음
### 4️⃣ ARC
- 순환 참조가 발생할 수 있는 상황에서는 반드시 weak 참조를 사용해야 한다
- 1 ) 참
- 2 ) 거짓
> 답 : 2
> unowned 역시 순환 참조를 방지하기 위해 사용된다
### 5️⃣ DB
- 다음 중 RDBMS에 포함되는 것을 모두 고르시오
- 1 ) MariaDB
- 2 ) Postgresql
- 3 ) MongoDB
- 4 ) Oracle
> 답 : 1, 2, 4
> 3번은 NoSQL
### 6️⃣ Drawing Cycle
- 다음 중 setNeedsDisplay(_ :)에 대한 설명으로 옳은 것은?
- 1 ) Drawing cycle을 기다리지 않고 즉시 draw(_ :)를 호출한다
- 2 ) Drawing cycle을 기다리지 않고 즉시 layoutSubviews(_ :)를 호출한다
- 3 ) 다음 Drawing cycle에 draw(_ :)를 호출한다
- 4 ) 다음 Drawing cycle에 layoutSubviews(_ :)를 호출한다
> 답 : 3
### 7️⃣ Reusable Cell
- 테이블뷰와 컬렉션뷰에서 재사용 셀을 초기화하기 위해 사용하는 메서드 이름은?
> 정답 : prepareForReuse, prepareForReuse()
### 8️⃣ DB
- 객체와 관계형 데이터베이스의 데이터를 자동으로 연결해주는 프로그래밍 기법은?
> 정답 : ORM, Database ORM
### 9️⃣ CoreData
- CoreData를 사용하면 앱 시작시 CoreData.plist 파일이 메모리에 로드된다. 너무 많은 양의 데이터를 저장하면 앱의 성능이 저하된다.
- 1 ) 참
- 2 ) 거짓
> 답 : 거짓
> UserDefault에 대한 설명이다
### 🔟 Localization
- 화폐단위 localization을 테스트하려면 시스템 설정에서 ___ 를 변경해야 한다.
> 답: 지역 / region
---
## 레드망고
### 1️⃣ LLDB명령어중 “expression -O --”의 약자로 객체의 내용을 출력하는 데 사용되는 명령어를 써주세요(소문자입니다.)
- 답: po
- 비슷한 오답: p,print,fr v
- `-O option`은 object의 `description`을 출력하겠다는 뜻
- p,print = `expression --`의 약자
- fr v = `frame variable`의 약자
- 3개 다 데이터를 보는 방법이라는 공통점이 있음
### 2️⃣iOS13이후 AppDelegate가 하는일이 아닌것은 무엇일까요?
- 앱의 중앙 데이터 구조 초기화
- 앱 외부에서 발생한 알림에 응답 (메모리 부족 경고, 다운로드 완료 알림 등)
- 앱의 주요 라이프 사이클 이벤트 관리
- 앱 시작 시 필요한 서비스 등록 (Apple Push Notification 서비스 등)
- 답: 3 - iOS13이후 앱의 주요 라이프 사이클 이벤트 관리는 SceneDelegate에서 한다.
- [UIapplicationdelegate](https://developer.apple.com/documentation/uikit/uiapplicationdelegate)
- [UISceneDelegate](https://developer.apple.com/documentation/uikit/uiscenedelegate)
### 3️⃣~~동시성 프로그래밍은 병렬 프로그래밍과 서로 반대되는 개념이다 OX 탈락~~
- 답: X
- 동시성 = 멀티 스레드
- 병렬 = 멀티 코어
### 4️⃣~~HTTP요청시 동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때, 해당 HTTP 메서드가 ?을 가졌다고 말합니다. 물음표에 해당하는 것은 무엇일까요? 탈락~~
- 일관성
- 멱등성
- 정확성
- 일치성
- 답: 멱등성
-
### 5️⃣ARC가 관여하는 메모리 구역은 무엇일까요?
- 코어 영역
- 데이터 영역
- 힙 영역
- 스택 영역
- 답: 힙 영역
### 6️⃣UIGestureRecognizer는 View보다 먼저 터치 이벤트를 받는다 OX
- 답: O
- [Using responders and the responder chain to handle events](https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/using_responders_and_the_responder_chain_to_handle_events)
### 7️⃣UIGestureRecognizer는 View보다 먼저 터치 이벤트를 받습니다.
View의 UIGestureRecognizer가 일련의 터치를 인식하지 못하면 UIKit은 터치를 View로 보냅니다.
View가 터치를 처리하지 않으면 UIKit은 터치를 Responder Chain으로 전달합니다.
그렇기에 UIGestureRecognizer는 Responder Chain에 속한다고 볼 수 있을까요?.
-[UIGestureRecognizer](https://developer.apple.com/documentation/uikit/uigesturerecognizer)
### 8️⃣~~iOS File System의 Library 하위 디렉토리중 앱의 기본 설정파일이 저장되는 디렉토리는 무엇일까요? 탈락~~
- Application Support
- Caches
- Frameworks
- Preferences
- 답: Preferences
- [File System Programming Guide](https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW1)
### 9️⃣final이 붙지 않은 Class는 Dynamic Dispatch로 동작합니다. 그러한 Class의 Extension도 마찬가지로 Dynamic Dispatch로 동작할까요? OX
- 답: X
- final이 붙지않은 Class는 상속의 가능성이 있고 그말인 즉, 서브클래스에서 함수를 호출할수도, 안할수도 있기에 런타임에와서야 호출될 함수가 결정되니 Dynamic Dispatch이다.
- 하지만 Extension에서 추가한 메서드는 서브클래스에서 오버라이딩이 안되기때문에 일반적으로 Static Dispatch로 동작한다.(예외: objc활용)
- [참고링크](https://babbab2.tistory.com/143)
### 🔟~~코어 데이터의 undo Manager는 변경 사항을 추적하고 이를 개별적으로, 그룹으로 묶어서, 또는 한 번에 모두 롤백할 수 있다 OX 탈락~~
- 답: O
---