질문 정리
Swift 관련 질문
1. struct와 class와 enum의 차이를 설명하시오.
struct | enum | class | |
타입 | 값(value) | 값(value) | 참조(reference) |
확장(extension) | O | O | O |
2. Optional이 무엇인지 설명하시오.
- 값을 반환할 때 오류가 발생할 가능성이 있는 값은 옵셔널 타입이라는 객체로 감싸서 반환합니다.
- 변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위한 방법을 제공합니다.
3. Optional을 사용하는 이유
- 옵셔널 타입만이 값을 갖지 않는다는 의미의 nil값을 가질 수 있습니다.
- nil값을 옵셔널이 아닌 변수나 상수에 할당할 수 없습니다.
- 옵셔널 변수에 초깃값을 할당하지 않으면 자동으로 nil이 할당됩니다.
4. Protocol이 무엇인지 설명하시오.
- 특정 클래스와 관련없는 프로퍼티, 메서드 선언 집합입니다.
- 메서드 정의는 없습니다.
- 기능이나 속성에 대한 설계도입니다.
- 클래스에서 채택하여 메서드를 구현해야 합니다.
- 설계도 같은 역할입니다.
5. Swift 상속과 프로토콜 채택
- 상속은 부모 클래스 하나만 가능하며 여러 개라면 나머지는 프로토콜입니다.
- 부모 클래스가 있으면 부모 클래스 다음에 표기 없으면 바로 표기 가능합니다.
- 클래스, 구조체, 열거형, extension에 프로토콜을 채택(adopt)할 수 있습니다.
- 상속은 클래스만 가능합니다.
6. extension이 무엇인지 설명하시오.
- Swift 클래스, 구조체, 열거형, 프로토콜에 새로운 기능을 추가합니다.
- extension은 하위 클래스를 생성하거나 참조하지 않고 기존 클래스에 메서드, 생성자, 계산 프로퍼티 등의 기능을 추가하기 위하여 사용합니다.
7. Closure에 대해 설명하시오.
- 코드에서 전달 및 사용할 수 있는 독립적인 코드 블록입니다.
- 매개변수를 받거나, 값을 반환하도록 만들 수 있습니다.
사용하는 이유
- 코드 축약이 가능해 효율적으로 코드 작성이 가능합니다.
- 가독성이 좋아집니다.
8. 후행(trailing) 클로저에 대해 설명하시오.
- 클로저가 함수의 마지막 argument라면 마지막 매개변수 이름을 생략한 후 소괄호 외부에 클로저를 구현할 수 있습니다.
9. 접근 제어(access modifier)에 대해 설명하시오.
- 접근 속성(접근 수정자, 액세스 수정자, 액세스 지정자)는 클래스, 메서드, 멤버의 접근 가능성을 설정하는 객체 지향 언어의 키워드
- 구성 요소를 캡슐화 하는데 사용합니다.
10. Generic에 대해 설명하시오.
- 제네릭 코드는 유연하게 작성할 수 있고, 재사용 가능한 함수와 타입이 어떤 타입과 작업할 수 있도록 요구사항을 정의한다. 중복을 피하고 의도를 명확하게 표현하고, 추상적인 방법으로 코드를 작성할 수 있다.
- Swift의 배열과 딕셔너리 타입은 제네릭 타입입니다.
11. AnyObject에 대해 설명하시오.
- 모든 클래스 타입의 인스턴스를 나타낼 수 있는 프로토콜입니다.
- AnyObject로 선언 시, "클래스 타입"만 저장할 수 있습니다.
- 따라서 클래스 타입이 아닌 구조체, 열거형, 참조 타입인 클로저는 AnyObject에 해당하지 않습니다.
12. GCD란 무엇인지 설명하시오.
- 멀티 쓰레딩 처리를 쉽고 편하게 제공하는 API
13. MainQueue
- 순차적으로 작업이 진행됩니다.
- 시스템 작동시 자동으로 생성됩니다.
- UI관련 작업은 메인큐에서 반드시 동작되어야 합니다.
GlobalQueue
- Background에서 동작합니다.
- 작업이 완료되는 시점을 정확히 알지 못합니다.
- 메인큐에 동작하는 작업들에 영향을 끼치지 않아야 합니다.
- QOS를 이용해 우선순위를 정할 수 있습니다.
14. mutaing 키워드의 의미를 설명해보세요.
- Swift에서 값 타입 프로퍼티들을 인스턴스 메서드에 의해 수정될 수 없습니다.
- mutaing 키워드를 메서드 앞에 붙이면 구조체나 열거형 인스턴스에서 프로퍼티를 수정할 수 있게 됩니다.
- mutaing 키워드가 붙은 메서들 실행하면 스위프트는 새로운 구조체를 생성해 변경된 프로퍼티의 값을 할당하고 반환해 현재 구조체를 대체합니다. 구조체의 불변성을 지키기 위해 이런 방법을 사용합니다.
15. Protocol과 Class의 차이점
- 클래스는 인스턴스 메서드의 실제 구현체를 가지고 있지만 프로토콜은 메서드의 인터페이스만 가지고 있습니다. 프로토콜이 구현체를 가지게 하려면 프로토콜의 extension을 만들어 구현체를 작성할 수 있습니다.
16. Enum에서 raw Value와 associated Value에 대해 설명하시오.
- raw value는 원시값으로 열거형의 모든 case들이 동일한 타입을 가지고 하나의 값만 가질 수 있습니다.
- associated value는 튜플을 통해 각 case들이 다른 타입을 가지게 할 수도 있고, named tuple로 이름을 붙일수도 있으며, 여러개의 값을 가지게 하는 것도 가능합니다.
17. inout은 언제 사용하면 좋습니까?
- inout은 파라미터를 사용하면 값 타입 변수가 저장된 주소의 값을 함수 안과 밖에서 동일하게 사용하게 됩니다. 따라서 함수가 입력과 동일한 출력을 제공하고, 함수 내에서 적용된 변경사항이 함수 외부에서도 동일하게 적용되어야할 때 사용할 수 있습니다.
14. as!와 as?의 차이를 설명하시오.
- 모두 런타임에 다운캐스팅을 위해 사용되지만 as?는 캐스팅에 실패했을 때 nil을 반환하고 as!는 런타임 에러를 발생시킵니다.
15. 메서드 안에서 self를 언제 사용해야할까요?
- 파라미터의 이름이 인스턴스의 프로퍼티 이름과 겹칠 경우에 인스턴스의 프로퍼티임을 명시하기 위해서 self를 사용할 수 있습니다.
16. strong, weak, unowned reference는 각각 언제 사용할까요?
- 메모리에서 인스턴스가 해제되는 것을 막기 위해 강한 참조인 strong reference를 사용할 수 있습니다.
17. Array, Set, Dictionary의 차이점을 설명하시오.
- Array는 리스트 컬렉션으로 Random Access가 가능해 인덱스를 통해 요소에 접근할 수 있습니다.
- Set Hashable 프로토콜을 채택하는 값을 저장해 중복되지 않은 데이터를 관리하는 컬렉션입니다. 순서가 보장되지 않으며, 교집합, 차집합 등 집합 연산을 메서드로 제공합니다.
- Dictionary는 Key-Value 형태로 데이터를 관리하는 콜렉션입니다. 딕셔너리의 Key로 사용될 타입은 Hashable 프로토콜을 채탣하고 중복된 키를 허용하지 않으며 순서를 보장하지 않습니다.
18. deinit은 언제 사용할까요?
- deinit은 인스턴스가 메모리에서 해제되기 직전에 호출됩니다. 인스턴스를 해제하기 전에 선행되어야 하는 작업이 있다면 deinit에 구현할 수 있습니다.
19. defer에 대해 설명하시오.
- defer는 클로저에 정의된 코드가 읽어진 이후에 함수가 끝나기 전 마지막에 실행되도록 합니다.
20. 1급 객체에 대해서 설명하시오.
- 1급 객체는 함수의 인자로 전달되거나 반환 값으로 사용될 수 있는 객체를 의미합니다.
- 또 1급 객체는 변수나 상수에 할당할 수 있는 객체입니다.
- Swift는 기본 타입들과 함수나 클로저까지 모두 1급 객체에 해당합니다.
21. 고차함수 중 flatMap과 compactMap의 차이를 설명하시오.
- compactMap은 1차원 배열에서 각 요소에 대해 nil을 제거하고 옵셔널 바인딩을 한 결과 배열로 만들어 반환합니다.
- flatMap은 배열의 요소 타입이 옵셔널이라면, nil을 제거하고 옵셔널 바인딩을 한 결과로 배열로 만들어 반환합니다.
- flatMap은 2차원 배열이면서 요소 타입이 옵셔널이 아니라면, 배열의 요소들을 1차원으로 합친 배열을 반환하고 nil제거와 옵셔널 바인딩을 하지 않습니다.
22. final 키워드를 클래스 앞에 붙이면 어떤 효과가 있을까요?
- 어떤 클래스의 프로퍼티나 메서드는 다른 자식 클래스로부터 override 될 수 있기 때문에, 이런 override된 메서드는 실제로 어떤 메서드를 실행할 지 vtable을 한 번 탐색해서 결정하게 됩니다. 즉 컴파일 타임이 아닌 런타임에 실제로 실행할 메서드가 결정되는 것입니다. 이름 dynamic dispatch라고 합니다.
- final 키워드를 사용하면 해당 클래스, 프로퍼티, 메서드가 다른 클래스에 의해 상속되고 있지 않다는 것을 컴파일러에