티스토리 뷰

답 방지를 위해서 하나의 글을 세 개로 나누어 작성합니다. 

Part 1. 면접 질문 (https://atelier-chez-moi.tistory.com/45)

Part 2. 서면질문에 대한 정답 (https://atelier-chez-moi.tistory.com/46)

Part 3.  구술질문에 대한 정답 (현재 보시는 글)

 

(Raywenderlich - Swift Interview Questions and Answers 번역)

 

Beginner Verbal Questions(초보자를 위한 구두 질문)

 

질문 #1

 

옵셔널이란 무엇이며, 옵셔널로 어떤 문제를 해결할 수 있을까?

 

정답 #1

 

옵셔널은 어떤 유형의 변수가 값의 결핍(lack of value) 을 나타낼 수 있게 합니다.  (보충+ 옵셔널 변수는 값이 있을 수도 없을 수도 있으니까) Objective-C 에서, 값의 부재(absence of value) 는 특이한 값인 nil 을 사용하여 레퍼런스 타입에 한해서만(only in reference types) 오직 사용가능 했었습니다. 값 타입인 int 혹은 float 은 이러한 능력을 가질 수 없었습니다. (보충+ 기본 타입들은 대부분 구조체로 구현되어 있다)

 

Swift 는 값의 결핍(lack of value) 개념을 (옵젝씨에서 레퍼런스만이었던 것을) 옵셔널의 개념과 함께 레퍼런스와 값 타입 둘 다로 확장합니다. 옵셔널 변수는 값이든, 값의 결핍을 나타내는 nil 이든 둘 중 하나를 가질 수 있습니다. 

 

--------------------------------------------------------------

 

질문 #2

 

구조체와 클래스의 주요 차이점에 대해 요약하시오.

 

정답 #2

 

차이점은 다음과 같이 요약해볼 수 있겠습니다:

  - 클래스는 상속을 지원하지만, 구조체는 그렇지 못합니다. 

  - 클래스는 참조 타입이지만(=레퍼런스 타입), 구조체는 값 타입입니다.

 

--------------------------------------------------------------

 

질문 #3

 

제네릭은 무엇인가? 제네릭으로 어떤 문제를 해결할 수 있을까?

 

정답 #3

 

스위프트에서 우리는 함수와 데이터 타입(예를 들면 클래스, 구조체, 열거형) 둘 다에서 제네릭을 사용할 수 있습니다.

 

제네릭은 코드 중복(code duplication) 의 문제를 해결할 수 있습니다. 우리가 하나의 파라미터 타입을 가지는 메소드를 가질 때, 

다른 타입의 파라미터를 수용하기 위해서는 이 메소드를 복제하는 것이 일반적입니다.

 

예를 들어 다음의 코드에서 두 번째 함수는 첫 함수의 "클론(복제품)" 입니다. 정수 대신에 문자열을 받는다는 점만 제외하구요.

제네릭을 적용함으로서, 우리는 두 함수를 하나로 결합할 수 있고 타입을 동시에 안전하게 유지할 수 있습니다.

저는 제네릭 구현을 다음과 같이 해보았습니다.

우리는 이 경우에 동등성(equality)을 테스트하고 있기 때문에, 우리는 파라미터를 Equatable 프로토콜을 구현하는 타입으로 제한합니다.

이 코드는 의도된 결과를 얻게 되고 다른 타입의 파라미터가 전달되는 것을 방지합니다. 

 

--------------------------------------------------------------

 

질문 #4

 

일부의 경우에, 우리는 암시적으로 언래핑된 옵셔널을 사용하는 것을 피할 수 없다. 언제 그럴까? 왜 그럴까?

 

정답 #4

 

암시적으로 언래핑된 옵셔널을 사용하는 가장 일반적인 이유는 다음의 두 가지 입니다 :

 

1. 우리가 인스턴스화 할 때에 원래 nil 이 아닌 프로퍼티를 초기화 할 수 없는 경우입니다(+ 어찌보면 당연한 것 같습니다. Xcode 상에서 오류를 일으키겠죠). 전형적인 예시로 Interface Builder outlet(IB outlet)가 있으며, 이 아울렛은 항상 아울렛의 주인을 찾은 후(+ 프로퍼티와 연결되어)에 이니셜라이즈 됩니다. 인터페이스 빌더에서 이것이 제대로 설정되었다고 가정하면, Outlet 이 nil 이 아니라는 것을 사용 전에 보장할 수 있는 것이죠. 

 

2. 두 인스턴스가 서로를 참조하며 다른 인스턴스에 대해 nil 이 아닌 참조(non-nil reference)를 필요로 하는 경우에 발생하는, 강한 순환 참조 문제를 해결하기 위함입니다. 그러한 경우에, 우리는 레퍼런스의 한 쪽에 unowned(미소유 참조) 를 표시하며, 다른 쪽은 암시적으로 언래핑된 옵셔널(implicitly unwrapped optional)을 사용합니다.

 

--------------------------------------------------------------

 

질문 #5

옵셔널을 언래핑하기 위한 다양한 방법은 무엇이 있는가? 안전성을 고려할 때, 이 방법들을 어떻게 순위매길 수 있을까?

 

ex. var x : String? = "Test"

힌트 : 7가지의 방법이 있다.

 

정답 #5

 

1. 강제 언래핑 (안전하지 않아요)

2. 암시적 언래핑된 변수의 선언 (얘도 많은 경우에서 안전하지 않아요)

3. 옵셔널 바인딩 (안전해요)

4. 옵셔널 체이닝 (안전해요)

5. '??' 연산자를 활용 (안전해요) ex. (let a = x ?? "")

6.  'guard' 구문 활용 (안전해요)

7. 옵셔널 패턴 (안전해요) (+ 아래는 예시인데 이건 저도 처음보는거라 좀 생소하네요..!)

 

--------------------------------------------------------------

 

반응이 괜찮다면 중급 질문도 한번 번역해보도록 하겠습니다..

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함