질문 1 - 모든 View Controller 객체의 상위 클래스는 무엇이고 그 역할은 무엇인지 아는대로 작성해보세요.
모든 View Controller는 UIViewController를 상속받습니다. UIViewController는 모든 View Controller에 공통으로 작동하는 행동들이 정의 되어있고, 이를 상속받아 메서드를 추가하거나 override할 수 있습니다. 따라서 모든 View Controller 객체의 상위 클래스는 UIViewController라고 말할 수 있습니다.
UIViewController는 기본 데이터의 변경에 대한 응답으로 뷰의 내용을 업데이트 하고, 뷰와 유저의 interaction에 대한 응답과 뷰 크기 조정 및 전체 인터페이스의 레이아웃 관리, 앱에서 다른 뷰 컨트롤러를 포함한 다른 객체와의 조정(Coordinating)의 책임을 가집니다.
추가로 UIViewController 객체의 상위 클래스는 UIResponder로, UIResponder는 이벤트에 응답하고 이벤트를 처리하는 역할을 하는 인터페이스 입니다. 이벤트가 발생하면 UIKit은 이벤트를 리스폰더에게 전달하고 리스폰더는 이벤트를 처리하게 됩니다.
질문 2 - 옵셔널과 옵셔널 해제에 대해 아는대로 작성해보세요.
옵셔널은 값이 없을 수 있는 상황에서 오류를 방지하기 위해 사용됩니다.
값이 있다면 Optional(값) 형태로 저장되고, 값이 없다면 nil로 저장됩니다.
대표적으로, String을 Int로 변환할 때 Optional 값이 반환됩니다.
>> let a = Int("3") // Optional(3)
값이 있다면 옵셔널을 해제해줘야 하는데, 3가지 방법이 있습니다.
1. forced unwrapping(강제 언래핑)
옵셔널 뒤에 !를 붙이면 옵셔널을 강제로 언래핑할 수 있습니다.
그러나 nil을 강제 언래핑할 시에는 런타임 에러/크래시가 발생하므로, 값이 확실한 상황에서만 사용해야 합니다.
>> a! // 3
2. Optional Binding(옵셔널 바인딩)
if문이나 guard문을 사용하면 nil값을 적절히 걸러낼 수 있습니다.
** if문과 guard문의 차이
-> if문은 옵셔널을 벗긴 값을 scope(중괄호) 내부에서만 사용할 수 있고,
guard문은 중괄호 밖에서도 전역적으로 사용할 수 있습니다. (<- guard문에서는 else {return} 필수)
func test() {
// if문
if let b1 = Int("3") {
print(b1) // 3
}
// guard문
guard let b2 = Int("3") else { return }
print(b2) // 3
}
3. Nil coalescing operator
'??'를 이용하여 nil일 때 값을 설정해줄 수 있습니다.
let c = a ?? 0 // 3
질문 3 - UIKit에서 스토리보드로 UI 구현하기와 코드로 UI 구현 시의 각각의 장단점을 설명하시오
스토리보드로 구현 시
- 장점:
UI를 직관적으로 확인하며 구성할 수 있습니다.
- 단점:
1) 스토리보드에서는 객체마다 인스펙터 영역에서 일일이 접근해야 하는 번거로움이 있습니다. 때문에 특정 부분이 잘못되어 있을 경우, 빠른 파악이 어렵습니다. 또한 인스펙터 영역에는 일부 기능만 구현되어 있습니다.
2) 스토리보드로 작성한 부분은 xml 형식으로 되어있어서, 팀 협업 시 수정내역을 알아보기 힘들어 충돌을 해결하기 어렵습니다. 충돌을 줄이기 위해서 한 스토리보드는 한 명의 담당자가 수정하도록 규칙을 정할 수 있습니다.
코드로 구현 시
- 장점:
1) UI를 코드로 구현하면 스토리보드 인스펙터 영역에 없는 다양한 기능을 사용할 수 있습니다.
2) 팀 협업 시 수정내역을 알아보기 용이하여 충돌을 보다 쉽게 해결할 수 있습니다.
- 단점:
UI를 직관적으로 확인하기 어려운 단점이 있습니다.
👉 예시 - 스토리보드 구현 시 단점
아래 사진처럼 제약조건을 잘 설정했는데도 시뮬레이터에서는 레이아웃이 하나도 적용되지 않는 문제때문에 몇 시간을 헤맸다.
알고 보니, Content View에 클래스가 연결되어 있기 때문이었다.
<잘못된 상태>
<맞는 상태>
TableViewCell 클래스는 Cell에 연결되어야 한다. Content View에 연결되면 안 된다.
Content View 클래스 입력란을 비우니, 원하는 대로 시뮬레이터가 돌아갔다.
'Swift > 기술면접' 카테고리의 다른 글
기술 면접 대비 (2) - URLSession / 내부저장소 / CoreData / 화면 전환 (0) | 2024.04.24 |
---|