# 면접스터디 질문 정리
1. Singleton 디자인 패턴을 활용하는 경우를 예를 들어 설명해주세요
- 싱글톤 패턴은 특정 용도로 객체를 하나만 생성하여, 공용으로 사용하고 싶을때 사용합니다.
예를 들어서 사용자 정보를 저장하는 클래스를 만들고 사용자 정보는 여러화면에서 접근할 수 있어야하고 일관된 정보를 유지해야하는데 각 화면이 별도의 사용자인스턴스를 생성하고 사용한다면 각 인스턴스는 서로 다른 정보를 가질 수 있어서 일관성을 유지하는데 어려운데 이런 상황에서 싱글톤 패턴을 사용하면 사용자 정보인스턴스는 단 한번만 생성되고, 여러 화면이 공유해서 사용할 수 있게 된다. 주로 환경설정, 네트워크 관리등과 같이 한번만 생성되어야하고 여러 객체에서 접근할 필요가 있는 객체에 대해 사용됩니다.
## 꼬리질문
1-1. 싱글턴 디자인 패턴의 장단점을 설명해주세요
- 장점: 메모리 낭비를 방지할 수 있고, 전역인스턴스로 자원공유가 쉽다.
- 단점: 싱글톤 인스턴스가 너무 많은 일을 하거나, 많은 데이터를 공유시킬경우 다른 클래스의 인스턴스들 간 결합도가 높아져서 객체지향 설계원칙(개방-폐쇄)에 어긋나고, 수정과 테스트가 어려워진다.
1-2. 싱글톤 패턴으로 구현된 객체를 인스턴스화하지 않기 위해서는 어떤 방법을 사용해야 할까요?
- 객체의 생성자를 private으로 설정하여 외부에서 인스턴스화를 막을 수 있습니다, private init() 사용
https://babbab2.tistory.com/66
- 싱글톤 질문에서 swift에서 싱글톤을 사용하는 예시가 뭐가 있냐?
UIScreen, UserDefaults, UIApplication, FileManager,Notification 이 있다고 합니다..
1-3 싱글턴 패턴을 사용할 때 발생할 수 있는 동시성 문제는 무엇인가요?
- 싱글턴 패턴을 사용할 때 동시성 문제는 여러 스레드에서 동시에 접근하여 객체를 수정하거나 상태를 변경할 때 발생할 수 있습니다. 이를 해결하기 위해서는 스레드 안전성을 보장하는 방법을 사용해야 합니다.
1-4 싱글턴 객체의 수명 주기는 어떻게 관리되나요? 생성과 소멸 시점은 어떻게 결정되는 건가요?
- 싱글턴 객체의 수명 주기는 보통 애플리케이션의 라이프사이클과 관련이 있습니다. 객체는 처음 요청될 때 생성되고, 애플리케이션 종료 시 소멸됩니다. 생성과 소멸 시점은 개발자가 제어할 수 있으며, 필요에 따라 지연 초기화나 초기화 과정에서 추가적인 작업을 수행할 수 있습니다.
1-5 싱글턴 패턴을 사용하는 대신에 의존성 주입(Dependency Injection)을 사용할 수 있는 상황이 있을까요? 어떤 경우에 어느 방식이 더 적합할까요?
- 싱글턴 객체에 대한 의존성이 생기게 되면 테스트하기 어려워질 수 있습니다. 따라서, 의존성 주입(Dependency Injection)을 고려하여 싱글턴 패턴 대신 사용할 수 있는 경우도 있습니다. 의존성 주입은 객체 간의 결합을 느슨하게 만들고 테스트 용이성을 높일 수 있는 방법입니다.
----
----
2. View Contoller의 View의 상태변화에 따른 메서드의 호출순서를 이야기해보세요
- loadView() -> viewDidLoad() -> viewWillAppear() -> viewDidAppear()> viewWillDisappear() -> viewDidDisappear() 순서로 호출
### 꼬리질문
1-1. viewWillAppear와 viewDidAppear에서 무엇을 하면 좋을까요?
- viewWillAppear - view가 나타날거라는 신호를 controller에게 알리고 화면이 나타날때마다 수행하는 작업을 진행한다. 예를 들어서 데이터 불러오기.
- viewDidAppear - view가 나타났다는 것을 controller에게 알리는 역할을하고, view가 나타났을때 수행할 추가작업을 진행합니다. 애니메이션 적용.
1-2. loadView와 viewDidLoad의 차이가 뭘까요?
- loadView: 뷰 컨트롤러가 자신의 뷰를 로드할 때 호출되는 메서드입니다. 뷰 컨트롤러가 자신의 뷰에 처음으로 접근할 때 시스템에 의해 자동으로 호출됩니다. 뷰 컨트롤러의 메인 뷰를 생성하고, 해당 뷰의 속성을 설정하고, 그 뷰를 뷰 컨트롤러의 뷰 속성에 할당합니다.
- viewDidLoad: 뷰 컨트롤러의 뷰가 메모리에 완전히 로드된 후에 호출되는 메서드입니다. 일반적으로 추가적인 초기화 작업을 수행하며, 뷰의 배경색을 설정하거나 데이터를 로드하는 등의 작업을 합니다. 뷰 컨트롤러의 생명 주기에서 한 번만 호출되기 때문에, 한 번만 수행해야 하는 작업은 여기에서 처리하는 것이 적절합니다.
1-3 View의 상태변화에 따른 메서드 호출은 어떤 방식으로 이루어지나요?
- View의 상태변화에 따른 메서드 호출은 일반적으로 이벤트 기반으로 이루어집니다. 예를 들어, 버튼을 클릭하거나 텍스트 필드에 텍스트를 입력하는 등의 상호작용이 발생하면 해당 이벤트에 대응하는 메서드가 호출됩니다.
1-4 View의 상태변화를 감지하기 위해 사용되는 방법을 답변해주세요
- View의 상태변화를 감지하기 위해 주로 Observer 패턴이 사용됩니다. View는 Observable(관찰 가능한) 객체로 등록되고, 상태 변화가 발생하면 등록된 Observer(관찰자) 객체에게 알림을 전달하여 해당 메서드를 호출합니다.
1-5 View의 상태변화에 따른 메서드 호출은 주로 어떤 용도로 활용되나요?
- View의 상태변화에 따른 메서드 호출은 주로 사용자 인터페이스의 동작을 처리하기 위해 활용됩니다. ex) 버튼 클릭에 따른 작업 실행, 데이터 입력에 따른 유효성 검사, 화면 갱신 등이 이에 해당합니다
2-1 UIView의 layoutSubviews 메서드는 viewWillAppear보다 먼저 호출되나요? 그렇게 생각한 이유는 무엇인가요?
- layoutSubviews() 메서드는 viewWillAppear()보다 먼저 호출되지 않음
- 왜냐하면 layoutSubviews 메서드는 View와 해당 View의 하위 뷰들의 레이아웃을 조정하는 역할을 하기 때문
2-2 layoutSubviews를 직접 호출해서 사용하는 View의 위치와 크기를 재조정하는 것은 좋은 방법일까요?
layoutSubviews 메서드 자체가 매우 값비싼 작업이기 떄문에 공식문서 상에서도 직접 호출을 지양하라고 합니다.
2-3 그렇다면 layoutSubviews를 명시적으로 호출하는 메서드는 무엇이 있을까요?
layoutifNeeded와 setNeedsLayout을 통해 명시적으로 호출이 가능합니다.
https://mrgamza.tistory.com/279
https://yagom.net/forums/topic/loadview와-viewdidload-차이에-대한-질문입니다/
https://medium.com/yay-its-erica/viewdidload-vs-loadview-swift3-47f4ad195602
https://zeddios.tistory.com/43
----
----
## 3. 스위프트 언어의 String에서 subscript를 통해 문자에 접근할 수 없는 이유에 대해 설명해주세요.
- String에서 subscript를 통해 문자에 접근할 수 없는 이유는 String이 Unicode를 기반으로 하며, 그 문자열의 요소가 가변적인 크기를 가지기 때문입니다.
- Swift의 String은 char타입으로 된 Collection 타입이지만 [0] Int로 접근이 불가하다
- Unicode기반으로 되어있기 때문에 가변적이기 때문에 Int로 접근할 수 없다
### 꼬리질문
1-1. 스위프트에서 문자열의 특정 위치에 접근하려면 어떻게 해야하나요?
- String.Index 활용
```swift
let name = "Andrew"
let index = name.index(name.startIndex, offsetBy: 1)
print(name[index])
```
[https://velog.io/@hansangjin96/Swift-String은-왜-subscriptInt로-접근이-안될까](https://velog.io/@hansangjin96/Swift-String%EC%9D%80-%EC%99%9C-subscriptInt%EB%A1%9C-%EC%A0%91%EA%B7%BC%EC%9D%B4-%EC%95%88%EB%90%A0%EA%B9%8C)
[https://jeong9216.tistory.com/556#extension-해서-배열처럼-사용하기](https://jeong9216.tistory.com/556#extension-%ED%95%B4%EC%84%9C-%EB%B0%B0%EC%97%B4%EC%B2%98%EB%9F%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0)
다들 파이팅!!!