본문 바로가기

면접 질문

8월 3주 모의면접 질문지

1. Array 에 대해서 설명해주세요.

-Swift에서는 두 개의 배열이 존재하는데, Swift에서 제공하는 우리가 평소 사용하는 것이 Array라는 것이고, 나머지는 Foundation에서 제공하는 NSArray가있다.

보편적으로 사용하는 것이 Array

Array는 배열로 구조체 타입이고 스택에 저장되며 모두 동일한 자료형만 저장이 가능

 

2. Stack, Queue 차이점에 대해서 설명해주세요.

- 스택은 LIFO (Last In, First Out) 구조를 가진 자료구조이고 테이터를 삽입하는 push 연산과 데이터를 삭제하는 pop연산을 제공하며 데이터는 항상 스택의 가장 상단에 추가되거나 제거된다. 

큐는 FIFO (First In, First Out) 구조를 가지며, 가장 먼저 삽입된 데이터가 가장 먼저 삭제되는 구조이고 데이터를 삽입하는 enqueue 연산과 데이터를 삭제하는 dequeue 연산을 제공하며 데이터는 큐의 뒤쪽에 추가되고, 앞쪽에서 제거된다.

 

3. iOS에서 Stack을 사용하는건 어떤게 있을까요?

네비게이션컨트롤러에서 사용한다.

 

4. 저장 프로퍼티와 연산 프로퍼티에 대해서 설명해주세요.

- 저장프로퍼티는 클래스와 구조체에서만 사용할 수 있고, 값을 저장하기 위해 선언되는 상수/변수

- 연산프로퍼티는 클래스, 구조체, 열거형에서 사용되고, 저장 프로퍼티와 달리 저장 공간을 갖지 않고 다른 저장프로퍼티의 값을 읽어 연산을 실행하거나, 프로퍼티로 전달받은 값을 다른 프로퍼티에 저장한다. 때문에 항상 var 로 선언되어야 한다.

 

5. lazy 프로퍼티에 대해서 설명해주세요.

- 프로퍼티가 호출되기 전까지는 선언만 될 뿐 초기화되지 않고 있다가, 프로퍼티가 호출되는 순간에 초기화 되는 저장 프로퍼티이고

인스턴스가 초기화와 상관 없이, 처음 사용될 때 개별적으로 초기화 된다. 따라서 항상 "변수"로 선언되어야 한다.

 

6. Optional에 대해서 설명해주세요.

nil값을 위해 만들었음

 

7. Optional을 사용하는 이유에 대해서 설명해주세요.

 

 

8. Optional 언래핑 방법에 대해서 아는만큼 설명해주세요.

강제언래핑 옵셔널바인딩

 

9. Closure에 대해 설명해 주세요.

 

 

10. Escpaing Closure에 대해 설명해 주세요.

11. Extension에 대해 설명해 주세요.

12. Extension을 사용해보셨나요?

        a. extension에서 저장프로퍼티를 사용할 수 있나요? - 할수없다!헉

 

흠흠 어제 키워드보고 프로퍼티에 대해서 조금 공부해봤지만 대답할수있는것은?ㅎ 글쎄다~

하나하나 간단하게 정리를 해 볼까나요

 

 

 

자료구조란

Array

메모리 공간에 연속적으로 데이터를 저장하는 자료구조.

장점으로는 index 접근하는 속도가 빠르고 단점으로는 중간에 데이터를 추가하거나 삭제할 때 속도가 느리다.(배열 추가작업이 들어감)

 

Linked List

메모리 공간에 연속적으로 데이터를 저장하지는 않지만,

각 데이터가 다음 데이터를 가르키는 포인터를 통해 연결되어 있어 순서를 보장하는 자료구조

값과 다음값의 주소를 저장하고 있다.

장점으로는 중간에 값을 추가하거나 삭제할 때 속도가 빠르고 단점으로는 인덱스에 접근하는데 속도가 배열보다 느리고, 추가적인 메모리(링크드리스트의 경우 값과 다음 값의 주소를 같이 저장해야한다)를 차지한다는 점이다.

 

Stack

먼저 들어간 데이터가 나중에 나오는 자료구조. 선입후출

LIFO - Last In First Out

push를 사용해서 데이터를 추가하고 pop을 이용해서 데이터를 뺄 수가 있다.

 

[추가질문] 화면전환을 할 때 Stack을 사용하여 화면전환을 도와주는 클래스는 어떤게 있나요?

  • pushViewController, popViewController 함수를 사용할 수 있는 클래스! 무엇이 있죠!?

- 두 함수를 사용할 수 있는 클래스로는 UINavigationController가 있다. pushViewController를 해주면 새로운 뷰 컨트롤러를 내비게이션 스택에 추가해 화면에 표시해주고 popViewController를 해주면 현재 . 뷰컨트롤러를 내비게이션 스택에서 제거하면서 이전 뷰 컨트롤러로 돌아간다.

 

Queue

먼저 들어간 데이터가 먼저 나오는 자료구조 (대부분 대기 줄을 생각하면 됨)

FIFO - First In First Out

enqueue를 사용해서 데이터를 추가하고 dequeue를 사용해서 데이터를 뺄 수 있다.

 

 

Swift

프로퍼티

클래스, 구조체, 열거형에 값을 저장하거나 계산하는데 사용

프로퍼티의 종류

- 저장 프로퍼티 (stored property)

말 그대로 값을 저장하는 프로퍼티

- 지연 저장 프로퍼티 (lazy stored property)

값이 처음 사용될 때까지 초기화되지 않는 저장 프로퍼티

초기화할 때 순서를 정하거나 메모리 관리를 위해 사용

let을 사용하지 못함

enum에서는 사용하지 못하고 struct, class에서만 사용 가능

- 연산 프로퍼티 (computed property)

값을 저장하지 않고 다른 프로퍼티나 값에 기반하여 값을 계산하여 반환

get, set 메서드를 사용하여 정의

get만 있을때는 생략이 가능하다.

- 프로퍼티 옵저버 (property observer)

주로 저장프로퍼티에서 값이 변경되었을 때를 감지하여 작업할 때 사용

willSet, didSet을 제공

willSet: 값이 저장되기 직전에 호출

didSet: 값이 저장된 직후에 호출

- static class property

 

옵셔널

Swift에서 null 안정성을 위해 나온 키워드

Optional은 값이 있을수도 있고 없을수도 있는 변수의 데이터 타입

옵셔널 언래핑을 통해서 안전하게 nil이 아닌 값을 안전하게 가져올 수 있다.

Optional로 래핑되어서 값이 출력

var name: String?
print(name) // <- nil

name = "brody"
print(name) // Optional("brody") 
// Optional로 래핑되어 "brody"로 나옴
// 래핑되어 있다는 것은 겉옷을 입고 있다는것!

[추가질문] 옵셔널 체이닝에 대해서 설명해주세요.

  • 옵셔널 체이닝에 대해서 공부해보세요.

chaining의 뜻이 연쇄 이듯이 옵셔널 체이닝은 말그대로 옵셔널을 연쇄적으로 사용하는 것이다.

person.contacts?.address

person?.contacts?.address

.(dot)을 통해 내부 프로퍼티나 메서드에 연속적으로 접근할 때 옵셔널 값이 하나라도 껴있으면 옵셔널 체이닝이다.

따라소 위 두개의 코드 모두 옵셔널 체이닝이다.

옵셔널 표현식의 멤버에 접근할 때, 표현식이 nil일 수 있어서 ?를 써주는 것이다.

!를 써도 접근 되지만 !는 옵셔널 체이닝이 아닌 옵셔널 강제 해제 연산이다.(강제해제 연산자 !는 웬만해서는 쓰지말아야한다.)

  • 아래 코드에서 print했을 때 결과값은 무엇일까요?
class Person {
    var name: String
    var age: Int?
    
    init(name: String, age: Int?) {
        self.name = name
        self.age = age
    }
}

var brody: Person?
brody = Person(name: "brody", age: nil)
print(brody?.name) // <- print가 어떤게 될까요?
print(brody?.age) // <- print가 어떤게 될까요?

"brody"

nil

아닌감?ㅎ

 

 

클로저

() -> ()
() -> Void
(String) -> Void

함수처럼 사용할 수 있는 코드블록

이름이 없는 함수 -> 익명함수 라고도 불림

사실 함수가 이름이 있는 클로저

  • 함수 안에 클로저가 있는게 아님
  • 클로저 안에 함수가 있다

  • 이름 없는 클로저 (AKA 클로저)
  • 이름 있는 클로저 (AKA 함수)

함수의 기본 요소

  • 함수이름
  • INPUT(파라미터)
  • OUTPUT(리턴)
  • 구현부의 형태
func 함수이름(INPUT) -> OUTPUT {
	// 구현부
}

 

클로저의 기본요소

  • 함수와 비슷하지만 이름이 없음
  • INPUT, OUTPUT, 구현부
{ (파라미터) -> 리턴타입 in
	// 구현 
}

// {} 로 영역을 잡아요
// 파라미터와 반환타입을 정하기 위해서 in 키워드를 사용해요
// in 앞에는 파라미터와 변환타입
// in 뒤에는 구현부!
// in이 없다면 어떤게 파라미터인지 구현부인지 구분이 안되겠죠!?
// 기본 형태에서 생략할 수 있는게 많은데 한번 찾아보면 좋을거 같네요 :)

 

클로저의 생략법

snapkit을 자주 사용하신거 같군요!

그러면 아래의 스냅킷 코드을 간소화해주세요.

let subView = UIView()

view.addSubview(subView)

subView.snp.makeConstraints { make in
    make.centerX.equalToSuperview()
}

let array = [1,2,3]

array.sort { a, b in
	return a > b
}

array.sort {
	return $0 > $1
}

array.sort { > }

생략

let subView = UIView()

view.addSubview(subView)

subView.snp.makeConstraints {
    $0.centerX.equalToSuperview()
}

let array = [1,2,3].sorted(by: >) // 이부분은 배열 정렬에서 클로저 부분 축약

 

 

Escaping closure

  • escaping : 탈출하다
    • 탈출할 수 있는 클로저???
    • 함수 내부가 아닌 외부 변수에 클로저를 저장 가능
    • 함수가 종료된 후 실행 가능
  • 함수 파라미터로 받은 클로저가 탈출할 수 있게 해준다.

함수가 종료된 후 실행

비동기 작업(API)를 하면 @escaping 키워드가 종종 보인다.

func getPoketmonList(completion: @escaping ([Poketmon] -> ()) {

	// API를 호출하는데 3초가 걸린다고 가정
		URLSession.shared.dataTask(with: URLRequest(url: url)) {
		data, response, error in
		
			let poketmonList = [Poketmon]() 
				// 데이터 가공하여 poketmonList에 값을 넣음
				completion(poketmonList)
		}
		
		// 이미 종료됨.
}

getPoketmonList함수는 API호출을 하고 이미 종료된 상태에서

3초 후 API에서 받은 데이터를 가공하여 completion 클로저를 호출할 때

@escaping 키워드가 없으면 오류 발생

 

외부에 저장?

Swift는 함수를 변수에 저장할 수 있어요 (나중에 배울 1급 함수이기 때문에!)

newClosure을 외부의 testClosure에 저장하려고 하는데 오류가 발생

파라미터로 받는 newClosure는 외부 변수에 저장할 수 없음(탈출 불가)

@escaping 키워드를 추가하면 오류가 발생하지 않는다.

 

 

Extension(확장하다)

  • class, struct, enum, protocol에 새로운 기능을 추가
  • 수평적으로 확장한다고 이야기함
  • 저장프로퍼티를 선언할 수 없고, 연산 프로퍼티만 사용 가능
  • 프로토콜을 채택해서 확장할 수 있음
    • 가독성을 높일 수 있어서 자주 사용
extension 확장하고싶은것: 프로토콜 {

}

extension ViewController {
	// 코드 작성
}

extension ViewController: UITableViewDataSource {
	// UITableViewDataSource 관련 코드만 확장할 수 있음
}

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

3주차 질문지  (0) 2024.09.06
모의면접 후  (1) 2024.09.05