본문 바로가기
면접

iOS 기술면접 정리 - 5. Swift (1)

by be_beee 2022. 7. 10.

개인적으로 정리한 내용입니당

struct와 class와 enum의 차이

class
- 전통적인 OOP 관점에서의 클래스.
- 단일 상속만 가능
- (인스턴스/타입) 메서드, (인스턴스/타입) 프로퍼티
- 참조타입
- iOS 프레임워크(UIKit, ...)의 대부분은 class로 구성되어 있다.
Swift에서는 객체라는 용어 대신 인스턴스라는 용어를 사용한다... 이걸 그 긴시간 동안 Swift 공부해오면서 처음 알았다..!..!!
이제라도 알아서 다행ㅜㅜ

struct
- class와 다르게 상속 불가능
- (인스턴스/타입) 메서드, (인스턴스/타입) 프로퍼티
- 프로퍼티값을 변경 시키는 메서드 앞에 mutating을 붙임
- 값타입
- Swift의 대부분의 큰 뼈대(데이터 타입)는 모두 struct로 구성되어 있다.
- 위의 특징과 비슷하게 class는 주로 뷰 관련 클래스 (View/ViewModel)에 사용하고, struct는 Entity, DTO 등에 활용해왔었음.

enum
- 상속 불가능
- (인스턴스/타입) 메서드, (인스턴스/타입) 연산 프로퍼티를 가질 수 있음
- Swift에서는 enum 타입이 꽤 활용도가 높은 편!
- 프로젝트에서는 원시 문자열을 활용했을 때 발생할 수 있는 실수를 방지하기 위해 활용하거나(HTTP Method),
- 카테고리처럼 특정 가짓수로 정해져 있는 분류 체계를 코드 상에서도 명시할 때 썼던 것 같다. (ex. 책 종류를 단순히 0-인문, 1-과학, ... 이렇게 숫자로 표기해서 코딩하는 것보다 enum으로 관리하면 값도 부여할 수 있고 의미도 확 전달 되기 때문에)

class와 struct, enum의 공통점
- 서로 다른 타입(자료형)들을 하나로 묶을 수 있다.
- extension으로 확장 가능
- 프로토콜 채택 가능. Swift에서는 다중 상속 대신 프로토콜 다중 채택을 통해 확장성을 실현함

참고: https://zeddios.tistory.com/12


Copy On Write는 어떤 방식으로 동작하는가

Value 타입이라 할 지라도 처음 값이 복사될 때는 레퍼런스 타입처럼 같은 메모리 주소에 위치한 변수를 가리키다가 복사된 값의 수정 및 변경이 일어날때 값 복사가 일어나는 방식

convenience init

기본 이니셜라이저를 보조해주는 이니셜라이저
기본 이니셜라이저가 있어야 작성 가능하다

Any vs AnyObject

Any
- 모든 타입의 인스턴스
- 옵셔널까지 포함하지는 않는다. Any랑 Any?는 다름!

AnyObject
- 모든 클래스 타입의 인스턴스
- 클래스만 이 프로토콜을 채택할 수 있다고 명시할 때 주로 활용해왔었음
- 명시가 왜 필요한가? 프로토콜이 AnyObject를 표시하면 클래스 타입으로 인식해서 weak 참조를 할 수 있음.
- weak 참조는 왜 해야하는데??? delegate 패턴을 활용하면 두 클래스 간의 참조가 발생하는데 둘 다 강한 참조를 해버리면 순환 참조가 발생해서 메모리에 계속 남아있기 때문;; 추후 메모리 누수의 원인이 됨!!!

Optional

Subscripts에 대해 설명하시오.

- class, struct, enum 등의 시퀀스 멤버 요소에 접근하기 위한 바로가기 첨자
- 단일 타입에 여러 subscript 정의 가능
- 파라미터로 키값을 받아서 해당 키에 대응하는 값을 반환하는 형태

String은 왜 subscript로 접근이 안되는지 설명하시오.

String은 시퀀스가 아니니까..? 좀 더 복잡한 이유였다.
Swift에서 String = 문자(Character)들의 집합
Character = 1개 이상의 유니코드 스칼라가 조합되어 만들어짐
여기서 1개 이상이라는 건 1개일 수도 있고, 여러 개일 수도 있음 = 가변적
그래서 String을 1. 하나의 문자열 2. 유니코드 스칼라의 조합 3. utf8, utf16 구성 으로 표현할 수 있다고 함
이렇게 다양한 해석이 가능하다보니 Int 인덱스를 활용한 subscript로 접근할 수 없었음.
대신 String.Index를 활용한 접근은 가능하다!
참고: https://green1229.tistory.com/286


instance method vs class method vs static method

instance method
- 제일 기본적으로 사용하는 메서드

class method vs static method
공통점
- 타입 메서드.
- 클래스 인스턴스 보다는 클래스 자체와 연관되어 있어 인스턴스를 생성하지 않더라도 바로 접근 가능

차이점
- class 메서드: override 가능 / static 메서드: override 불가능
- final class func과 static func이 같은 효과를 나타냄

cf. class property vs static property
- 둘 다 생성자 없이 바로 접근 가능함
- class property만 상속 가능함
- class property의 경우 연산 타입 프로퍼티로만 표현 가능

언제 타입 메서드/프로퍼티를 사용하는가
static property
- 자주 안 변하고 전역 변수처럼 공통으로 관리하는 공용자원 데이터 느낌일 때 (ex. 색상, 폰트, 기본 안내멘트 등)
- 자주 재사용되고 생성비용이 많이 드는 object를 미리 만들어 놓고 계속 쓰면 효율을 높일 수 있을 때 (ex. DateFormatter)

static method
- 간단한 Factory 패턴 구현할 때
참고: https://sujinnaljin.medium.com/swift-class-func-vs-static-func-7e6feb264147



Extension에 대해 설명하시오.

기존 클래스, 구조체, 열거형 타입에 새로운 Property, Method, Initializer 등을 추가하는 것.
원본 타입에 접근하지 못하는 타입들도 확장해서 사용할 수 있음
- extension에서 저장 프로퍼티는 추가할 수 없고, 연산 프로퍼티만 추가 가능
- 메서드는 인스턴스, 타입 메서드 모두 추가 가능함
- 새로운 이니셜라이저 추가 가능
  - class: designated initializer는 추가할 수 없고 convenience initializer만 추가할 수 있음. deinitializer는 추가할 수 없음
  - struct: memberwise initializer(자동으로 제공되는 기본 생성자)를 보존하며 새로운 생성자 추가 가능
- 서브스크립트, 중첩 타입 , 프로토콜 추가 가능
  - 가독성을 위해 채택하는 프로토콜과 관련된 메서드는 extension에 따로 빼두기도 함
- where 키워드를 활용해 확장에 제한을 둘 수 있음
참고: https://babbab2.tistory.com/124


Extension 내부에서 함수를 override할 수 있는지 설명하시오.

이니셜라이징 빼고는 다 되는 걸로 알고 있는뎅
아니었다. 함수를 오버라이딩 해서도 안되고 할 수도 없다고 함.

Extensions can add new functionality to a type, but they cannot override existing functionality.

https://docs.swift.org/swift-book/LanguageGuide/Extensions.html

'면접' 카테고리의 다른 글

iOS 기술면접 정리 - 5. Swift (2)  (0) 2023.02.08
iOS 기술면접 정리 - 3. Autolayout  (0) 2022.07.10
iOS 기술면접 정리 - 2. GCD  (0) 2022.07.10
iOS 기술면접 정리 - 1. Common  (0) 2022.07.03