저번달에 면접 봤을 때 받았던 질문들과 구글링하다 나온 실무자들이 신입 지망자에게 하는 질문들을 뽑아
정리해야겠다 생각은 했지만 관련 항목들의 글들만 즐찾 해놓고 정리를 안해서 이제서야 부랴부랴하게되었다.
-출처들은 개념 파악후 스스로 다시 문서화 하겠다는 표시-
-대충 계속 수정/갱신하면서 관리할 예정인 글-
-마지막 수정일 4/12 일요일
실제 면접서 받은 질문들(순서 없음)
1. hash란 무엇인가?
해시 함수는 임의의 길이를 갖는 임의의 데이터에 대해 고정된 길이의 데이터로 매핑하는 함수를 말한다. 이러한 해시 함수를 적용하여 나온 고정된 길이의 값을 해시값이라고 한다. 이 값은 또한 해시 코드, 해시섬(sum), 체크섬[1] 등으로도 불린다해시 함수(hash function)는 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다. 해시 함수에 의해 얻어지는 값은 해시 값, 해시 코드, 해시 체크섬 또는 간단하게 해시라고 한다. 그 용도 중 하나는 해시 테이블이라는 자료구조에 사용되며, 매우 빠른 데이터 검색을 위한 컴퓨터 소프트웨어에 널리 사용된다. 해시 함수는 큰 파일에서 중복되는 레코드를 찾을 수 있기 때문에 데이터베이스 검색이나 테이블 검색의 속도를 가속할 수 있다.
https://siyoon210.tistory.com/85
해시(Hash)란 무엇인가?
해시 (Hash) 해시란 데이터를 다루는 기법 중에 하나로 검색과 저장이 아주 빠르게 진행됩니다! 아주 빠르게 진행될 수 있는 이유는 데이터를 검색할 때 사용할 key와 실제 데이터의 값이 (value가) 한 쌍으로 존..
siyoon210.tistory.com
2. Podfile.lock란?
pod install을 했을 시 설치 된 라이브러리의 버전을 기록함
그리고 설치된 라이브러리의 버전을 기록된 버전으로 유지/설치함 새로운 버전을 추적하지 않음
pod update는 Podfile.lock를 참조하지 않고 최신버전으로 업데이트함
3. 재귀함수란?
함수가 끝날 때 함수 자신을 다시 호출하는 것
끝나는 조건을 설정해놔야 함
예시/출처 : https://academy.realm.io/kr/posts/swift-tail-recursion/
Swift로 꼬리 재귀 사용하기
Swift에서 콜스택을 일정하게 유지할 수 있는 꼬리 재귀 사용법을 알려 드립니다.
academy.realm.io
4. 디자인 패턴이란?
다양한 개발환경에서도 비슷한 문제들이 발생할 수 있는데 이 비슷한 문제들을 해결하는 정형화된 해결책을 의미. 즉, 개발에서 비슷한 문제를 해결하는 일종의 템플릿이나 개발패턴이라고 할 수 있다
5. 뷰 생명주기에 대해 설명
viewDidLoad
최초로 뷰가 로드되었을 때 실행 실행 후 화면 이동을 통해 다시 뷰가 나타나도 실행되지 않음
↓
viewWillAppear
viewdidload 후 화면 이동 등의 동작으로 뷰가 다시 로드 되었을 때 최초로 실행
↓
viewDidAppear
뷰가 나타났다는 걸 컨트롤러에 알려줌
↓
viewWillDisappear
뷰가 사라지지 직전에 호출
↓
viewDidDisappear
사라진 후 호출
출처: https://zeddios.tistory.com/43
iOS ) View Controller의 생명주기(Life-Cycle)
안녕하세요! 오늘은 View Controller생명 주기에 대해 알아보겠습니다. iOS를 시작하려고 하거나, 배우고 있는 분들이라면 반드시 알아야 해요. 하나하나 제대로 알아봅시다 ㅎㅎ View Controller의 생명주기(Life..
zeddios.tistory.com
+ 추가 사항 앱 생명주기는
앱 생명주기(App’s Life Cycle)란?
앱의 실행부터 종료까지의 주기를 말하며, 앱이 foreground나 background에 있을 때 시스템 알림에 응답하고 기타 중요한 시스템 관련 이벤트를 처리하는 단계들을 말한다.
앱의 Main Run Loop는 모든 사용자가 발생시키는 이벤트에 따라 처리된다. 이벤트가 발생했을때, UIKit에 의해 설정된 Port를 통해 내부의 Event queue에 이벤트를 담아놓고, 담겨있는 이벤트를 Main Run Loop에서 하나하나씩 실행한다.
- UIApplication은 앱이 생성될 때 생성되고 죽을때까지 절대 죽지 않는다. 즉 무한 Loop이기 때문에 코드 내에 무한 Loop를 만들면 안 된다.
- Delegate 객체는 어떤상황이 되기 직전 혹은 직후에 호출된다.
- Application Delegate가 Life Cycle을 전달받는다. (Application Delegate를 통해 현재 상태를 알수있다. UIApplication은 우리가 못 건들기 때문)
- 앱은 window를 최소 한개이상 가지고 있다.
- window와 root view controller가 함께 맨 처음 흰 화면을 띄운다.
- IPhone은 1초에 60번, IPad는 120,240번 화면을 그린다.(2019년까지 나온 기기 기준)
출처: https://medium.com/@jgj455/오늘의-swift-상식-앱-생명주기-878dfe51d182
오늘의 Swift 상식 (앱 생명주기)
앱 생명주기(App’s Life Cycle)란?
medium.com
6. 제네릭?
제네릭 코드를 사용하면 사용자가 정의한 요구사항에 따라 모든 타입에서 작동할 수 있는 유연하고, 재사용 가능한 함수와 타입을 작성할 수 있습니다.
중복을 피하고 코드의 의도를 더 명확하고 추상적인 방법으로 표현할 수 있습니다.
예제에는 왜 '제네릭' 이라는 아이디어가 필요했는지, 어떤 불편함이 있었는지에 대해 설명합니다. 아래의 것들이 포함되어 있습니다.
제네릭 만든 이유 : inout 키워드 : #위치바꾸기 : #같은타입, 다른타입
출처: https://the-brain-of-sic2.tistory.com/11
Swift4 : 제네릭 : #Generics : #왜필요해? : #where키워드 : #제약사항걸기
안녕하세요 ! 씩이 입니다! 저는 Swift 와 iOS 를 공부하고 연구하는 학생입니다. 같은 분야를 공부하는 분들에게 조금이라도 도움이 주고 싶어서 공부하는 것들을 공유합니다. 제 3자가 있다고 가정하고 설명하기..
the-brain-of-sic2.tistory.com
7. MVC 패턴이란?
MVC는 Model-View-Controller 의 약자입니다.
개발 할 때, 3가지 형태로 역할을 나누어 개발하는 방법론입니다.
비지니스 처리 로직과 사용자 인터페이스 요소를 분리시켜 서로 영향없이 개발 하기 수월하다는 장점이 있습니다.
Model은 어플리케이션이 “무엇”을 할 것인지를 정의 합니다. 내부 비지니스 로직을 처리하기 위한 역할을 할 것입니다.
처리되는 알고리즘, DB, 데이터 등등.
Controller는 모델이 “어떻게” 처리할 지를 알려주는 역할을 할 것이고, 모바일에서는 화면의 로직처리 부분입니다.
View는 화면에 무엇인가를 보여주기 위한 역할을 합니다. 컨트롤러 하위에 종속되어, 모델이나 컨트롤러가 보여주려고 하는 모든 필요한 것들을 보여줄 것입니다. 그리고 사용자의 입력을 받아서 모델의 데이터를 업데이트를 합니다.
그리고 Controller는 Model과 View가 각각 무엇을 해야 할 지를 알고 있고, 통제합니다. 비지니스 로직을 처리하는 Model과 완전히 UI에 의존적인 View가 서로 직접 이야기 할 수 없게 합니다.
출처: https://medium.com/@jang.wangsu/디자인패턴-mvc-패턴이란-1d74fac6e256
[디자인패턴] MVC 패턴이란?
MVC 패턴은 기본적으로 사용하는 패턴인 데.. 설명이 잘 되시나요?
medium.com
8. class와 struct의 차이
아래 중단부분에 서술
9. thread(쓰레드)란?
하나의 프로세스 내에서 실행되는 작업흐름의 단위로 프로세스가 시작하는 동시에 동작하는 스레드를 메인 스레드라하고 이외의 추가로 생성되는 스레드를 서브 스레드라 한다. 보통 하나의 프로세스는 하나의 스레드를 갖지만 둘 이상의 스레드를 동시에 실행할 수도 있고 이를 우리는 멀티스레딩이라한다.
프로세스(Process) 란
하나의 프로그램이 메모리 상에서 실행되는 작업 단위입니다.
10. .gitignore의 기능 그리고 개념
깃에서 특정 파일 혹은 디렉토리를 관리 대상에서 제외할 때 사용하는 파일.
이 파일 안에 기입된 내용들은 모두 깃에서 관리하지 않겠다는 것을 의미합니다. 예를 들어 자동으로 생성되는 로그파일, 프로젝트 설정 파일 등을 관리 대상에서 제외할 수 있습니다
11. OOP란?
객체지향 프로그래밍(Object-Oriented Programming)
존재하거나 생각할 수 있는 것들을 객체라고 지정한다.
이 객체들을 통하여 각 객체와 그 객체들간의 관계를 설계하는 것이 객체 지향 프로그래밍이다.
특징 : 추상화, 캡슐화(은닉화), 상속성, 다형성
12. 싱글턴패턴(Singleton Patten)이란?
어떤 class가 단 하나만 존재하도록 강제하는 생성패턴
private init() {}으로 원천적으로 봉쇄해야함
Apple 예시
-UserDefault.standard/UIScreen.main/UIApplication.shread 등
13. inout의 기능
함수에서 직접 파라미터 값에 접근할 수 있도록 해주는 기능.
즉, 파라미터로 변수의 주소값을 넘겨 직접 접근할 수 있도록 해주는 기능이다.
사용예시
var first = 3
var second = 50
func add(inout a: Int, inout b: Int) {
let A = a
b = A
}
&를 붙여야 한다.
func(&first,&second)
first = 50 , second = 3
14. strong, weak, unowned에 대해서 설명
하단에 서술
15. mutable, immutable에 대해서
Immutable, 즉 값이 변하지 않는 변수( let으로 선언 했을 때)
mutable 값이 변할 수 있는 변수(var로 선언 했을 때)
16. Excaping closure에 대해서
하단 서술
17. 스스로 만든 delegate가 있으면 그거에 대한 설명
DropDownView를 만들어서 안에 UITableView로 체우고 cell을 만든 다음 해당 클래스 상단의 protocol을 만들고 var delegate를 만들어 해당 프로토콜을 초기화 UITableView didselected를 delegate로 채택시킨다.
다른 뷰컨트롤러를 상속하는 class에 DropDownView를 넣어서 delegate를 상속한 다음 delegate필수 함수를 구현한 다음
메뉴선택을 쓰는 delegate를 제작하였음
18. 비동기/동시성에 대한 설명
비동기(Asynchronous) 프로그래밍
프로그램의 주 실행 흐름을 멈추어서 기다리는 부분 없이 바로 다음 작업을 실행할 수 있게 하는 방식입니다. 즉, 코드의 실행 결과 처리를 별도의 공간에 맡겨둔 뒤 결과를 기다리지 않고 바로 다음 코드를 실행하는 병렬처리 방식입니다. 비동기 프로그래밍은 언어 및 프레임워크에서 지원하는 여러 방법으로 구현할 수 있습니다.
동시성(Concurrency) 프로그래밍
논리적인 용어로 동시에 실행되는 것처럼 보이는 것입니다. 싱글 코어(멀티 코어에서도 가능)에서 멀티스레드를 동작시키기 위한 방식으로 멀티 태스킹을 위해 여러 개의 스레드가 번갈아 가면서 실행되는 방식입니다. 동시성을 이용한 싱글 코어의 멀티 태스킹은 각 스레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 서로 번갈아 가면서 실행되고 있는 방식입니다.
19. Notification center에 대해서 설명(Observer 작동 원리, 범위 등)
ex)
비동기
병렬식 : 커피를 마시면 커피를 마실 때까지 아무일도 못하는 것
신문을 읽는 일은 신문을 읽는 사람(객체)가 따로 있다는 것.
동시성: 커피를 마시면서 신문을 보다가 책을 보고 커피를 마실 수 있는 것
## 동기와 비동기의 차이
### 비유를 통한 쉬운 설명
해야할 일(task)가 빨래, 설거지, 청소 세 가지가 있다고 가정한다. 이 일들을 동기적으로 처리한다면 빨래를 하고 설거지를 하고 청소를 한다. 비동기적으로 일을 처리한다면 빨래하는 업체에게 빨래를 시킨다. 설거지 대행 업체에 설거지를 시킨다. 청소 대행 업체에 청소를 시킨다. 셋 중 어떤 것이 먼저 완료될지는 알 수 없다. 일을 모두 마친 업체는 나에게 알려주기로 했으니 나는 다른 작업을 할 수 있다. 이 때는 백그라운드 스레드에서 해당 작업을 처리하는 경우의 비동기를 의미한다.
### Sync vs Async
일반적으로 동기와 비동기의 차이는 메소드를 실행시킴과 `동시에` 반환 값이 기대되는 경우를 **동기** 라고 표현하고 그렇지 않은 경우에 대해서 **비동기** 라고 표현한다. 동시에라는 말은 실행되었을 때 값이 반환되기 전까지는 `blocking`되어 있다는 것을 의미한다. 비동기의 경우, `blocking`되지 않고 이벤트 큐에 넣거나 백그라운드 스레드에게 해당 task 를 위임하고 바로 다음 코드를 실행하기 때문에 기대되는 값이 바로 반환되지 않는다.
출처 : https://baked-corn.tistory.com/42
[ios] NotificationCenter
NotificationCenter Intro 이전에 저는 키보드에 의해 TextField 가 가려지는 문제점에 대한 해결법을 포스팅한 적이 있습니다. 해당 포스팅에서 NotificationCenter 에 대해 간단히 언급을 했었습니다. [ios] 키..
baked-corn.tistory.com
20. 고차 함수들의 종류와그 기능들 설명
-Swift Standard Library의 map, filter, reduce, compactMap, flatMap
map
컬렉션 내부의 기존 데이터를 변형해서 새로운 컬렉션을 생성하는 함수
filter
컨테이너 내부의 값을 걸러서 추출하는 함수(Festagram에서 검색기능으로 사용했었음)
reduce
컨테이너 내부의 콘텐츠를 하나로 통합하는 함
compactMap
non-nil인 결과들을 가지는 배열을 리턴
21. UI(UITableView, UILabel, UIButton 등) 중 extension을 활용해서 커스텀 기능 혹은 UI를 만든 적이 있는가?
-굉장히 띵!!!했던 질문이자 내가 한번도 생각못했던 부문이었다.
당연히 해본적은 없고(...) String을 extension해서 UITextFieldDelegate함수에 문자열이 URL형식이면 자동인식해서 event가 발생하도록 해보았지만 이건 UI쪽이 아니니 정식으로 한번도 해본적은 없었다.
이런 질문은 내 한계를 지적하면서도 내가 무엇을 공부해야 하는지 콕 집어주는 아주 감사한 질문이어서 바로 공부를 시작해볼려고 한다.
한번 성공하면 따로 포스팅할 예정!!(4/12 기록)
22. Codable, Decodable을 써본 적이 있거나 쓸 수 있는 역량인가?
-쌈박하게 네 라고 했다(;;) 실제로 Boostcourse 5단계 Boxoffice에서 이걸 써서 Pass를 받은데다가 이해 안된다고 오만가지 실험을 해봤기 때문에 인코딩, 디코딩이 뭔지 이해했기 때문에 쓸 수 있다라고 대답했었음. 다만 그 때 이후로 잘 쓴적이 없어서 공부할 필요가 있음.
(4/12 기록)
23. breakPoint가 무엇인고 그 기능에 대해서 설명.
-동영상 강의 보면서 쓴적 밖에 없어서 에러 날때 몇번 쓴거 말곤 잘 안써봤다고 대답함
이것도 추후 공부해서 포스팅할 예정
(4/12 기록)
24. CoreData 사용을 한적이 있는가? 있으면 자세히 설명
-예전에 lazy, 클로져, 파라미터, 델리게이트 이런 걸 잘 모르고 책 보고 무작정 따라하던 시절에
개발 공부 중 한번 쯤은 만들게 되는 메모장 앱을 만들 때 사용한 적이 있었고 그 뒤로 한번도 사용을 안했었다고 대답했다.
그러나 이 대답은 내가 데이터 관리에 대해서 잘 모른다는걸 반증해버린 답변인데 오프라인 로컬 데이터 기능을 거의 쓰지 않고 순수하게 서버 즉 인터넷 연결 관련에 모든 부담을 써서 포트폴리오 앱을 만들었다는 결과가 되기 때문이다.
덕분에 최근 CoreData를 다시 공부를 시작하였고 이전과는 다른 좀 더 가독성 있고 Manager 파일을 따로 만들어서 CRUD 기능을 할 수
있는 공부용 프로젝트를 만들게 되었다. 이 프로젝트는 공부용이지만 MyPublicInterview 프로젝트에 쓰여질 거라 더 파고들 필요가 있고 이 과정에서 다른 UI들의 추가적인 사용을 공부할 수 있었다(UIStackView, UITableView 등)
나중에 swift 공부 항목에 추가할 예정
* 개요 및 기초
https://jcsoohwancho.github.io/2019-12-29-Core-Data-시작하기(1)-개요/
Core Data 시작히기(1) - 개요
이번 포스트부터 Core Data가 무엇인지, 어떻게 사용하는지에 대해서 알아보고자 합니다. 오랜만에 블로그를 작성하는 것이기 때문에 이번 시리즈는 짧은 호흡으로 최대한 자주 작성하여 Core Data를 빠르게 익히는 것을 목표로 하고 있습니다. Core Data란? Apple은 Core Data를 다음과 같이 설명하고 있습니다. Core Data is a framework that you use to manage the...
jcsoohwancho.github.io
사적인 질문도 몇개 받았었는데 케바케니 이건 안써야지
*자기소개서란 관련해서 따로 내용 첨삭이나 대필 받았냐는 질문 받아서 좀 놀랬당...글 잘쓴다는 얘긴 살면서 못들었는데
되려 짧고 굵게 써서 회사측에서 이력서 훑는 동안에 다 읽을 수 있게 만들어서 그런 것 같다. 비문이 적으면 인상이 좋게 남나보다!
*LocalData(device)를 활용한 것도 중요하게 여기는데 개인적으로 coredata는 잘 안써봐서 거기서 부족한 역량이 드러났다.
중요한건데 내가 대충 보고 포트폴리오에 쓴 firebase 공식 문서를 읽어도 모를 때라 두개를 동시에 하기 힘들어서 방치했었는데 이제는 그런 변명 따윈 먹히지 않을테니 coredata를 좀 잘 공부해야겠고 local과 server호환을 잘 공부해놔야겠다.
*면접 때마다 항상 내가 부족한걸 콕콕 집어내는 마성의 개발자님들....대답을 못하는 질문을 받을 때마다 항상 절망에 빠지지만 되려 이런 질문이 내 다음 공부할 길을 잡아주는 거라 생각하니까 절망만 하고 있을 수만은 없게 해주는 것 같다 아쉽지만 내 탓이니 더 정진해야지!
자료 찾다가 발견한 질문들
1. 질문 리스트
출처: https://medium.com/lookpin-engineering/ios-개발자-면접-질문리스트-b92350a91c1b
iOS 개발자 면접 질문리스트
해당 질문들은 예상 질문으로 실제 면접 시 다른 질문과 형태로 면접이 진행될 수 있습니다.
medium.com
그리고 이 질문들의 답변을 찾아냈으니(...스스로 알아볼 생각은 안하고)
출처: https://github.com/sungeunDev/iOS-Dev-Career
sungeunDev/iOS-Dev-Career
iOS 개발 면접 질문을 정리합니다. Contribute to sungeunDev/iOS-Dev-Career development by creating an account on GitHub.
github.com
출처: http://brannpark.github.io/blog/post/20190322_swift_ios_interview_qna/
Swift iOS 기본 인터뷰 질문에 대한 정리글
웹서핑을 하다가 우연히, 어떤 회사의 어떤 면접관이 올려놓은 기술 인터뷰 질문 목록을 보았다. 음.. 아무리 기본에 대한 거라지만 기술면접질문을 공개하다니.. 실
brannpark.github.io
이 아래는 위 출처들을 정리한 것! 출처 작가님 감사드려요!
1. ARC(Automatic Reference Counting)는 어느 시점에 작동하나요?
먼저 ARC란?
Swift는 Automatic Reference Counting (ARC) 을 통해 앱의 메모리 사용량을 추적하고 관리한다. ARC는 클래스의 인스턴스가 더이상 필요하지 않다고 판단하면 자동으로 해당 인스턴스의 메모리를 해제해준다. 대부분의 경우 잘 동작하기 때문에 그냥 맡겨놔도 되지만, 그럼에도 개발자가 신경써야 할 몇 가지 케이스가 있다.
레퍼런스 카운팅은 오직 클래스의 인스턴스에만 적용된다. 구조체와 ENUM은 값 타입이기 때문에 참조reference가 저장되거나 전달되는 일이 없다.
클래스의 인스턴스가 만들어질 때 ARC는 메모리를 할당해준다. 할당된 메모리가 가지는hold 정보는 인스턴스의 타입 정보, 인스턴스와 연관된 stored 프로퍼티의 값들이다.
클래스의 인스턴스가 더 이상 필요하지 않을 때 ARC는 할당된 메모리를 해제하여 다른 목적으로 쓰일 수 있도록 해준다. (쓸데없는 메모리 차지를 방지)
ARC는 아직 사용중인 인스턴스를 해제하지 않도록 주의를 기울인다. 만약 사용중인 인스턴스가 해제deallocate될 경우 인스턴스의 프로퍼티나 메서드에는 더 이상 접근할 수 없게 되기 때문에 Crash의 위험이 있기 때문이다.
따라서 ARC는 클래스 인스턴스를 참조하고 있는 프로퍼티, 상수, 변수들을 추적하고, 만약 "strong" 참조가 하나라도 있다면 해제하지 않는다.
(클래스 인스턴스가 프로퍼티, 상수, 변수 등에 할당될 때는 strong 참조가 되는데, 이게 하나라도 걸려있다면 ARC는 해당 인스턴스가 사용중이라고 판단하여 해제를 하지 않는다는 말이다.)
즉 ARC는 컴파일 시점에 동작. 코드를 빌드(컴파일) 할때 특정 객체의 레퍼런스 카운트를 추적하여 0 가 되는 시점에 자동으로 release 코드를 넣어주는것을 말한다.
출처: https://wlaxhrl.tistory.com/51
Automatic Reference Counting (ARC)
Apple 제공 Swift 프로그래밍 가이드(3.0.1)의 Automatic Reference Counting 부분을 공부하며 정리한 글입니다. 개인적인 생각도 조금 들어가있습니다. 들어가며 Swift는 Automatic Reference Counting (ARC) 을..
wlaxhrl.tistory.com
2. strong, weak, unowned 키워드를 어떤 상황에서 사용하고, 차이는 무엇인가요?
Strong
strong
swift에서 어떠한 설정도 없을 때의 기본값. 이 키워드로 선언된 (정확히는 weak 이나 unowned 로 명시되지 않은) 레퍼런스 객체는 할당되는 순간 해당 객체의 레퍼런스 카운트를 증가시킨다.
레퍼런스 카운트를 증가시켜 ARC 로 인한 메모리해제를 피하고 객체를 안전하게 사용하고자 할 때 쓰인다.
예를 들자면, 어떤 A 라는 메서드에서 a 라는 레퍼런스 객체를 생성하고, 이를 비동기 실행 클로저에 파라미터로 전달한다면,
A 라는 메서드의 호출이 끝나는 순간, 해당 레퍼런스 객체의 레퍼런스 카운트는 1 감소하게 되는데,
클로저에 strong 타입으로 전달된 경우는 레퍼런스 카운트가 +2 이기 때문에 최종 +1 상태가 되어 메모리 해제되지 않는다.
따라서 해당 클로저에서 안전하게 해당 객체에 엑세스하여 커뮤니케이션이 가능하게 된다.
또는 다른 Class 나 Struct 의 프로퍼티에 어떤 레퍼런스 객체가 할당 될 때, strong 타입으로 지정하게 되면, 레퍼런스 카운트가 +2 가 되며,
따라서 본래 생성되었던 곳에서 레퍼런스 카운트가 1 감소하더라도, 전달받은 곳에서는 안전하게 사용이 가능하다.
다만 strong 순환 참조는 클로져 캡쳐링이나 객체간 서로 참조 등등의 경우에서 참조 카운트가 0이 되지 않는 상황이 발생할 때가 있기 때문에 메모리 누수가 발생할 수 있기에 weak를 사용할 경우가 있다.
weak
객체가 할당될 때 레퍼런스 카운트를 증가시키지 않는다. 이 키워드는 Optional 타입에만 적용이 된다. 객체가 ARC 에 의해 메모리해제되면 nil 값이 할당된다.
대표적으로 retain cycle 에 의해 메모리가 누수되는 문제를 막기 위해 사용되며, iOS 프레임워크에서 이의 대표적인 예로는 Delegate 패턴이 있다.
unowned
객체가 할당될 때 레퍼런스 카운트를 증가시키지 않는다.
그러나 Non-Optional 타입으로 선언되어야 하며, 객체가 ARC 에 의해 메모리해제되더라도,
해당 객체 값을 존재하는 것으로 인지하며, 해당객체에 액세스 할 경우 런타임 오류를 발생시킨다.
객체의 라이프사이클이 명확하고 개발자에 의해 제어가 가능이 명확한 경우, weak Optional 타입 대신 사용하여 좀더 간결한 코딩이 가능하다.
다만 unowned는 해당 객체는 절대 nil(Null) 일 수 없다. “Optional 객체가 아니다”라고인식하기 때문에 잘 사용하지 않는다.
3. 객체 간 순환참조를 발견하는 방법과 해결 방법은?
- 인스턴스의 참조카운트가 절대로 0이 되지 않는 경우. 즉, 두 인스턴스가 서로를 강하게 참조하고 있을 때 순환 참조가 발생함
- 순환 참조가 발생하면 두 인스턴스는 메모리 상에 계속 존재하기 때문에 memory leak이 발생하는데, Xcode의 메모리 그래프 디버거를 통해 memory leak(메모리 누수)를 찾아낼 수 있음.
- 해결방법: 인스턴스간 참조 관계를 강한 참조가 아닌 weak 또는 unowned 참조로 바꿔주어야 함.
4. Escaping Closure의 개념이 무엇인가요?
메서드 파라미터로 전달받은 closure 를 메서드의 라이프사이클 내에서 실행하여 끝내지 않고, 메서드 scope 의 외부에 전달하려 할 때는 해당 closure 를 escaping 해야한다.
해당 메서드의 호출이 끝난 이후에도 closure 는 메모리 어딘가에 저장되어야 하며, 이는 closure 안에서 사용된 outer object (self 와 같은) 에 weak 와 같은 레퍼런스타입을 사용해야할 수 있음을 주의하도록 한다.
escaping 이 명시되어있지 않으면 기본적으로 non-escaping 이며, 이는 메서드의 실행이 끝나기 전에 closure 의 사용이 모두 완료됨을 보장하며, 따라서 closure 내에서 weak 을 굳이 사용하지 않아도 안전할 수 있음을 의미하기도 한다.
클로저가 함수로부터 Escape한다는 것은 해당 함수의 인자로 클로저가 전달되지만, 함수가 반환된 후 실행 되는 것을 의미한다. 함수의 인자가 함수의 영역을 탈출하여 함수 밖에서 사용할 수 있는 개념은 기존에 우리가 알고 있던 변수의 scope 개념을 무시합니다. 왜냐하면 함수에서 선언된 로컬 변수가 로컬 변수의 영역을 뛰어넘어 함수 밖 에서도 유효하기 때문입니다.
사실 일반 로컬 변수(주로 값들: Int, String 등등)가 함수 밖에서 살아있는 것은 전역 변수를 함수에 가져와서 값을 새로 주는 것과 크게 다르지 않기 떄문에 이와 같은 Escape 개념이 크게 의미가 없어 보입니다. 하지만, 클로저의 Escaping은 A 함수가 마무리된 상태에서만 B 함수가 실행되도록함수를 작성할 수 있다는 점에서 유용합니다.
Escaping Closure를 활용하면 통해서 함수 사이에 실행 순서를 정할 수 있습니다.
출처: https://hcn1519.github.io/articles/2017-09/swift_escaping_closure
Swift Escaping Closure 이해하기
Swift의 Escaping Closure에 대해 알아봅니다.
hcn1519.github.io
5. 타입 캐스팅을 할 때 사용하는 키워드인 as, as?, as! 이 셋의 차이는 무엇인가요
as
컴파일러가 타입 변환의 성공을 보장. 컴파일타임에 가능/불가능 여부를 알 수 있음
as?
타입변환에 실패하는 경우 nil 을 리턴. 컴파일타임에 가능/불가능 여부를 알 수 없음
as!
타입변환에 실패하는 경우 실행시간(Runtime) 오류를 발생시킴. 컴파일타임에 가능/불가능 여부를 알 수 없음
6. Swift에서 Class와 Struct의 차이는 무엇인가요?
Class - Reference type
- 객체화 시 힙 메모리영역에 저장되며 ARC 로 객체의 메모리해제가 관리된다.
- 대입 연산 시 레퍼런스가 복사되어 할당됨. (공유 가능)
- 멀티스레딩 시 적절한 Lock 활용이 필요.
- 상속 가능.
Struct - Value type
- 대입 연산 시 값 자체가 복제되어 할당됨(공유가 불가능).
- 불변성(Immutable) 구현에 유리.
- 멀티스레딩에 안전함.
- 상속이 불가능. (protocol 은 사용 가능)
8. Frame 과 Bounds 의 차이는 무엇인가요?
Frame
SuperView(상위뷰) 좌표시스템 내에서의 view 의 위치(origin) 과 크기(size)
Bounds
view 자기 자신의 좌표시스템에서의 위치와 크기. 부모부와의 위치관계와는 아무런 관계가 없다.
자기 자신의 좌표시스템을 가리키기 때문에 기본적으로 origin 은 x:0, y:0 을 가리킨다.
bounds 의 origin 을 변경한다는 것은 곧, subview 들이 화면상에서 drawing 되는 위치가 변경됨을 의미한다
이게 subview 들의 frame 값을 변화시키는게 아니다. 부모뷰 좌표축이 변하면서 subview 가 그려져야하는 위치가 달라졌기 떄문이다.
ScrollView/TabeView 등을 스크롤 할때, scrollView.bounds 가 변하고, 그리하여 subview 들의 그려지는 위치가 달라지는 것이 대표적인 예 이다. (subview 들의 frame 이 달라지는게 아님!)
9. UIViewController클래스내 프로퍼티인TopLayoutGuide와 BottomLayoutGuide가 iOS11에서 deprecate된 이유와 이를 대체하기위해 어떤것이 생겼을까요?
SafeAreaLayoutGuide
기존 Top, Bottom 레이아웃 가이드와는 다르게, 안전한 컨텐츠 영역의 개념으로 등장했다.
기존이 상단, 하단, 두개의 사각 영역으로 되어있는 가이드영역이었다면,
SafeAreaLayoutGuide 의 영역은 하나의 사각 영역으로 되어있다.
10.UIStackView의 장점은 무엇이라고 생각하시나요?
여러 뷰를 가로방향 또는 세로방향으로 배치할 때, 복잡한 컨스트레인트 설정 없이, 또는 컨스트레인트 만으로 설정하기 어려운 뷰의 배치등을 구현할 때 쓰일 수 있는 뷰.
aggangedSubview 로 하위뷰들이 관리되며, 이 하위뷰들에 Axis(가로 세로 방향), Alignment(세로방향 정렬), Distribution(가로방향 정렬), Spacing(하위뷰들간의 간격) 의 규칙을 적용할 수 있다.
10.
11. Autolayout Constraint의 Priority의 개념이 무엇이고, 어떤상황에 사용하나요?
말그대로 제약들간의 우선순위를 말한다.
다수의 뷰들에 여러제약이 걸려있을 때, 보통은 제약간의 충돌이 일어나지 않게끔 제약들을 설계하는게 일반적이지만,
상황에 따라서는 뷰들의 크기가 유동적으로 변하는 경우가 있는데, 이럴때 어떤 제약들이 서로간에 충돌이 일어나는 경우가 있을 수 있다.
이럴때에는 어떤 제약의 우선순위를 더 우위에 둘것이냐를 결정함으로써 이러한 충돌을 해결할 수 있다.
12. Content Hugging Priority의 개념이 무엇이고, 어떤상황에 사용하나요?
UI Framework 에서 제공되는 일부 뷰에는 컨테츠 고유의 사이즈(Contrisic content size)라는 개념이 있다.
예를 들자면, UILabel, UIButton 들과 같이 뷰의 속성(텍스트 / 이미지) 에 따라 크기가 결정되는 (특정한 너비/높이 사이즈의 제약을 걸지 않은 한) 뷰들이 있겠다.
이러한 뷰들은 다른 뷰들간에 걸린 제약에 의해, 본래의 컨텐츠 고유 사이즈보다 더 늘어나거나 줄어들게 될 수 있다.
이때 더 늘어나게 되는 것에 대해 저항하는 제약을 Content Hugging 이라 하고,
더 줄어들게 되는 것에 대해 저항하는 제약을 Content Compression Resistance 라고 한다.
이 고유 컨텐츠 사이즈의 변경에 대한 제약에도 우선순위(Priority) 가 있는데, 이는 Autolayout constraint priority 보다는 우선순위가 낮다.
다시 말해서, 우선순위가 서로 같은 값을 가진다고 하면, 오토레이아웃 제약의 우선순위가 적용이 된다는 얘기다.
이 중, Content Hugging 에 대해 간략히 설명해 보자면, 예를 들어, 부모뷰의 너비/높이가 100x100 이라고 하고,
그 안에 UILabel 을 하나 두되, 이 레이블에는 너비 높이 제약을 주지 않고, 다만 leading, tailing, top, bottom 의 제약을 주어, 각각의 제약들에 10의 값을 지정한다고 하자.
그렇다면 해당 레이블의 크기는 80x80 이 되도록 제약에 의해 결정되어진다고 볼 수 있다.
그러나 이는 항상 맞는 얘기가 아니다.
예를 들어, 레이블의 leading, tailing, top, bottom 제약의 우선순위를 250 으로 주고, ContentHugging priority 를 750 으로 준다면,
우선순위에 따라 레이블의 크기는 레이블 컨텐츠 고유의 크기로 결정이 되고, 따라서 네 방향의 제약은 모두 충돌이 나게 된다.
실제로 사용될 수 있는 예를 하나 들어보자면,
높이 제약이 설정되어있지 않은 어떤 뷰의 하위에, 세로방향으로 2개의 레이블을 배치하고, 서브뷰 끼리의 vertical spacing 제약, 각각의 뷰들과 부모뷰와의 top, bottom 제약을 걸어 chaining 형태의 제약을 걸었다고 생각해보자.
그러면, 부모뷰의 높이는 자식뷰(두개의 레이블)의 높이(intrinsic content size) 와 뷰들 간의 간격, 부모뷰와의 간격값의 합으로 결정이 된다.(AutoLayout)
이러한 경우, 부모뷰의 높이값을 어떤 특정한 값으로 지정해 더 커지도록 하게 되면, 자식뷰(레이블)들의 높이또한 변경되어야 하는데, (상하 간격 제약을 위반하지 않기 위해서)
이때 상단의 레이블의 크기는 고정시키고, 하단의 레이블의 높이만을 변경되게 하고 싶다면,
해당 레이블의 ContentHugging priority 값을 다른 레이블의 priority 보다 낮게 지정함으로써 원하는 레이아웃을 이룰 수 있게 된다.
물론 이때, 모든 레이블의 ContentHugging priority 는 자식 뷰와(그리고 자식 뷰들 사이의 간격) 부모 뷰 사이에 설정된 상하 간격 제약들의 priority 보다 같거나 작아야 한다.
13. UICollectionViewLayout클래스에 prepare 메소드는 어떤 역할을 하나요?
레이아웃관련 연산이 일어날 때마다 가장 먼저 호출된다. 이 메소드에서 셀의 위치/크기 등을 계산하기 위한 사전처리를 할 수 있다.
UICollectionViewLayout 를 상속받아 Custom 한 CollectionView Layout 을 구성하고자 할때, 데이터소스를 참조하여 셀의 위치 및 크기를 미리 계산하여 캐싱해두고,
CollectionView 로부터 셀의 위치 및 크기 요청이 들어올때, 미리 계산하여 캐싱해둔 데이터를 전달해주는 방식으로 커스텀 레이아웃을 구성하는 방식이 있겠다.
14. UITableView를 구성할때 셀의 컨텐츠에 따라 높이를 설정하고싶다면 어떻게 해야하나요?
델리게이트 메서드 rowHeight 에서는 UITableView.automaticDimension 값을 리턴하고 ,estimatedRowHeight 에서는 셀의 예측 높이값을 리턴한다.
이렇게 하면 오토레이아웃 테이블뷰 셀 구현이 가능하다.
마찬가지로 테이블뷰 셀은, 고정 높이가 아닌, 셀 안의 서브뷰들의 제약 구성으로 셀의 크기가 결정될 수 있도록 해야한다.
- 각 IndexPath 별로 셀 내 컨텐츠의 높이를 계산하여 tableView:heightForRowAtIndexPath: 메서드로 셀의 높이를 지정
- AutomaticDimension을 통해 셀 높이가 유동적으로 선언한 후, tableView:estimatedHeightForRowAtIndexPath: 메서드 혹은 직접 지정을 통해 테이블 뷰의 프로퍼티인 estimatedRowHieght를 설정
- 필수 조건:컨텐츠의 오토레이아웃을 설정
- 4.heightForRowAtIndexPath 함수를 오버라이딩 해서는 안됨
- 주의점은 테이블을 reload 할 때 estimatedRowHeihgt에 따라 스크롤 position이 정해지기 때문에 추정치를 너무 작게 잡으면 테이블을 reload 했을 때 이상한 곳에 스크롤 되는 경우가 발생함.
15. StoryBoard가 Git 에서 충돌이 발생했습니다. 어떻게 해결하고 예방 하시겠습니까?
- github 혹은 git log 파일명 등을 이용하여, origin/master 에 충돌난 파일을 마지막으로 커밋한 팀원을 확인한다.
- 같이 모니터 앞에 앉는다.
- 가위 바위 보... 등을 통하여 누구 소스를 살릴..지 결정한다.
- 내 소스를 살리고, 팀원 소스를 버리기...로 결정하였다면, 'ours' 옵션을 이용하여 checkout 한다.
- 서버에 반영되었던 팀원 소스를 살리고 내 소스를 버리기...로 결정하였다면 'theirs' 옵션을 이용한다.
git checkout --ours /충돌난파일경로/파일명 아니면, git checkout --theirs /충돌난파일경로/파일명
만약, 두사람의 구현 내역 모두 다 살려야 한다면?
- 먼저, 로컬의 충돌 파일을 --ours 로 체크아웃 한다.
- github 에서 충돌 기준 시점의 프로젝트 파일 전체를 새로 다운 받는다.
- 둘이 사이좋게 Xcode 를 두개 띄워놓고 스토리 보드를 띄워서 로컬에서 하나로 합친다.
- 기존 작업중인 것 1개
- 서버에서 받은 충돌 시점의 소스 1개
- 분쟁 해결!
[iOS 입문기]git 충돌 방지 방법
iOS 프로젝트를 경험해보면서 느낀 점 중 하나는, iOS를 git으로 협업하기 참 까다롭다는 것..1.Andro...
blog.naver.com
2. github에서 찾은 질의답변 모음
출처: https://github.com/giftbott/iOSDevLinks
giftbott/iOSDevLinks
iOS 개발자를 위한 링크 모음. Contribute to giftbott/iOSDevLinks development by creating an account on GitHub.
github.com
스스로 부족한 분야에 대한 개념들이나 꼭 물어볼 것 같은 질문들
1. enum관련(Boostcoures 과제 중 리뷰 받았던 부분)
https://developer.apple.com/documentation/swift/caseiterable
CaseIterable - Swift Standard Library | Apple Developer Documentation
Types that conform to the CaseIterable protocol are typically enumerations without associated values. When using a CaseIterable type, you can access a collection of all of the type’s cases by using the type’s allCases property. For example, the CompassDire
developer.apple.com
위 문서와 관련된 자료
https://pilgwon.github.io/blog/2018/05/20/Whats-new-in-Swift-4-2.html
스위프트 4.2에선 어떤 것이 새로워졌을까요?
What’s new in Swift 4.2?
pilgwon.github.io
2. forEach의 사용
-기록예정
3. GET/POST의 차이
https://hongsii.github.io/2017/08/02/what-is-the-difference-get-and-post/
GET과 POST의 차이
HTTP HTTP는 웹상에서 클라이언트와 서버 간에 요청/응답으로 데이터를 주고 받을 수 있는 프로토콜입니다. 클라이언트가 HTTP 프로토콜을 통해 서버에게 요청을 보내면 서버는 요청에 맞는 응답을 클라이언트에게 전송합니다. 이 때, HTTP 요청에 포함되는 HTTP 메소드는 서버가 요청을 수행하기 위해 해야할 행동을 표시하는 용도로 사용합니다. 이 HTTP 메소드 중 GET과 POST의 특징과 차이점을 알아보겠습니다.
hongsii.github.io
4. foreground/background에 대해서
- 뷰생명주기와 살짝 겹치지만 조금 다른 것도 파악해야함 갱신 예정
5. static이란?
6. UIGestureRecognizer 개념과 종류들
-swipe,tap, dragging 등 알아둘 것
7. Codable/Decodable
8. 접근 제어(Access control)
Open, public,internal,private,fileprivate 각각에 대한 내용숙지 필요
9. Content inset/Offset
10. overriding와 overloading의 차이
overriding
1) 상위 클래스에서 상속 받은 메서드를 하위 클래스에서 필요에 다라 재정의 하는 것
2) 동일 요청이 객체에 따라 다르게 응답
overloading
1) 동일한 이름의 메서드가 매개 변수의 이름, 타입, 개수 등의 차이에 따라 다르게 동작하는 것
2) 동일 요청이 매개 변수에 따라 다르게 응답
ARC자료출처 : https://wlaxhrl.tistory.com/22
Automatic Reference Counting (ARC)
Swift 3.0.1 가이드에 대응하는 정리글을 작성하였습니다!!! ARC 정리 최신버전 > http://wlaxhrl.tistory.com/51 Apple 제공 Swift 프로그래밍 가이드(2.2)의 Automatic Reference Counting 부분을 공부하며 정리..
wlaxhrl.tistory.com
글 문단 마다 아래에 출처가 있는 해당 내용들은 출처사이트서 쓰여진걸 한번에 보기 위해 그대로 가져온 것! 내가 쓴게 아님
출처저자들에게 다시 한번 감사인사를 드립시다.
'IOS Swift > Swift 공부 기록' 카테고리의 다른 글
Swift) UITableViewCell에 UICollectionViewCell 넣기 (0) | 2020.04.27 |
---|---|
Swift) Protocol/Get Set/ Subscript 기초 공부 (0) | 2020.04.18 |
Swift) UIStackView에 UIButton 넣기! (0) | 2020.04.16 |
Swift) Generic 기초 (0) | 2020.03.27 |
IOS SWIFT: Notification Push 보내기(개발자 계정 X) (0) | 2020.03.21 |