iOS

질문 정리

지용빡 2022. 8. 10. 23:58
반응형

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 키워드를 사용하면 해당 클래스, 프로퍼티, 메서드가 다른 클래스에 의해 상속되고 있지 않다는 것을 컴파일러에
반응형