당신은 주제를 찾고 있습니까 “ios 면접 질문 – 앱개발_리얼면접 Ep13 ㅣ ‘알집’ 이스트소프트 면접리뷰“? 다음 카테고리의 웹사이트 https://you.tfvp.org 에서 귀하의 모든 질문에 답변해 드립니다: https://you.tfvp.org/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 피곤한유대표 이(가) 작성한 기사에는 조회수 5,654회 및 좋아요 89개 개의 좋아요가 있습니다.
iOS 앱을 만들고, User Interface를 구성하는 데 필수적인 프레임워크 이름은 무엇인가? Foundation Kit은 무엇이고 포함되어 있는 클래스들은 어떤 것이 있는지 설명하시오. Delegate란 무엇인지 설명하고, retain 되는지 안되는지 그 이유를 함께 설명하시오.
ios 면접 질문 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 앱개발_리얼면접 Ep13 ㅣ ‘알집’ 이스트소프트 면접리뷰 – ios 면접 질문 주제에 대한 세부정보를 참조하세요
안녕하세요
주작없는 리얼면접 피곤한 유대푭니다~~:)
이스트소프트 공채를 앞두고
시리즈로 업로드 하고 있는데요~
오늘의 직무는 ‘앱개발’입니다.
목요일에 업로드되는 풀버전에는
모든 질문과 대답이 Full로 나와 있으니,
풀버전도 많이많이 참고해주세요~~:D
#피곤한유대표 #취업 #채용 #자소서 #면접 #리뷰 #자기소개
주.작.없.는 리.얼.면.접 [feat.피곤한유대표]★ 매주 화 오후 5시 : 면접 편집본
★ 매주 목 오후 5시 : 면접 Full
★ 문의 : [email protected]
★ 구독/좋아요/알림설정🔔
Music by 브금대통령
Music provided by 브금대통령
Watch : https://www.youtube.com/user/GwooA
ios 면접 질문 주제에 대한 자세한 내용은 여기를 참조하세요.
Swift – 테크 피드 – 프로그래머스 커리어
Swift. iOS 개발자 면접 질문 리스트. 클래스의 새로운 인스턴스를 만들 때 ARC는 인스턴스의 정보를 저장하기 …
Source: career.programmers.co.kr
Date Published: 12/11/2021
View: 2432
[iOS]면접 정리(1) – 서기의 개발집
기술 면접 관련 질문들. 1.1. final 에 대하여 ▾. 1.1.1. 사용의 의미. 1.1.2. 코드의 런타임 성능이 향상된다 ❓. 1.2. ARC 에 대하여 ▾.
Source: jiseok-zip.tistory.com
Date Published: 1/20/2022
View: 8338
iOS 개발자가 읽어봐야 할 면접 질문(외에도 _? – velog
면접자료들이 많이들 퍼져있어서 한군데로 모아두고싶기도 했고 개인적으로 제가 보고싶어서 저장하고 싶었습니다.
Source: velog.io
Date Published: 11/6/2021
View: 5967
iOS 개발자 면접 질문 리스트 – 생각창고
ARC란? ARC (Automatic Reference Counting)란, 자동 레퍼런스 카운팅으로서 자동으로 메모리를 관리해주는 방식을 말한다. 참조 카운팅이 0이 될때만 …
Source: ugly-developer.tistory.com
Date Published: 6/1/2022
View: 8402
iOS 면접 질문 리스트
iOS 면접 질문 리스트. devsrkim 2020. 8. 16. 18:31. 1. ARC(Automatic Reference Counting). : 자동 레퍼런스 카운팅으로서 자동으로 메모리를 관리해주는 방식을 …
Source: devsrkim.tistory.com
Date Published: 2/20/2021
View: 5741
[iOS/Swift] 신입 면접 질문 정리 (22.05.04 업데이트)
직접 들은 질문들 + 유명한 iOS 면접 질문들 섞어서 정리해봅니다! 1. ARC (Automatic Reference Counting). 더보기.
Source: doh-an.tistory.com
Date Published: 4/17/2022
View: 5780
Swift 인터뷰 상위 50 개 질문 (Swift iOS 인터뷰) – 다른
상위 50 개의 Swift 인터뷰 질문 (Swift iOS 인터뷰 질문). Swift는 Apple 기기 용 앱 개발에 가장 많이 사용되는 언어입니다.
Source: ko.myservername.com
Date Published: 1/19/2021
View: 5930
Swift – iOS 면접 질문 리스트 – 뭉기의 개발 이야기
Swift – iOS 면접 질문 리스트 … 해당 면접 질문 리스트에 대해 노션으로 작업 중에 있습니다. 많은분들의 블로그와 지식을 참고하여 한개한개씩 작성중에 …
Source: moonggi-dev-story.tistory.com
Date Published: 11/19/2021
View: 310
[면접질문] 스위프트(Swift) 75문 75답 – 개발하는 훈이
스위프트에서 Extension은 어떻게 사용되나요? (What are Extensions used for in Swift?) Extension은 클래스, 구조체, 열거형 타입에 새로운 …
Source: jeonyeohun.tistory.com
Date Published: 11/8/2022
View: 7239
주제와 관련된 이미지 ios 면접 질문
주제와 관련된 더 많은 사진을 참조하십시오 앱개발_리얼면접 Ep13 ㅣ ‘알집’ 이스트소프트 면접리뷰. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 ios 면접 질문
- Author: 피곤한유대표
- Views: 조회수 5,654회
- Likes: 좋아요 89개
- Date Published: 2020. 9. 15.
- Video Url link: https://www.youtube.com/watch?v=Yat1Kzywh_g
JeaSungLEE/iOSInterviewquestions: 👨🏻💻👩🏻💻iOS 면접에 나올 질문들 총 정리
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
iOS 개발자 면접 질문 리스트
iOS
ARC(Automatic Reference Counting)에 대해 설명하세요.
ARC란? ARC (Automatic Reference Counting)란, 자동 레퍼런스 카운팅으로서 자동으로 메모리를 관리해주는 방식을 말한다. 참조 카운팅이 0이 될때만 메모리에서 해제한다는 뜻이다.
동작 원리 클래스의 새로운 인스턴스를 만들 때 ARC는 인스턴스의 정보를 저장하기 위해 메모리를 할당합니다. 또한 ARC는 인스턴스가 더 이상 사용되지 (참조 카운팅 0) 않는다고 판단하면 메모리를 해제합니다. 레퍼런스 프로퍼티에 인스턴스를 할당하면 ARC는 참조되는 프로퍼티의 갯수를 카운팅하여 참조하는 모든 변수가 인스턴스를 해제하기 전에 ARC는 인스턴스를 메모리에서 해제하지 않습니다.
동작 시점 컴파일 시점에 동작한다.
구체적인 예시 설명
class Person { let name: String init(name: String) { self.name = name println(“\(name) is being initialized”) } deinit { println(“\(name) is being deinitialized”) } }
Person 클래스는 이니셜라이저를 가지며 인스턴스의 name 속성을 설정하고 초기화 진행 중이다고 표시하는 메시지를 출력합니다.
Person 클래스는 디이니셜라이저를 가지며 클래스의 인스턴스가 해제될 때 메시지를 출력합니다.
// Person 클래스 타입을 갖는 reference 변수 3개를 선언. 모두 옵셔널 변수이므로 초기값은 nil을 갖고 있습니다. var reference1: Person? var reference2: Person? var reference3: Person? //reference1 변수에 Person 인스턴스 생성하여 참조하게됩니다. reference1 = Person(name: “John Appleseed”) //나머지 두 변수를 reference1를 참조하게 합니다. reference2 = reference1 reference3 = reference1 /*이시점의 인스턴스에 대한 참조 횟수는 3이된다. 그런 후 reference1, reference2 참조 해지합니다. 그렇게 되면 Person 인스턴스에 대한 참조 횟수는 아직 1이어서 Person 인스턴스는 해지되지 않습니다.*/ reference1 = nil reference2 = nil /* Pesron 인스턴스를 참조하고 있는 나머지 변수 refernce3의 참조 해지하면 더이상 Person 인스턴스를 참조하고 있는 것이 없으므로 ARC가 Person 인스턴스 메모리를 해지합니다. */ reference3 = nil
ARC와 GC(Garbage Collection)의 차이점
메모리 관리 기법 ARC GC 참조 카운팅 시점 컴파일 시 프로그램 동작 중 장점 1. 컴파일 당시 이미 인스턴스의 해제 시점이 정해져 있어서 인스턴스가 언제 메모리에서 해제될지 예측할 수 있습니다.
2. 컴파일 당시 이미 인스턴스의 해제 시점이 정해져 있어서 메모리 관리를 위한 시스템 자원을 추가할 필요가 없습니다. 1. 상호 참조 상황 등의 복잡한 상황에서도 인스턴스를 해제할 수 있는 가능성이 더 높습니다.
2. 특별히 규칙에 신경 쓸 필요가 없습니다. 단점 ARC의 작동 규칙을 모르고 사용하면 인스턴스가 메모리에서 영원히 해제되지 않을 가능성이 있습니다. 1. 프로그램 동작 외에 메모리 감시를 위한 추가 자원이 필요하므로 한정적인 자원 환경에서는 성능 저하가 발생할 수 있습니다.
2. 명확한 규칙이 없기 때문에 인스턴스가 정확히 언제 메모리에서 해제될지 예측하기 어렵습니다.
Weak와 Strong에 대해 설명하세요. ( + unowned)
Strong(강한참조) – strong은 객체를 소유하여 레퍼런스 카운트가 증가하는 프로퍼티이다. 값 지정 시점에 retain이 되고 참조가 종료되는 시점에 release가 된다.
strong은 객체를 소유하여 레퍼런스 카운트가 증가하는 프로퍼티이다. 값 지정 시점에 retain이 되고 참조가 종료되는 시점에 release가 된다. Weak(약한참조) – weak은 객체를 소유하지 않고 주소값만을 가지고 있는 포인터 개념이다. 자신이 참조는 하지만 weak 메모리를 해제시킬 수 있는 권한은 다른 클래스에 있다. 값 지정시 리테인이 발생하지 않는다. 따라서 릴리즈도 발생하지 않는다. 그래서 언제 어떻게 메모리가 해제될 지 알 수가 없다. 다만 메모리가 해제될 경우 자동으로 레퍼런스가 nil로 초기화를 해 준다. 그렇기 때문에 Weak 속성을 사용하는 객체는 항상 옵셔널타입이여야 한다.
weak은 객체를 소유하지 않고 주소값만을 가지고 있는 포인터 개념이다. 자신이 참조는 하지만 weak 메모리를 해제시킬 수 있는 권한은 다른 클래스에 있다. 값 지정시 리테인이 발생하지 않는다. 따라서 릴리즈도 발생하지 않는다. 그래서 언제 어떻게 메모리가 해제될 지 알 수가 없다. 다만 메모리가 해제될 경우 자동으로 레퍼런스가 nil로 초기화를 해 준다. 그렇기 때문에 Weak 속성을 사용하는 객체는 항상 옵셔널타입이여야 한다. Unowned(미소유 참조) – weak와 매우 비슷한 역할을 한다. 차이점으로는 Unowned로 선언된 변수는 nil이 될수가 없습니다. 그러므로 Unowned 변수는 옵셔널로 선언되어서는 안된다. 해제된 메모리 영역을 접근하지 않는다는 확실한 경우에만 사용해야한다.
어느 상황에 사용하는가
strong – 레퍼런스 객체가 할당되는 순간 해당 객체의 레퍼런스 카운트를 증가 시킨다. 레퍼런스 카운트를 증가시켜 ARC로 인한 메모리 해제를 피하고 객체를 안전하게 사용하고자 할 때 쓰인다.
레퍼런스 객체가 할당되는 순간 해당 객체의 레퍼런스 카운트를 증가 시킨다. 레퍼런스 카운트를 증가시켜 ARC로 인한 메모리 해제를 피하고 객체를 안전하게 사용하고자 할 때 쓰인다. weak – 객체가 할당될 때 레퍼런스 카운트를 증가시키지 않는다. 이 키워드는 Optional 타입에만 적용이 된다. 객체가 ARC에 의해 해제가 되면 nil 값이 할당된다. 대표적으로 retain cycle에 의해 메모리가 누수되는 문제를 막기 위해 사용되며, iOS 프레임워크에서 대표적인 예로는 Delegate패턴이 있다 .
객체가 할당될 때 레퍼런스 카운트를 증가시키지 않는다. 이 키워드는 Optional 타입에만 적용이 된다. 객체가 ARC에 의해 해제가 되면 nil 값이 할당된다. 대표적으로 retain cycle에 의해 메모리가 누수되는 문제를 막기 위해 사용되며, iOS 프레임워크에서 대표적인 예로는 Delegate패턴이 있다 unowned – 객체가 할당될 때 레퍼런스 카운트를 증가시키지 않는다. 그러나 Non-Optional 타입으로 선언되어야 하며, 객체가 ARC에 의해 메모리해제가 되더라도, 해당 객체 값을 존재하는 것으로 인지하며, 해당 객체에 액세스 할 경우 런타임 오류를 발생시킨다. 객체의 라이플사이클이 명확하고 개발자에 의해 제어 가능이 명확한 경우 , weak Optional 타입 대신 사용하여 좀더 간결한 코딩이 가능하다.
클로저 블럭내에서 [weak self] in 코드를 넣는 방법으로 순환 참조를 해결하는데 이때 [weak self] in 코드가 하는 역할과 그 이유는?
[weak self]의 역할로는 ARC가 프로퍼티의 갯수를 카운팅 하지 않도록 만들며 카운팅이 되지 않기에 순환참조가 일어나지 않도록 만드는 역할을 합니다. 그 이유로는 weak 참조는 ARC에 의해 참조되는 인스턴스가 메모리에서 해제 될 때 프로퍼티의 값을 nil로 만들기 때문에 순환 참조가 발생하지 않습니다.Escaping Closure의 개념이 무엇인가요?
메서드 파라미터로 전달받은 closure 를 메서드의 라이프사이클 내에서 실행하여 끝내지 않고, 메서드 scope 의 외부에 전달하려 할 때는 해당 closure 를 escaping 해야한다.
해당 메서드의 호출이 끝난 이후에도 closure 는 메모리 어딘가에 저장되어야 하며, 이는 closure 안에서 사용된 outer object (self 와 같은) 에 weak 와 같은 레퍼런스타입을 사용해야할 수 있음을 주의하도록 한다.
escaping 이 명시되어있지 않으면 기본적으로 non-escaping 이며, 이는 메서드의 실행이 끝나기 전에 closure 의 사용이 모두 완료됨을 보장하며,
따라서 closure 내에서 weak 을 굳이 사용하지 않아도 안전할 수 있음을 의미하기도 한다.
타입 캐스팅을 할 때 사용하는 키워드인 as, as?, as! 이 셋의 차이는 무엇인가요?
as 컴파일러가 타입 변환의 성공을 보장. 컴파일타임에 가능/불가능 여부를 알 수 있음
as? 타입변환에 실패하는 경우 nil 을 리턴. 컴파일타임에 가능/불가능 여부를 알 수 없음
as! 타입변환에 실패하는 경우 실행시간(Runtime) 오류를 발생시킴. 컴파일타임에 가능/불가능 여부를 알 수 없음
Swift에서 Class와 Struct의 차이는 무엇인가요?
Class – Reference type
객체화 시 힙 메모리영역에 저장되며 ARC 로 객체의 메모리해제가 관리된다.
대입 연산 시 레퍼런스가 복사되어 할당됨. (공유 가능)
멀티스레딩 시 적절한 Lock 활용이 필요.
상속 가능.
Struct – Value type
대입 연산 시 값 자체가 복제되어 할당됨(공유가 불가능).
불변성(Immutable) 구현에 유리.
멀티스레딩에 안전함.
상속이 불가능. (protocol 은 사용 가능)
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 이 달라지는게 아님!)
UIStackView의 장점은 무엇이라고 생각하시나요?
여러 뷰를 가로방향 또는 세로방향으로 배치할 때, 복잡한 컨스트레인트 설정 없이, 또는 컨스트레인트 만으로 설정하기 어려운 뷰의 배치등을 구현할 때 쓰일 수 있는 뷰.
aggangedSubview 로 하위뷰들이 관리되며, 이 하위뷰들에 Axis(가로 세로 방향), Alignment(세로방향 정렬), Distribution(가로방향 정렬), Spacing(하위뷰들간의 간격) 의 규칙을 적용할 수 있다.
Autolayout Constraint의 Priority의 개념이 무엇이고, 어떤상황에 사용하나요?
말그대로 제약들간의 우선순위를 말한다.
다수의 뷰들에 여러제약이 걸려있을 때, 보통은 제약간의 충돌이 일어나지 않게끔 제약들을 설계하는게 일반적이지만,
상황에 따라서는 뷰들의 크기가 유동적으로 변하는 경우가 있는데, 이럴때 어떤 제약들이 서로간에 충돌이 일어나는 경우가 있을 수 있다.
이럴때에는 어떤 제약의 우선순위를 더 우위에 둘것이냐를 결정함으로써 이러한 충돌을 해결할 수 있다.
UICollectionViewLayout클래스에 prepare 메소드는 어떤 역할을 하나요?
레이아웃관련 연산이 일어날 때마다 가장 먼저 호출된다. 이 메소드에서 셀의 위치/크기 등을 계산하기 위한 사전처리를 할 수 있다.
UICollectionViewLayout 를 상속받아 Custom 한 CollectionView Layout 을 구성하고자 할때, 데이터소스를 참조하여 셀의 위치 및 크기를 미리 계산하여 캐싱해두고, CollectionView 로부터 셀의 위치 및 크기 요청이 들어올때, 미리 계산하여 캐싱해둔 데이터를 전달해주는 방식으로 커스텀 레이아웃을 구성하는 방식이 있겠다.
UITableView를 구성할때 셀의 컨텐츠에 따라 높이를 설정하고싶다면 어떻게 해야하나요?
델리게이트 메서드 rowHeight 에서는 UITableView.automaticDimension 값을 리턴하고 ,estimatedRowHeight 에서는 셀의 예측 높이값을 리턴한다. 이렇게 하면 오토레이아웃 테이블뷰 셀 구현이 가능하다.
마찬가지로 테이블뷰 셀은, 고정 높이가 아닌, 셀 안의 서브뷰들의 제약 구성으로 셀의 크기가 결정될 수 있도록 해야한다.
ViewController의 생명 주기
loadView – 컨트롤러가 관리하는 뷰를 만든다. 뷰컨트롤러가 생성되고 순차적으로 완성되었을때만 호출된다.
컨트롤러가 관리하는 뷰를 만든다. 뷰컨트롤러가 생성되고 순차적으로 완성되었을때만 호출된다. viewDidLoad – 컨트롤러의 뷰가 메모리에 올라간 뒤에 호출된다. 뷰가 생성될때만 호출된다.
컨트롤러의 뷰가 메모리에 올라간 뒤에 호출된다. 뷰가 생성될때만 호출된다. viewWillAppear – 화면에 뷰가 표시될때마다 호출된다. 이 단계는 뷰는 정의된 바운드를 가지고 있지만 화면회전은 적용되지않는다.
화면에 뷰가 표시될때마다 호출된다. 이 단계는 뷰는 정의된 바운드를 가지고 있지만 화면회전은 적용되지않는다. viewWillLayoutSubviews – 뷰컨트롤러에게 그 자식뷰의 레이아웃을 조정하는 것에 대한 것을 알려주기위해 호출된다. 이 메소드는 frame이 바뀔때마다 호출된다.
뷰컨트롤러에게 그 자식뷰의 레이아웃을 조정하는 것에 대한 것을 알려주기위해 호출된다. 이 메소드는 frame이 바뀔때마다 호출된다. viewDidLayoutSubviews – 뷰가 그 자식 뷰의 레이아웃에 영향을 준 것을 뷰컨트롤러에게 알려주기 위해 호출된다. 뷰가 그 자식 View의 레이아웃을 바꾸고난 뒤에 추가적인 변경을 하고 싶을때 사용하는 이벤트 함수
뷰가 그 자식 뷰의 레이아웃에 영향을 준 것을 뷰컨트롤러에게 알려주기 위해 호출된다. 뷰가 그 자식 View의 레이아웃을 바꾸고난 뒤에 추가적인 변경을 하고 싶을때 사용하는 이벤트 함수 viewDidAppear – 뷰가 나타났다는 것을 컨트롤러에게 알리는 역할을 한다. 호출되는 시점으로는 뷰가 화면에 나타난 직후에 실행된다.
뷰가 나타났다는 것을 컨트롤러에게 알리는 역할을 한다. 호출되는 시점으로는 뷰가 화면에 나타난 직후에 실행된다. viewWillDisAppear – 뷰가 사라지기 직전에 호출되는 함수이다. 뷰가 삭제 되려고하고있는 것을 ViewController에게 알린다.
뷰가 사라지기 직전에 호출되는 함수이다. 뷰가 삭제 되려고하고있는 것을 ViewController에게 알린다. viewDidDisappear – ViewController에게 View가 제거되었음을 알린다. 호출시점은 viewWillDisAppear 다음에 호출된다.
App의 생명주기 (AppDelegate)
Not Running: 앱이 실행되지 않은 상태
(Inactive와 Active 상태를 합쳐서 Foreground 라고 함)
Inactive: 앱이 실행중인 상태 그러나 아무런 이벤트를 받지 않는 상태
Active: 앱이 실행중이며 이벤트가 발생한 상태
Background: 앱이 백그라운드에 있는 상태 그러나 실행되는 코드가 있는 상태
Suspened: 앱이 백그라운드에 있고 실행되는 코드가 없는 상태
application(_:didFinishLaunching:) – 앱이 처음 시작될 때 실행
applicationWillResignActive : – 앱이 active 에서 inactive로 이동될 때 실행
applicationDidEnterBackground : – 앱이 background 상태일 때 실행
applicationWillEnterForeground : – 앱이 background에서 foreground로 이동 될때 실행 (아직 foreground에서 실행중이진 않음)
applicationDidBecomeActive : – 앱이 active상태가 되어 실행 중일 때
applicationWillTerminate: – 앱이 종료될 때 실행
고차함수(Map, Reduce, Filter)에 대해 설명하세요
Swift에서 함수는 일급시민으로 취급되기 때문에 다른 함수의 전달인자로 사용될 수 있다. 고차함수란 매개변수로 함수를 받는 함수를 말한다.
Map – 데이터를 변형하고자 할 때 사용한다. 기존 컨테이너의 값들은 변경되지 않고 새로운 컨테이너를 생성하여 반환한다.
장점 – 코드 재사용 용이 / 컴파일러 최적화 측면에서 성능이 좋다 / 다중 스레드 환경에서, 하나의 컨테이너에 여러 스레드들이 동시에 변경을 하려고 할 때 예측하지 못한 결과 발생을 방지
let numbers = [0, 1, 2, 3, 4] var doubledNumbers = [Int]() var strings = [String]() // for-in for number in numbers { doubledNumbers.append(number * 2) strings.append(“\(number)”) } // map doubledNumbers = numbers.map{ $0 * 2 } strings = numbers.map{ “\($0)” }
Fileter – 컨테이너 내부의 값들을 걸러서 추출하고자 할 때 사용한다. filter의 매개변수로 전달되는 함수의 반환 타입은 Bool이다. true라면 값을 포함하고 false면 배제하여, map과 마찬가지로 새로운 컨테이너를 생성하여 반환한다.
let numbers = [0, 1, 2, 3, 4, 5] let evens = numbers.filter{ $0 % 2 == 0 } // [0, 2, 4] let odds = numbers.map{ $0 + 3 }.filter{ $0 % 2 != 0 } // [3, 5, 7]
Reduce – 컨테이너 내부를 하나로 합쳐주는 기능을 한다. 정수 배열이라면 전달받은 함수의 연산 결과로 합쳐주고, 문자열 배열이라면 문자열을 하나로 합쳐준다. 첫 번째 매개변수를 통해 초깃값을 지정할 수 있다. 이 초깃값이 최초의 $0 으로 사용된다.
let numbers = [1, 2, 3] var sum = numbers.reduce(10) { $0 + $1 } // 16
동기 비동기에 대해 설명하세요.
동기 (Synchronize) – 주어진 명령을 차례대로 처리하되 하나의 업무가 완료될 때 까지는 다른 업무로 넘어가지 않는 방식입니다.
특징 : 중간에 대기하는 시간때문에 효율은 떨어지지만 일관된 업무 보장과 동시다발적 업무가 발생하지 않으므로 대응이 불필요하여 업무구성이 단순화됨
비동기 (Asynchronize) – 주어진 명령을 차례대로 처리하되 시간이 걸리는 업무는 진행 해둔 채 기다리는 동안 다른 업무를 처리하는 방식입니다.
특징 : 일관적인 업무 흐름이 깨지고 응답에 대한 대응이 필요하다.
GCD에 대해 설명하세요.
GCD – Multicore Process를 위한 Thread programming의 방법이다. 스레드를 관리하면서 동시적으로 작업을 실행시키는 저수준 API를 제공하는 라이브러리이다.
스레드에 대한 개념을 설명해주세요.
하나의 프로세스 내에서 실행되는 작업흐름의 단위로 프로세스가 시작하는 동시에 동작하는 스레드를 메인 스레드라하고 이외의 추가로 생성되는 스레드를 서브 스레드라 부릅니다.
그렇다면 멀티 스레드란 무엇인가요.
여러 개의 스레드가 동시에 진행되는 것을 의미합니다. 하나의 프로세스 내에서 여러 개의 스레드가 존재하고, 스레드들이 프로세스의 자원을 공유하되 실행은 독립적으로 이루어지는 구조입니다.
추가로 Concurrency한 작업을 하기 위해 iOS에서 지원해주는 API에 대해 설명해주세요.
1.GCD
Grand Central Dispatch(GCD)는 멀티코어와 멀티 프로세싱 환경에서 최적화된 프로그래밍을 할 수 있도록 애플이 지원하는 저수준 API입니다. 기본적으로 스레드 풀의 관리를 프로그래머가 아닌 운영체제에서 관리하기 때문에 프로그래머가 태스크(작업)을 비동기적으로 쉽게 사용할 수 있습니다. 프로그래머가 실행할 태스크(작업)을 생성하고 Dispatch Queue에 추가하면 GCD는 태스크(작업)에 맞는 스레드를 자동으로 생성해서 실행하고 작업이 종료되면 해당 스레드를 제거합니다.
디스패치 대기열(Dispatch Queue)
디스패치 대기열(Dispatch Queue)은 작업을 연속적 혹은 동시에 진행하기는 하지만, 언제나 먼저 들어오면 먼저 나가는 순서로 실행됩니다. Serial Dispatch Queue는 한 번에 하나의 작업만을 실행하며, 해당 작업이 대기열에서 제외되고 새로운 작업이 시작되기 전까지 기다립니다. 이와는 반대로 Concurrent Dispatch Queue는 이미 시작된 작업이 완료될 때까지 기다리지 않고 가능한 많은 작업을 진행합니다. 디스패치 대기열(Dispatch Queue)은 GCD 기술 일부입니다
2.NSOperation
NSOperation은 어떤 하나의 작업을 나타냅니다. NSOperation은 모델링 상태, 우선순위, 의존성 그리고 관리를 지원하는 유용하고 Thread safe한 추상 클래스입니다.
예를 들어 네트워크 요청, 이미지 리사이즈, 텍스트 처리, 또는 기타 다양한 반복처리등 오래 걸리는 작업을 처리해야하는 NSOperation이 있다고 할 때, 이 특정 작업이 담겨있는 객체는 감독 없이 많은 일을 할 수 없습니다. 이러한 작업을 진행하는 감독을 NSOperationQueue가 담당합니다.
동시성 프로그래밍 과 병렬성 프로그래밍에 대하여 설명해주세요.
동시성 프로그래밍
말 그대로 동시에 여러 프로그램을 돌리는 것이 아닌 그렇게 보이게끔 하는 기법으로 시간을 분할하여 스레드들에게 서로 번갈아가며 제공하여 실행되게끔 하는 방식입니다. 코어에 상관 없이 실행 가능한 기법으로 싱글 코어에서도 멀티스레딩을 가능케 합니다.
병렬성 프로그래밍
동시성 프로그래밍과 다르게 동시에 돌아가는 것처럼 보이는 것이 아닌 실제로 동시에 실행되는 것을 의미합니다! 멀티 코어에서 멀티 스레드를 동작시키는 방식으로 데이터 병렬성과 작업 병렬성으로 나뉘게 됩니다.
데이터 병렬성 – 처리해야 할 데이터를 나누어 나누어진 데이터들을 병렬 처리하여 작업을 빠르게 수행하는 기법
작업 병렬성 – 서로 다른 작업을 병렬 처리하는 기법
동시성과 병렬성 차이
동시성 프로그래밍과 병렬성 프로그래밍 모두 비동기적으로 구현할 수 있습니다. 하지만 둘은 다음과 같은 차이가 존재합니다.
동시성병렬성
개념 논리적 물리적 동작 가능 환경 싱글코어, 멀티 코어 멀티 코어
iOS 면접 질문 리스트
1. ARC(Automatic Reference Counting)
: 자동 레퍼런스 카운팅으로서 자동으로 메모리를 관리해주는 방식을 말한다. 참조 카운팅이 0이 될때만 메모리에서 해제한다는 뜻이다.
– 동작원리
: 클래스의 새로운 인스턴스를 만들때 ARC는 인스턴스의 정보를 저장하기 위해 메모리를 할당합니다.
또한 ARC는 인스턴스가 더 이상 사용되지(참조 카운팅 0) 않는다고 판단하면 메모리를 해제합니다.
레퍼런스 프로퍼티에 인스턴스를 할당하면 ARC는 참조되는 프로퍼티의 갯수를 카운팅하여 참조하는 모든 변수가 인스턴스를
해제하기 전에 ARC는 인스턴스를 메모리에서 해제하지 않습니다.
– 동작시점
: 컴파일 시점에 동작
2. weak와 strong
– strong(강한참조) : 객체를 소유하여 레퍼런스 카운트가 증가하는 프로퍼티이다.
값 지정 시점에 retain이 되고 참조가 종료되는 시점에 release가 된다.
– weak(약한참조) : 객체를 소유하지 않고 주소값만을 가지고 있는 포인터 개념이다.
자신이 참조는 하지만 weak 메모리를 해제시킬 수 있는 권한은 다른 클래스에 있다. 값 지정시 retain이 발생하지
않는다. 메모리가 해제될 경우 자동으로 레퍼런스가 nil로 초기화를 해준다. 그렇기 때문에 weak 속성을 사용하는
객체는 항상 옵셔널 타입이어야 한다.
retain cycle에 의해 메모리가 누수되는 문제를 막기 위해 사용되며, 대표적으로 delegate 패턴이 있다.
– unowned(미소유참조) : 자신이 참조하는 인스턴스의 retain count를 증가시키지 않는다. nil이 될 수 없다.
optional로 선언 되어서는 안된다. unowned는 객체가 사라지게 되면 댕글링 포인터가 남는다.
이 댕글링 포인터를 참조하게 되면 crash가 나는데, 이 때문에 unowned는 사라지지 않을거라고
보장되는 객체에만 설정하여야 한다.
어느 상황에 쓰는가
– strong : 레퍼런스 카운트를 증가시켜 ARC로 인한 메모리 해제를 피하고, 객체를 안전하게 사용하고자 할 때 쓰인다.
– weak : 대표적으로 retain cycle에 의해 메모리가 누수되는 문제를 막기 위해 사용되며, delegate 패턴이 있다.
– unowned : 객체의 라이프사이클이 명확하고 개발자에 의해 제어 가능이 명확한 경우, weak Optional 타입 대신 사용하여
좀 더 간결한 코딩이 가능하다.
약한 참조가 필요한 경우 weak 키워드만을 사용하고, guard let(또는 if let) 구문을 통해 안전하게 옵셔널을 추출하는 것을 권장한다.
3. Retain Cycle(순환참조)
– 서로가 서로를 소유하고 있어 절대 메모리 해제가 되지 않는다는 것을 말한다.
– delegate
: 부모 뷰 컨트롤러는 특정 상황에서의 정보를 얻기 위해 본인을 자식 뷰 컨트롤러의 대리자로 설정한다.
이 때 부모 뷰 컨트롤러가 pop 된(빠진) 이후에 Retain cycle이 발생하여 메모리 누수가 일어난다.
이를 막기 위해 weak var delegate: ChildViewControllerProtocol?으로 선언해 주어야 한다.
4. Escaping Closure
: 클로저가 함수의 인자로 전달되지만 함수 밖에서 실행되는 것(함수가 반환된 후 실행되는 것) 을 Escape 한다고 하며,
이러한 경우 매개변수 타입 앞에 @escaping이라는 키워드를 명시해야 한다.
> 자주 사용되는 경우
– 비동기 로 실행되는 경우
– completionHandler(완료에 따른 처리) 로 사용되는 클로저의 경우
* Closure : 일정기능을 하는 코드를 하나의 블록으로 모아놓은 것. 참조 타입.
5. Swift에서 Class와 Struct의 차이는 무엇인가?
Class
– Reference Type (참조 타입)
– 대입 연산 시 레퍼런스가 복사되어 할당됨 (공유 가능)
– 상속 가능
– Class는 Heap 영역에, 그 인스턴스의 주소값은 Stack영역에 쌓임.
– 사용?
1. 두 Object의 인스턴스 자체가 같음을 확인 해야 할때
2. 하나의 객체가 필요하고, 여러 대상에 의해 접근되고 변경이 필요한 경우
Struct
– Value Type (값 타입)
– 대입 연산 시 값 자체가 복제되어 할당됨 (공유 불가능)
– 상속 불가능
– Stack에 쌓임.
– 사용?
1. 두 Object를 “같다, 다르다”로 비교해야 하는 경우 (데이터 자체)
2. Copy된 각 객체들이 독립적인 상태를 가져야 하는 경우
3. 코드에서 Object의 데이터를 여러 스레드에 걸쳐 사용할 경우
6. let, var?
– let : 상수, 한번 값을 설정하면 다음에 변경할 수 없음.
– var : 변수, 생성 후 데이터 값을 변경할 수 있음.
7. Optional
: 변수의 값이 nil일 수 있다는 것 을 표현함. ? 키워드 사용함.
– Optional Unwrapping (옵셔널 해제) : Optional 변수에서 Optional 껍데기를 벗겨내는 작업(값 강제추출). ! 키워드 사용함.
var number1:Int? = 20 var number2:Int = 100 if number1 { let sum = number1! + number1! }
– Optional Chaning(옵셔널 체이닝)
: 옵셔널이 속해있는 nil일지도 모르는 프로퍼티, 메서드, 서브스크립션 등을 가져오거나 호출할 때, 사용할 수 있는 일련의 과정
– 중간에 nil이 나오면 nil을 반환하고, nil이 아니면 체이닝된 작업을 계속 이어감.
class A { var b:B? } class B { var c:String? } var a:A = A() if a.b?.c { }
– Optional Binding (옵셔널 바인딩) : nil인지, 값이 있는지 먼저 체크해줌. (if let ~)
var number1:Int? = 20 var number2:Int = 100 if let nonOptionalNumber1 = number1 { let sum = nonOptionalNumber1 + number2 }
9. GCD
: MultiCore Process를 위한 Thread Programming의 방법이다. 스레드를 관리하면서 동시적으로 작업을 실행시키는 저수준 API를
제공하는 라이브러리이다.
* Thread? 하나의 프로세스 내에 실행되는 작업흐름의 단위 로 프로세스가 시작하는 동시에 동작하는 스레드를 메인 스레드라고 하고
이외의 추가로 생성되는 스레드를 서브 스레드라고 부른다.
* MultiThread? 여러 개의 스레드가 동시에 진행되는 것을 말한다. 하나의 프로세스 내에서 여러 개의 스레드가 존재하고, 스레드들이
프로세스의 자원을 공유하되 실행은 독립적으로 이루어지는 구조이다.
– Dispatch Queue : 작업항목의 실행을 관리하는 클래스. 대기열에 추가된 작업항목은 시스템이 관리하는 스레드풀에서 처리하고
작업을 완료하면 스레드를 알아서 해제한다.
– Serial : 대기열에 등록한 순서대로 작업을 실행함. 하나의 작업을 실행하고, 실행이 끝날 때까지 대기열에 있는
작업을 미루고 있다가 이전 작업이 끝나면 실행함. (기본)
– Concurrent : 실행중인 작업이 끝나기를 기다리지 않고 대기열에 있는 작업을 동시에 별도의 스레드를 사용하여
실행합니다. (병렬처리 방식)
10. protocol
: 프로토콜은 메소드, 프로퍼티등을 “정의”만 하고, 이 프로토콜을 채택한 곳에서 “구현”을 한다는 것.
11. extension
구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있는 기능이다.
– 타입에 새로운 기능을 추가할 수 있음. 재정의 불가. 수평 확장.
12. 고차 함수
: 매개변수로 함수를 받는 함수를 말한다.
– Map : 데이터를 변형 하고자 할 때 사용. 기존 컨테이너의 값들은 변경되지 않고, 새로운 컨테이너를 생성하여 반환함.
doubledNumbers = numbers.map{ $0 * 2 }
– Filter : 컨테이너 내부의 값을 추출 하고자 할때 사용. 매개변수로 전달되는 함수의 반환 타입은 Bool이다. true라면 값을 포함하고,
false면 배제하여 새로운 컨테이너를 생성하여 반환함.
let numbers = [0, 1, 2, 3, 4, 5] let evens = numbers.filter{ $0 % 2 == 0 } // [0, 2, 4] let odds = numbers.map{ $0 + 3 }.filter{ $0 % 2 != 0 } // [3, 5, 7]
– Reduce : 컨테이너 내부의 콘텐츠를 하나도 합쳐주는 기능을 함. 결합 . 첫번째 매개변수를 통해 초깃값을 지정할 수 있음.
let numbers = [1, 2, 3] var sum = numbers.reduce(10) { $0 + $1 } // 16
13. Type Casting (타입 캐스팅)
: 인스턴스의 타입을 확인하거나 클래스 계층의 다른 부모 클래스/자식 클래스로 취급하는 방법이다.
– is 나 as 연산자로 구현한다.
1) 타입 확인 (is) : 해당 타입이면 true, 아니면 false를 반환한다.
2) 다운 캐스팅 : 부모클래스 -> 자식클래스로 형변환 / 자식클래스의 프로퍼티와 메소드를 쓰기 위함.
– as? (옵셔널 캐스팅) : 변환이 성공하면 Optional값을 가지며, 실패시에는 nil 반환.
– as! (강제 캐스팅) : 변환이 성공하면 unwraping된 값을 가지며, 실패시 런타임 에러 발생.
3) 업 캐스팅 : 자식클래스 -> 부모클래스로 형변환 / 부모클래스의 프로퍼티와 메소드를 사용하기 위함.
– as : 타입 변환이 확실하게 가능한 경우(업캐스팅, 자기 자신 등)에만 사용가능함. 그 외에는 컴파일 에러.
4) Any, Any Object : 비지정 타입
– Any : 함수타입을 포함하여 모든 타입의 인스턴스를 대표한다.
– AnyObject : 모든 클래스 타입을 대표한다.
출처
https://ugly-developer.tistory.com/5
http://monibu1548.github.io/2018/05/12/swift-optional/
Swift] 신입 면접 질문 정리 (22.05.04 업데이트)
자동 레퍼런스 카운팅! 자동으로 메모리를 관리해주는 방식
ARC는 메모리영역중 힙 영역을 관리함.
런타임에 주기적으로 참조를 추적하여 사용하지 않는 인스턴스를 해제하는 GC(garbage collector)와 다르게 컴파일 타임 시점에 언제 참조/해제되는지 결정되어 런타임때 그대로 실행됨.
근데… 순환참조시 메모리가 영구적으로 해제되지 않을 수 있음
모든 인스턴스는 자신의 RC값을 가지고있음
(몇번이나 참조되고있는지!! 참조 횟수!! 인스턴스 생성될때 힙에 같이 저장됨)
이 RC값은 어떻게 세냐??
참조 횟수가 +1이 되는 순간은 인스턴스의 주소값을 변수에 할당할때!
1) 인스턴스 새로 생성
2) 기존 인스턴스 다른 변수에 대입할때
참조 횟수가 -1이 되는 순간은
1) 인스턴스 가리키던 변수가 메모리에서 해제되었을때!!
2) nil이 지정되었을때?(해제나 마찬가지인가..)
3) 다른거 지정되었을때(당연..)
Swift 인터뷰 상위 50 개 질문 (Swift iOS 인터뷰)
top 50 swift interview questions
예를 들어 최고의 Swift (iOS) 인터뷰 질문 및 답변 :
Swift는 iOS, macOS, tvOS 및 watchOS와 Apple Inc.에서 Linux 개발을 위해 만든 강력한 대화 형 프로그래밍 언어입니다.
Swift는 소프트웨어를 개발하는 환상적인 방법이며, 빠르고 안전하며 새로운 프로그램에 친숙한 대화 형 프로그래밍 언어입니다. Swift는 Apple 기기 용 앱을 개발하는 데 가장 많이 사용되는 언어이며 Objective-C 언어에 대한 몇 가지 추가 된 객체 지향 기능이있는 대안입니다.
Swift는 아래와 같이 최근 프로그래밍 패턴을 채택하여 일반적인 프로그래밍 오류의 주요 클래스를 정의합니다.
오픈 소스.
Swift는 배우기 쉽습니다.
접근하기 쉽습니다.
기본 제공 오류 처리.
메모리는 자동으로 관리됩니다.
변수는 항상 사용하기 전에 초기화됩니다.
정수에 오버플로가 있는지 확인합니다.
최신 프로그래밍 기능을 제공합니다.
‘if’문 대신 스위치 기능을 사용할 수 있습니다.
빠르고 안전한 성능, 코드 복잡성.
동적 라이브러리 지원.
가장 인기있는 Swift (iOS) 인터뷰 질문
다음은 답변과 함께 iOS Swift 인터뷰 팁 및 질문 목록입니다.
탐험하자 !!
Q # 1) iOS Swift 란 무엇입니까?
대답: Swift는 모바일 및 데스크톱 용 앱을 개발하기 위해 2014 년 6 월 Apple Inc에서 개발 한 컴파일 된 새로운 프로그래밍 언어입니다. 이 언어는 watchOS, macOS, iOS 및 tvOS에서 작동합니다.
Apple은 Cocoa Touch와 Cocoa 모두에서 작동하는 Swift 언어를 만들었습니다. Swift는 Free BSD, Linux, Darwin 등과 같은 여러 운영 체제를 지원합니다.이 언어는 Apple 제품에서 Objective-C 라이브러리 및 Cocoa 프레임 워크와 함께 작동하도록 설계되었습니다.
Q # 2) Swift를 사용하면 어떤 이점이 있습니까?
대답: Swift 프로그래밍 언어는 회고록에서 빠르게 성장하는 언어 중 하나가되었습니다. Swift는 매우 빠르고 강력하며 안전한 소프트웨어를 개발하게합니다.
이 언어는 macOS 및 iOS (iPad 및 iPhone) 용 응용 프로그램을 개발하는 데 사용되는 가장 유용한 프로그래밍 언어입니다.
swift를 사용하여 macOS 및 iOS 용 앱을 개발하면 몇 가지 중요한 이점이 있습니다.
오픈 소스 언어 : Swift 프로그래밍 언어는 오픈 소스로 만들어졌으며 모든 사람에게 공개되어 프로그램이 모든 소스 코드, 이메일 목록 및 버그 추적기를 정기적으로 업그레이드하는 것이 간단합니다.
Swift 프로그래밍 언어는 오픈 소스로 만들어졌으며 모든 사람에게 공개되어 프로그램이 모든 소스 코드, 이메일 목록 및 버그 추적기를 정기적으로 업그레이드하는 것이 간단합니다. 배우고 유지하기 쉬움 : Swift 프로그래밍 언어는 C / C ++에 비해 더 간단하고 정확합니다. Apple은 프로그래밍 언어를 사용하기 쉽게 발전 시켰으며 구문은 C #과 같은 프로그래밍 언어에서 가져 왔습니다. 파이썬 , 및 Ruby. 이 프로그래밍 언어의 이러한 간단한 구문은 더 의미가 있습니다. 신속하게 구현 (.m) 및 헤더 (.h) 파일의 모든 내용은 (.swift)라는 단일 파일로 결합됩니다.
Swift 프로그래밍 언어는 C / C ++에 비해 더 간단하고 정확합니다. Apple은 프로그래밍 언어를 사용하기 쉽게 발전 시켰으며 구문은 C #과 같은 프로그래밍 언어에서 가져 왔습니다. 파이썬 , 및 Ruby. 이 프로그래밍 언어의 이러한 간단한 구문은 더 의미가 있습니다. 신속하게 구현 (.m) 및 헤더 (.h) 파일의 모든 내용은 (.swift)라는 단일 파일로 결합됩니다. 여러 장치에서 지원 : Swift 프로그래밍 언어는 Apple 기기 지원에만 국한되지 않고 Linux 및 Windows 기기와 같은 기술 세계의 여러 기기도 지원합니다.
Swift 프로그래밍 언어는 Apple 기기 지원에만 국한되지 않고 Linux 및 Windows 기기와 같은 기술 세계의 여러 기기도 지원합니다. 동적 라이브러리 지원 : 동적 라이브러리는 앱에 연결할 수있는 코드의 실행 가능한 청크입니다. 이 기능은 최신의 신속한 프로그래밍 언어를 허용합니다. 신속하게 동적 라이브러리가 메모리에 직접 업로드되므로 앱의 초기 크기가 줄어들고 마지막으로 앱 성능이 향상됩니다.
동적 라이브러리는 앱에 연결할 수있는 코드의 실행 가능한 청크입니다. 이 기능은 최신의 신속한 프로그래밍 언어를 허용합니다. 신속하게 동적 라이브러리가 메모리에 직접 업로드되므로 앱의 초기 크기가 줄어들고 마지막으로 앱 성능이 향상됩니다. 옵션 유형 : swift의 선택 사항은 값으로 보유 할 수 있거나 보유하지 않을 수있는 유형입니다. 선택 사항을 선언하려면 질문을 사용할 수 있습니다. ‘?’ 표.
swift의 선택 사항은 값으로 보유 할 수 있거나 보유하지 않을 수있는 유형입니다. 선택 사항을 선언하려면 질문을 사용할 수 있습니다. 표. 폐쇄 : 클로저는 코드에서 전달되고 사용될 수있는 자체 포함 된 기능 블록입니다.
Q # 3) Swift와 Objective-C를 설명하세요.
답변 : 아래에 나열된 것은 Swift와 Objective-C의 다양한 차이점입니다.
Swift는 객체 지향 및 기능적 프로그래밍 언어 인 반면 Objective-C는 클래스 기반 객체 지향 프로그래밍 언어입니다. Swift는 동적 라이브러리를 지원하지만 Objective-C는 동적 라이브러리를 지원하지 않습니다. Swift는 튜플을 지원하지만 Objective-C는 튜플을 지원하지 않습니다. 세미콜론은 Swift에서 필요하지 않지만 세미콜론은 Objective-C에서 필요합니다. Swift는 오픈 소스 프로그래밍 언어 인 반면 Objective-C는 Apple로 제한되며 오픈 소스 언어가 아닙니다. 상수를 선언하려면 ‘let’키워드를 사용하고 변수를 선언하려면 ‘var’키워드를 사용해야합니다. 반면에 목표 C에서는 변수를 ‘NSString’으로, 상수를 ‘int’로 선언해야합니다. Swift를 사용하면 구조, 클래스 또는 열거에서 메서드를 정의 할 수 있지만 Objective C는이를 허용하지 않습니다. Swift에서는 단일 파일 (.swift)에 클래스를 정의 할 수있는 반면, Objective C에서는 클래스에 대한 별도의 인터페이스 (.h) 파일과 클래스에 대한 구현 (.m) 파일을 만듭니다.
Q # 4) iOS 기기가없는 경우 어디에서 Apple iPhone 앱을 테스트 할 수 있습니까?
대답: iOS 기기가없는 경우 Mac 시스템에서 Apple이 제공하는 시뮬레이터에서 애플리케이션을 테스트 할 수 있습니다.
Q # 5) iOS 애플리케이션 개발에 필요한 도구는 무엇입니까?
대답: 다음은 우리가 가져야 할 몇 가지 필수 도구입니다.
Mac / MacMini : Mac OS에서 실행되는 Intel 기반 프로세서가 장착 된 Mac을 구해야합니다. 걱정하지 마세요. PC가 있어도 Mac Mini를 통해 iOS 앱을 개발할 수 있습니다.
Mac OS에서 실행되는 Intel 기반 프로세서가 장착 된 Mac을 구해야합니다. 걱정하지 마세요. PC가 있어도 Mac Mini를 통해 iOS 앱을 개발할 수 있습니다. Xcode : Xcode는 iOS 앱과 MAC OS 모두에 사용되는 Apple IDE (통합 개발 환경)입니다. 비주얼 레이아웃 편집기와 논리, 사용자 인터페이스,이면의 응답을 처리 할 수있는 코드 편집기를 제공합니다.
Xcode는 iOS 앱과 MAC OS 모두에 사용되는 Apple IDE (통합 개발 환경)입니다. 비주얼 레이아웃 편집기와 논리, 사용자 인터페이스,이면의 응답을 처리 할 수있는 코드 편집기를 제공합니다. Swift 프로그래밍 언어 : 코드 편집기에서 논리는 Swift라고하는 Apple에서 개발 한 프로그래밍 언어로 작성됩니다.
코드 편집기에서 논리는 Swift라고하는 Apple에서 개발 한 프로그래밍 언어로 작성됩니다. Apple 개발자 프로그램 : 이 프로그램을 통해 개발자는 앱 스토어에 앱을 게시하여 전 세계의 고객과 다운로더가 앱을 다운로드하여 사용할 수 있습니다.
Q # 6) 스위프트의 가장 중요한 기능은 무엇인가요?
대답: swift의 몇 가지 중요한 기능은 다음과 같습니다.
더 인상적인 구조체와 열거 형
프로토콜 지향
옵션 유형
유형 안전성 및 유형 추론 언어
세미콜론을 사용할 필요가 없습니다.
강제 이니셜 라이저
기본적으로 안전함
적은 코드, 적은 파일
강제 풀기
튜플
폐쇄
다른 언어에 비해 훨씬 빠릅니다.
Q # 7) 신속한 iOS 앱 (iOS 애플리케이션 수명주기)의 일반적인 실행 상태를 설명하세요.
대답: 5 가지 일반적인 실행 상태는 다음과 같습니다.
실행되지 않음 : 이것은 앱이 실행되지 않거나 시스템에서 코드가 실행 및 종료되지 않고 애플리케이션이 완전히 꺼지는 간단한 상태입니다.
이것은 앱이 실행되지 않거나 시스템에서 코드가 실행 및 종료되지 않고 애플리케이션이 완전히 꺼지는 간단한 상태입니다. 비활성 : 이 상태는 단지 과도기 상태입니다. 비활성 상태는 애플리케이션이 백그라운드에서 실행 중이지만 이벤트를 수신 할 수 없음을 의미합니다.
이 상태는 단지 과도기 상태입니다. 비활성 상태는 애플리케이션이 백그라운드에서 실행 중이지만 이벤트를 수신 할 수 없음을 의미합니다. 유효한: 활성 상태는 앱이 백그라운드에서 실행되고 이벤트를 수신 할 수있는 기본 실행 상태입니다.
활성 상태는 앱이 백그라운드에서 실행되고 이벤트를 수신 할 수있는 기본 실행 상태입니다. 배경: 이것은 우리 앱이 백그라운드에서 실행되고 여전히 백그라운드에서 코드를 실행할 수있는 상태입니다.
이것은 우리 앱이 백그라운드에서 실행되고 여전히 백그라운드에서 코드를 실행할 수있는 상태입니다. 매달린: 이 상태는 실행중인 앱이 백그라운드 상태이고 시스템이이 앱을 일시 중지하고 애플리케이션이 코드를 실행할 수 없음을 의미합니다.
Q # 8) Swift는 객체 지향 프로그래밍 언어입니까?
대답: 예, swift는 객체 지향 프로그래밍 언어입니다.
Q # 9) swift의 기본 데이터 유형은 어떤 유형의 객체입니까?
대답: Swift는 부울 값, 숫자 및 문자열과 같은 다양한 목적으로 기본 데이터 유형의 표준 세트를 사용합니다.
정수 : int는 정수 값을 저장하는 데 사용됩니다.
int는 정수 값을 저장하는 데 사용됩니다. Double 및 Float : Double 및 Float in swift는 십진수로 작업 할 때 고려됩니다.
Double 및 Float in swift는 십진수로 작업 할 때 고려됩니다. 부울 : 부울 유형은 부울 값을 저장하는 데 사용됩니다. 신속하게 참 및 거짓 조건을 사용합니다.
부울 유형은 부울 값을 저장하는 데 사용됩니다. 신속하게 참 및 거짓 조건을 사용합니다. 끈: 문자열 리터럴에서 사용자는 Swift에서 큰 따옴표로 묶인 텍스트를 정의합니다.
문자열 리터럴에서 사용자는 Swift에서 큰 따옴표로 묶인 텍스트를 정의합니다. 어레이 : 배열은 목록 항목의 모음입니다.
배열은 목록 항목의 모음입니다. 사전 : 사전은 고유 키로 연결된 특정 유형의 항목의 순서가 지정되지 않은 컬렉션입니다.
Q # 10) Swift에서 init ()은 무엇입니까?
대답: 초기화는 사용할 열거 형, 구조 또는 클래스의 인스턴스를 준비하는 프로세스입니다.
이니셜 라이저는 특정 유형의 새 인스턴스를 만들기 위해 호출되기도합니다. 이니셜 라이저는 매개 변수가없는 인스턴스 메소드입니다. 이니셜 라이저를 사용하여 init 키워드를 작성할 수 있습니다.
init() { // perform some New Instance initialization here }
Q # 11) iOS swift에서 사용되는 제어 전송 문은 무엇입니까?
대답: iOS swift에서 사용되는 제어 전송 문은 다음과 같습니다.
반환 단절 계속하다 실패로 끝나다
Q # 12) swift에서 Let과 Var의 차이점은 무엇입니까?
대답: 신속한 언어에서는 Let 및 Var 키워드를 사용하여 상수와 변수를 선언 할 수 있습니다.
(i)하자 : Let 키워드는 불변이며 상수 변수를 선언하는 데 사용되며 상수 변수는 초기화 된 후에는 변경할 수 없습니다.
예를 들면 : myAge = 25로
age 값은 변경할 수 없으며 let 키워드를 사용하여 한 번만 상수 값을 선언 할 수 있습니다.
(ii) 다음이 있습니다. Var 키워드는 변경 가능하며 변형 변수를 선언하는 데 사용됩니다. 이러한 변형 변수는 런타임을 변경할 수 있습니다.
예를 들면 :
var myName = ‘Dell’
name =“Apple”의 값을 변경할 수 있습니다.
Q # 13) 배열에 요소를 추가하는 방법은 무엇입니까?
대답: 배열은 애플리케이션 (앱)에서 가장 많이 사용되는 데이터 유형 중 하나입니다. 애플리케이션 (앱) 데이터를 구성하기 위해 배열을 사용합니다.
Swift는 배열 리터럴을 사용하여 코드에서 배열을 쉽게 만들 수 있습니다. 배열 요소는 쉼표로 묶여 있고 값 목록은 대괄호로 구분됩니다.
예를 들어,
// Add ‘Int’ elements in an Array let natural number = [1, 2, 3, 4, 5, 6, 7] // Add ‘String’ elements in an array let countryName = [“India”, “Japan”, “Malaysia”, “Peru”, “Russia”]
Q # 14) iOS에서 지원하는 JSON 프레임 워크는 무엇입니까?
대답: SBJson 프레임 워크는 iOS에서 지원됩니다. SBJson 프레임 워크는 JSON 처리를 더 쉽게 만드는 추가 제어 및 유연한 API를 제공합니다. API의 유연한 기능을 지원하는 매우 유연한 프레임 워크입니다.
Q # 15) iOS에서 PLIST 란 무엇인가요?
대답: PLIST는 Property List를 나타냅니다. PLIST는 기본적으로 .plist 파일 확장자로 파일 시스템에 저장할 수있는 값과 키의 사전입니다. 속성 목록은 더 적은 양의 데이터를 저장하기위한 이식 가능하고 가벼운 수단으로 사용됩니다. 일반적으로 XML로 작성됩니다.
다양한 유형의 속성 목록이 아래에 나와 있습니다.
이진 속성 목록
XML 속성 목록
ASCII 레거시 속성 목록
Q # 16) 사전이 무엇인가요?
대답: 사전은 순서가 지정되지 않은 키-값 쌍 모음의 연결입니다. 각 값은 숫자 또는 문자열과 같은 해시 가능한 유형 인 고유 키와 연결됩니다. 키 값을 기반으로 값을 얻고 싶을 때마다 신속한 프로그래밍 언어로 사전 개념을 사용할 수 있습니다.
Swift 사전의 구문 :
다음은 Swift 프로그래밍 언어로 사전을 정의하는 구문입니다.
Dictionary ()
또는
[Key: Value] ()Swift에서 사전 만들기 :
다음은 선언에 키-값 쌍이있는 사전을 만드는 다양한 방법입니다.
// using Dictionary Var names = Dictonary () Names = [“Ajay”: 1, “Mohit”: 2] print(names) // it prints [Ajay: 1, Mohit: 2]
Q # 17) 신속한 프로토콜이란 무엇입니까?
대답: 프로토콜은 Swift 프로그래밍 언어의 매우 일반적인 기능이며 프로토콜은 Java의 인터페이스와 유사한 개념입니다. 프로토콜은 특정 작업에 적합한 속성, 메서드 및 기타 요구 사항의 청사진을 정의합니다.
가장 간단한 형식으로 프로토콜은 일부 메서드와 속성을 설명하는 인터페이스입니다. 프로토콜은 구현 대신 속성 또는 메서드 골격으로 설명됩니다. 열거 형, 함수 및 클래스를 정의하여 속성 및 메서드 구현을 수행 할 수 있습니다.
프로토콜은 구조, 열거 또는 클래스 유형 이름 뒤에 선언됩니다. 단일 및 다중 프로토콜 선언이 가능합니다. 여러 프로토콜은 쉼표로 구분됩니다.
구조, 열거 및 클래스와 매우 유사한 방식으로 프로토콜을 정의 할 수 있습니다.
Protocol Someprotocol { // protocol definition goes here }
쉼표로 구분 된 여러 프로토콜을 정의 할 수 있습니다.
Class SomeClass: SomeSuperclass, Firstprotocol, Secondprotocol { // Structure definition goes here }
Q # 18) 델리게이트 란 무엇인가요?
대답: Delegate는 구조 또는 클래스 간의 데이터 또는 통신을 전달하는 데 사용되는 디자인 패턴입니다. Delegate를 사용하면 특정 이벤트가 발생할 때 한 개체에서 다른 개체로 메시지를 보낼 수 있으며 테이블보기 및 컬렉션보기 이벤트를 처리하는 데 사용됩니다.
대리인은 일대일 관계와 일대일 의사 소통을합니다.
Q # 19) 이중 물음표“??”의 사용은 무엇입니까? 신속하게?
대답: 이중 물음표 ‘ ?? ”는 nil-coalescing 연산자이며 주로 nil을 테스트하는 데 사용했던 삼항 조건 연산자의 약어입니다. 이중 물음표는 변수에 대한 기본값을 제공하는데도 사용됩니다.
stringVar ?? ‘기본 문자열’
stringVar가 nil이 아니면 반환되고, 그렇지 않으면 ‘기본 문자열’이 반환됩니다.
Q # 20) GUARD 진술은 무엇입니까? 신속하게 GUARD 문을 사용하면 어떤 이점이 있습니까?
대답: GUARD 문은 하나 이상의 조건이 충족되지 않을 때 프로그램 제어를 범위 밖으로 전송하는 데 사용됩니다. 이 문장을 사용하면 운명의 피라미드를 피하는 데 도움이됩니다.
GUARD 문은 다음과 같은 형식입니다.
guard condition else { Statements }
Q # 21) swift에서 사용할 수있는 컬렉션 유형은 무엇입니까?
대답: 값 컬렉션을 저장하기 위해 swift에서 사용할 수있는 세 가지 기본 컬렉션 유형이 있습니다. 사전, 세트 및 배열입니다.
어레이 : 배열은 정렬 된 값 모음으로, 정렬 된 목록에서 동일한 유형의 값에 저장됩니다. 세트 : 집합은 정의 된 순서없이 컬렉션에서 동일한 유형의 고유 한 값에 저장되는 고유 값의 순서가 지정되지 않은 컬렉션입니다. 사전 : 사전은 순서가 지정되지 않은 방식으로 키 및 값 쌍 연결의 순서가 지정되지 않은 컬렉션입니다.
Q # 22)“지연”이란 무엇입니까?
대답: ‘defer’는 실행이 현재 범위를 벗어나는 동안 실행할 수있는 코드 블록을 제공하는 키워드입니다.
Q # 23) 튜플이란 무엇입니까? 신속하게 튜플을 만드는 방법은 무엇입니까?
대답: 튜플은 단일 복합 값에있는 서로 다른 값의 그룹입니다. 정렬 된 요소 목록입니다. 튜플의 객체 데이터에 액세스하는 방법에는 두 가지가 있습니다.
신속하게 튜플은 여러 다른 유형으로 구성 될 수 있습니다. 정수 유형과 문자열 유형의 두 가지 값을 지원할 수 있습니다. 법적 명령입니다.
예를 들면 : let ImplementationError = (501,“구현되지 않음”).
다음과 같이 기본 튜플을 만들 수 있습니다.
let person = (name: “Ajay” , age: 34)
Q # 24) Array와 NSArray의 차이점은 무엇입니까?
대답: Array와 NSArray의 차이점은 다음과 같습니다.
배열은 한 가지 유형의 데이터 만 보유 할 수있는 반면 NSArray는 다른 유형의 데이터를 보유 할 수 있습니다.
배열은 값 유형 인 반면 NSArray는 변경 불가능한 참조 유형입니다.
Q # 25) 클래스와 구조의 차이점은 무엇입니까?
대답: 클래스와 구조의 차이점은 다음과 같습니다.
클래스는 참조 유형 인 반면 구조체는 값 유형입니다. 클래스는 다른 클래스에 빌드 할 수 있지만 구조체는 다른 구조체에서 상속 할 수 없습니다. 클래스에는 상속이있는 반면 구조체에는 상속이있을 수 없습니다. 클래스에서 ‘let’키워드를 사용하여 인스턴스를 만들고 속성을 변경하려고 시도 할 수 있지만 Structs에는 Mutability가 없습니다. 클래스에는 유형 캐스팅이있는 반면 구조체에는 유형 캐스팅이 없습니다.
Q # 26) iOS에서 동시성을 달성하는 가장 좋은 방법은 무엇입니까?
대답: iOS에서 동시성을 달성하는 가장 좋은 세 가지 방법은 다음과 같습니다.
디스패치 대기열
스레드
작업 대기열
Q # 27) Swift 프로그래밍에서 상수를 생성하는 방법은 무엇입니까?
대답: Swift 프로그래밍에서 상수를 선언하려면 ‘let’키워드를 사용해야합니다.
Q # 28) 뷰 컨트롤러간에 데이터를 전달하는 방법은 무엇입니까?
대답: 아래와 같이 뷰 컨트롤러간에 데이터를 전달하는 방법에는 세 가지가 있습니다.
prepareForSegue 메서드 (Forward)에서 Segue 사용. 변수를 직접 설정 (Backword). 위임 (백 워드) 사용.
Q # 29) swift에서 기본 클래스를 어떻게 정의 할 수 있습니까?
대답: 신속한 프로그래밍 언어에서 클래스는 기본 클래스에서 상속되지 않습니다. 클래스는 개발자가 수퍼 클래스를 지정하지 않고 정의하며 자동으로 기본 클래스가됩니다.
Q # 30) 신속하게 속성을 선택적으로 만들 수있는 방법은 무엇입니까?
대답: 물음표 선언“ ? ”는 속성을 선택적으로 만들 수 있습니다. 이 물음표 ‘ ? ”는 속성에 값이 없을 때 런타임 오류를 방지하는 데 도움이됩니다.
Q # 31) 앱 출시주기 동안 누가 앱의 주요 기능을 호출하나요?
대답: 메인 스레드는 앱의 메인 기능을 호출합니다. 앱 시작주기 동안 시스템은 앱에 대한 기본 스레드를 만들고 해당 기본 스레드에서 앱 기본 함수를 호출합니다.
Q # 32) UI 요소는 무엇입니까?
대답: 이미지, 버튼, 레이블, 텍스트 필드 및 응용 프로그램 내에서 사용자에게 표시되는 기타 요소를 UI 요소라고합니다.
Q # 33) 모든 뷰 컨트롤러 객체의 수퍼 클래스는 무엇입니까?
대답: UIViewController 클래스는 모든 뷰 컨트롤러 객체의 수퍼 클래스입니다. 표시,보기로드, 회전 기능은 장치 회전에 대한 응답입니다. 모든 표준 시스템 동작은 UIViewController 클래스에서 제공합니다.
Q # 34) Swift 4.0의 새로운 기능은 무엇입니까?
대답: swift 4.0의 새로운 기능은 다음과 같습니다.
유니 코드 정확성을 유지하는 문자열을 더 빠르고 쉽게 사용할 수 있습니다.
튜플 및 여러 반환 값.
throw / try / catch를 사용한 네이티브 오류 처리.
구조체에 대한 직렬화를 지원하도록 확장합니다.
Q # 35) 신속하게 여러 줄 주석을 작성하는 방법은 무엇입니까?
대답: 여러 줄 주석이 ( / * ) 시작점 및 ( * / ) 끝점에서.
Q # 36) Xcode에서 사용하는 소스 항목은 무엇입니까?
대답: Xcode는 아래에 언급 된 네 가지 유형의 소스 항목을 사용합니다.
뼈대
소스 그룹
소스 파일
소스 폴더
Q # 37) 데이터를 신속하게 전달하는 다른 방법은 무엇입니까?
대답: KVO, Delegate, NSNotification & Callbacks, Target-Action 등과 같은 데이터를 신속하게 전달하는 방법에는 여러 가지가 있습니다.
Q # 38) 클래스의 사용법과 상속의 이점을 설명하십시오.
대답: 그들은:
재사용 구현
서브 클래스는 동적 디스패치를 제공합니다.
서브 클래스는 재사용 인터페이스를 제공합니다.
모듈성
재정의는 사용자 지정을위한 메커니즘을 제공합니다.
Q # 39) 프로토콜 및 수퍼 클래스의 몇 가지 공통 기능을 설명하십시오.
대답: 프로토콜 및 슈퍼 클래스의 몇 가지 일반적인 기능은 다음과 같습니다.
인터페이스 재사용.
구현 재사용.
모듈 식 설계 지원.
사용자 정의를위한 포인트를 제공합니다.
Q # 40) UserNotifications의 가장 큰 변화를 설명하세요.
대답: UserNotifications의 일부 더 큰 변경 사항은 다음과 같습니다.
이미지, 오디오 및 비디오를 추가 할 수 있습니다.
알림을위한 사용자 지정 인터페이스를 만들 수 있습니다.
알림 센터의 인터페이스로 알림을 관리 할 수 있습니다.
Q # 41) 선택적 체인이란 무엇입니까?
대답: 옵 셔널 체인은 옵 셔널과 결합하여 옵 셔널에 대한 메서드, 속성 및 첨자를 호출하는 데 사용할 수있는 유용한 프로세스이며 이러한 값은 nil 일 수도 있고 아닐 수도 있습니다. 이 과정에서 선택적 값의 체인에서 값을 검색 할 수 있습니다.
옵션에 값이 포함 된 경우 옵션의 아래 첨자, 메서드 또는 속성을 호출하면 값이 반환됩니다.
optional이 nil이면 아래 첨자, 메서드 및 속성을 호출하면 nil이 반환됩니다.
Q # 42) 선택적 바인딩이란 무엇입니까?
대답: Optional Binding 개념은 옵션에 값이 포함되어 있는지 확인하는 데 사용되며 해당 값을 변수 또는 임시 상수로 사용할 수 있습니다. 선택적 바인딩 개념을 사용하여 옵션에 값이 포함되어 있는지 확인합니다.
선택적 바인딩은 조건 (if 및 while) 문과 함께 사용하여 선택 사항 내부의 값을 확인할 수 있습니다.
Q # 43) swift의 Higher-Order 함수는 무엇인가요?
대답: 고차 함수는 다음과 같습니다.
지도: 배열 내용을 변환합니다.
배열 내용을 변환합니다. 줄이다: 컬렉션의 값을 단일 값으로 줄입니다.
컬렉션의 값을 단일 값으로 줄입니다. 종류: 배열 정렬.
배열 정렬. 필터: 배열 내용을 변환합니다.
Q # 44) 앱 개발시 일반적으로 사용하는 디자인 패턴을 설명해주세요.
대답: 앱 개발 중에 사용되는 디자인 패턴은 다음과 같습니다.
행동 : Memento 및 Observer.
Memento 및 Observer. 창조 : Builder, Factory 및 Singleton.
Builder, Factory 및 Singleton. 구조적 : 파사드, 어댑터 및 데코레이터.
Q # 45) swift에서 옵 셔널을 언 래핑하는 다양한 방법은 무엇인가요?
대답: 선택 사항을 신속하게 풀 수있는 7 가지 방법이 있습니다. 그들은:
가드 성명 : 안전한.
안전한. 강제 풀기 : ‘!’사용 운영자, 안전하지 않습니다.
‘!’사용 운영자, 안전하지 않습니다. 선택적 바인딩 : 안전한.
안전한. 선택적 패턴 : 안전한.
안전한. Nil 통합 연산자 : 안전한.
안전한. 암시 적으로 언 래핑 된 변수 선언 : 많은 경우에 안전하지 않습니다.
많은 경우에 안전하지 않습니다. 선택적 연결 : 안전한.
Q # 46) iOS는 멀티 스레딩을 지원하는 메커니즘은 무엇입니까?
답변 : 다음과 같습니다.
NSThread : ‘start’메서드를 사용하여 시작할 수있는 저수준 스레드를 만들 수 있습니다.
‘start’메서드를 사용하여 시작할 수있는 저수준 스레드를 만들 수 있습니다. NSOperationQueue : 스레드 풀을 만들 수 있으며 ‘NSOperations’를 병렬로 실행하는 데 사용됩니다.
Q # 47) Swift 모듈이란?
대답:
모듈은 코드 배포의 단일 단위입니다.
프레임 워크 또는 애플리케이션은 단일 단위로 빌드 및 제공되며 swift import 키워드를 사용하여 다른 모듈에서 가져올 수 있습니다.
Xcode 도구의 각 빌드 대상은 swift에서 별도의 모듈로 처리됩니다.
Q # 48) 핵심 데이터를 설명하세요.
대답: 핵심 데이터는 macOS 및 iOS 앱용으로 Apple에서 제공하는 가장 강력한 프레임 워크 중 하나입니다. 핵심 데이터는 애플리케이션에서 모델 계층 개체를 처리하는 데 사용됩니다. Core Data를 프레임 워크로 취급하여 iOS 앱 내에서 데이터를 필터링, 수정, 저장, 추적 할 수 있습니다. Core Data는 관계형 데이터베이스가 아닙니다.
핵심 데이터를 사용하면 SQL을 몰라도 앱의 개체를 데이터베이스의 테이블 레코드에 쉽게 매핑 할 수 있습니다. 핵심 데이터는 MVC 구조의 M입니다.
핵심 데이터의 일부 기능은 참조를 위해 아래에 제공됩니다.
iOS 및 macOS 도구 체인과의 효과적인 통합.
메모리 및 UI (사용자 인터페이스)에서 데이터를 구성, 필터링 및 그룹화합니다.
객체 저장을위한 자동 지원.
속성 값의 자동 유효성 검사.
개체 그래프를 관리하기위한 첫 번째 프레임 워크입니다.
개체 그래프에서 개체의 수명주기를 관리하기위한 핵심 데이터 프레임 워크입니다.
Q # 49) 그랜드 센트럴 디스패치 (GDC)에 대해 설명해주세요.
대답: GCD (Grand Central Dispatch)는 동시 작업을 관리하기위한 하위 수준 API입니다. 이 개념은 애플리케이션 성능을 향상시키는 데 사용됩니다. 이 프로세스는 여러 작업을 동시에 관리하는 데 사용됩니다. GCD (Grand Central Dispatch)는 iOS에서 Async 및 Sync 프로그래밍을 사용한 멀티 태스킹에 가장 유용한 API입니다.
디스패치 대기열 : Dispatch Queue는 FIFO (선입 선출) 순서로 작업을 관리합니다. 디스패치 큐는 여러 스레드에서 동시에 액세스 할 수 있으므로 스레드로부터 안전합니다.
Dispatch Queue는 FIFO (선입 선출) 순서로 작업을 관리합니다. 디스패치 큐는 여러 스레드에서 동시에 액세스 할 수 있으므로 스레드로부터 안전합니다. 병발 사정: 이 프로세스는 동시에 여러 작업을 시작했지만 동시에 종료되었는지 확실하지 않습니다. 어떤 순서로도 완료 할 수 있습니다. 동시에 하나 이상의 작업을 실행합니다. 작업은 대기열의 순서가 아닌 복잡성에 따라 완료됩니다.
이 프로세스는 동시에 여러 작업을 시작했지만 동시에 종료되었는지 확실하지 않습니다. 어떤 순서로도 완료 할 수 있습니다. 동시에 하나 이상의 작업을 실행합니다. 작업은 대기열의 순서가 아닌 복잡성에 따라 완료됩니다. 연속물: 한 번에 하나의 작업 만 실행됩니다. 특정 리소스에 대한 액세스를 동기화하는 데 사용할 수 있습니다.
한 번에 하나의 작업 만 실행됩니다. 특정 리소스에 대한 액세스를 동기화하는 데 사용할 수 있습니다. 동조: 동기 함수는 작업이 완료된 후 호출자에게 반환 제어를 갖습니다.
동기 함수는 작업이 완료된 후 호출자에게 반환 제어를 갖습니다. 비동기 : 비동기 함수는 작업 시작 순서를 지정하여 즉시 반환하지만 완료 될 때까지 기다리지 않습니다.
Q # 50) MVC 구조를 설명하십시오.
대답: MVC는 모델 뷰 컨트롤러를 나타냅니다. MVC는 개발 앱 사용을위한 강력한 소프트웨어 아키텍처 패턴입니다.
MVC는 객체 지향 프로그래밍 개념 위에 구축됩니다. 앱에서 데이터 흐름과 상호 작용을 구성합니다. Model-View-Controller는 iOS 개발에서 이해해야 할 중요한 기본 개념입니다. UIKit, Cocoa Touch와 같은 많은 iOS 프레임 워크는 메시징 및 구조화 된 데이터 흐름에 MVC 패턴을 사용합니다.
Model-View-Controller는 앱의 한 부분에서 다른 부분으로 데이터를 전달하는 데 사용됩니다.
세 가지 역할 중 하나에서 응용 프로그램의 개체를 할당하는 데 사용되는 디자인 패턴입니다.
모델: 모델은 데이터의 래퍼입니다. 모델은 앱 데이터의 표현이며 생년월일, 사용자 이름 등과 같은 특정 사용자에 대한 정보를 보유합니다. 모델은 애플리케이션 상태를 관리합니다. 여기에는 데이터 쓰기 및 읽기도 포함됩니다. 모델은 개별 데이터 집합을 캡슐화하고 일부 논리를 적용하여 해당 데이터를 조작합니다.
모델은 데이터의 래퍼입니다. 모델은 앱 데이터의 표현이며 생년월일, 사용자 이름 등과 같은 특정 사용자에 대한 정보를 보유합니다. 모델은 애플리케이션 상태를 관리합니다. 여기에는 데이터 쓰기 및 읽기도 포함됩니다. 모델은 개별 데이터 집합을 캡슐화하고 일부 논리를 적용하여 해당 데이터를 조작합니다. 전망: 보기는 UI (사용자 인터페이스)의 표현입니다. 보기는 사용자에게 표시되고 UI (사용자 인터페이스)와 상호 작용하는 개체입니다.
보기는 UI (사용자 인터페이스)의 표현입니다. 보기는 사용자에게 표시되고 UI (사용자 인터페이스)와 상호 작용하는 개체입니다. 제어 장치: 컨트롤러는 뷰와 모델 사이의 중개자입니다. 컨트롤러는 모델과 뷰 사이의 모든 로직을 제어합니다. 모델과보기간에 메시지를 상호 통신하며 그 반대의 경우도 마찬가지입니다.
결론
이 기사에서 가능한 모든 중요한 Swift 인터뷰 질문에 대한 답변 및 예제를 살펴 보았습니다.
여기에 제공된 답변이 iOS의 빠른 기본 사항과 고급 주제를 이해하는 데 실제로 도움이되기를 바랍니다. 이러한 Swift 및 iOS 개발자 인터뷰 질문에 대한 명확한 지식은 초보자 또는 숙련 된 전문가가 첫 번째 시도에서 성공적으로 인터뷰를 완료하는 데 도움이 될 것입니다.
인터뷰에 최선을 다하겠습니다 !!
추천 도서
Swift – iOS 면접 질문 리스트
해당 면접 질문 리스트에 대해 노션으로 작업 중에 있습니다.
많은분들의 블로그와 지식을 참고하여 한개한개씩 작성중에 있습니다.
매주매주 업데이트 중입니다!
https://moonggi-notepad.notion.site/iOS-07242d5af9ac4c279abf74e254020032
[면접질문] 스위프트(Swift) 75문 75답
글 작성자: 개발하는 훈이
스위프트 100문 100답을 목표로!
아래 저장소에 더 빨리 업데이트됩니다! 잘못된 답변이 있다면 알려주시고, 더 공부할거리가 있다면 100개의 질문을 채우기 위해 댓글이나 PR로 알려주세요!
1. 스위프트에서 Extension은 어떻게 사용되나요? (What are Extensions used for in Swift?)
💡 Extension은 클래스, 구조체, 열거형 타입에 새로운 메서드, 프로퍼티, 생성자 를 추가적으로 정의해 사용하기 위해 사용됩니다.
💡 이때 저장 프로퍼티는 extension에 정의할 수 없고, 연산 프로퍼티 만 정의할 수 있습니다.
💡 소멸자(deinitializer)는 추가할 수 없고 생성자는 convenience init 만 정의할 수 있습니다.
💡 구조체의 경우에는 기존 구조체에서는 생성자를 직접 구현하면 memberwise initializer (기본 생성자)가 사라지지만 구조체의 Extension에 생성자를 정의하면 memberwise initializer 가 사라지지 않습니다.
💡 where 을 사용하면 특정한 조건을 가진 타입에 대해서만 Extension을 적용할 수 있습니다.
// https://stackoverflow.com/questions/30746190/swift-where-array-extensions // Idable 프로토콜을 채택하는 타입의 배열만 이 Extension을 사용가능 extension Array where Element : Idable { func filterWithId(id : String) -> [Element] { return self.filter { (item) -> Bool in return item.id == id } } }
2. Swift의 upcasting과 downcasting의 차이에 대해서 설명해보세요. (What is the difference between Upcast and Downcast in Swift?)
💡 서로 상속 관계에 있는 클래스에서 자식 클래스를 부모 클래스로 타입캐스팅 하는 것을 업 캐스팅 이라고 하고 as 를 사용해서 업 캐스팅할 수 있습니다.
💡 컴파일 타임에 업캐스팅이 가능한지 여부가 판별되기 때문에 컴파일이 되면 항상 성공합니다.
class Student { let name: String init(name: String) { self.name = name } } class HighSchoolStudent: Student { let gpa: Double init(name: String, gpa: Double) { self.gpa = gpa super.init(name: name) } } let hun = HighSchoolStudent(name: “hun”, gpa: 4.5) let updacasted = hun as Student print(hun.name, hun.gpa) print(updacasted.name, updacasted.gpa) // compile error
💡 다운캐스팅도 as 를 사용하지만 다운 캐스팅은 실패할 수도 있기 때문에 as? 나 as! 를 사용합니다.
💡 as! 는 런타임에 타입 캐스팅을 하고 만약 타입 캐스팅에 실패하면 런타임 에러 를 발생시킵니다.
💡 as? 는 런타임에 타입 캐스팅을 하고 만약 타입 캐스팅에 실패하면 nil 을 반환합니다.
let donwcastedHun = hun as? HighSchoolStudent print(donwcastedHun) // nil let forcelyDowncCastedHun = hun as! HighSchoolStudent // runtime error print(forcelyDowncCastedHun)
3. == 연산자와 === 연산자는 어떻게 다른가요? (What’s the difference between == and ===?)
💡 == 연산자는 값을 비교하는데 사용되고, === 연산자는 참조 값을 비교하는데 사용됩니다.
4. Dispatch Queue의 Serial Queue에 대해서 설명해보세요. (What is a Serial Queue?)
💡 직렬 큐(serial queue)는 작업을 한 번에 하나씩 처리하는 작업 큐입니다. 직렬 큐는 스레드에 먼저 할당한 작업이 완전히 끝나야 큐에서 대기 중인 다음 작업을 스레드에 새로 할당합니다.
5. let과 var의 차이는 무엇인가요? (What is the difference between let and var in Swift?)
💡 let 은 한번 할당된 값을 변경할 수 없는 상수를 선언하기 위한 명령어이고, var 는 값을 변경할 수 있는 변수를 선언하기 위한 명령어입니다.
💡 사실 Obejctive-C 관점에서 let 은 주소에 대한 포인터를 바꿀 수 없다는 의미입니다. 이 때문에 클래스 인스턴스의 var로 선언된 변수의 값을 바꾸는 것은 가능합니다.
let hun = Student(name: “hun”) hun.name = “hunihun965” print(hun.name) // hunihun956
6. function과 method의 차이를 말해보세요. (What are the differences between functions and methods in Swift?)
💡 function은 재사용 가능한 코드 블록을 의미하고, method는 클래스, 구조체, 열거형에 포함되는 function을 의미합니다.
7. 커스텀 객체의 배열이 있을 때, 프로퍼티를 기준으로 배열을 어떻게 정렬할 수 있을까요? (How to sort array of custom objects by property value in Swift?)
💡 sorted 메서드에 직접 소팅 클로저를 지정해줄 수 있습니다.
struct Node { let id: Int } let array = [ Node(id: 5), Node(id: 4), Node(id: 3), Node(id: 2), Node(id: 1) ] let sorted = array.sorted(by: { $0.id < $1.id }) print(sorted) // [PS.Node(id: 1), PS.Node(id: 2), PS.Node(id: 3), PS.Node(id: 4), PS.Node(id: 5)] 8. mutaing 키워드의 의미를 설명해보세요. (What does the Swift mutating keyword mean?) 💡 스위프트에서 값 타입 프로퍼티들을 인스턴스 메서드에 의해 수정될 수 없습니다 . 💡 mutaing 키워드를 메서드 앞에 붙이면 구조체나 열거형 인스턴스에서 프로퍼티를 수정할 수 있게 됩니다. 💡 mutating 키워드가 붙은 메서드를 실행하면 스위프트는 새로운 구조체를 생성 해 변경된 프로퍼티의 값을 할당하고 반환해 현재 구조체를 대체합니다. 구조체의 불변성을 지키기 위해 이런 방법을 사용합니다. 9. 프로토콜과 클래스의 차이를 설명해보세요. (What’s the difference between a protocol and a class in Swift?) 💡 클래스는 인스턴스 메서드의 실제 구현체를 가지고 있지만 프로토콜은 메서드의 인터페이스 만 가지고 있습니다. 프로토콜이 구현체를 가지게 하려면 프로토콜의 Extension 을 만들어 구현체를 작성할 수 있습니다. 10. Enum에서 raw value와 associated value에 대해 설명해보세요. (In Swift enumerations, what’s the difference between raw values and associated values?) 💡 raw value 는 원시값으로 열거형의 모든 case들이 동일한 타입을 가지고 하나의 값만 가질 수 있습니다. 💡 반면에 associated value 는 튜플을 통해 각 case들이 다른 타입을 가지게 할 수도 있고, named tuple로 이름을 붙일 수도 있으며, 여러개의 값을 가지게 하는 것도 가능합니다. // associated values enum Fruits { case apple(origin: String, cost: Double) case grape(origin: String, cost: Double, size: Double) case orange(color: String) } let apple: Fruits = .apple(origin: "Korea", cost: 1000) let grape: Fruits = .grape(origin: "Korea", cost: 100, size: 10) let orange: Fruits = .orange(color: "Orange") // raw values enum Numbers: Int { case one = 1 case two, three, four } print(Numbers.one.rawValue) // 1 print(Numbers.two.rawValue) // 2 print(Numbers.three.rawValue) // 3 11. inout은 언제 사용하면 좋을까요? (What is a good use case for an inout parameter?) 💡 inout 파라미터를 사용하면 값 타입 변수가 저장된 주소의 값을 함수 안과 밖에서 동일하게 사용하게 됩니다. 따라서 함수가 입력과 동일한 출력을 제공하고, 함수 내에서 적용된 변경사항이 함수 외부에서도 동일하게 적용되어야할 때 사용할 수 있습니다. 💡 Swap을 직접 구현하고자 한다면 inout이 좋은 선택이 될 수 있습니다. // https://stackoverflow.com/questions/62266178/swift-function-that-swaps-two-values func swap
(a: inout T, b: inout T) { (a, b) = (b, a) } var a = 0, b = 1 swap(a: &a, b: &b) 12. 연산 프로퍼티와 클로저를 가지는 저장 프로퍼티의 차이를 설명해보세요. (What is the difference between a computed property and a property set to a closure?)
💡 클로저를 가지는 저장 프로퍼티는 프로퍼티의 생성시점에 클로저를 생성하고 사용합니다.
💡 또한 var 키워드로 생성되어 있다면 다른 클로저를 할당해주는 것도 가능합니다.
💡 연산 프로퍼티는 프로퍼티를 참조할 때마다 클로저를 생성하고 실행합니다.
13. as? 와 as! 차이를 설명해보세요. (What is difference between as?, as! and as in Swift?)
💡 as? 와 as! 모두 런타임에 다운 캐스팅 을 위해 사용되지만 as? 는 캐스팅에 실패했을 때 nil을 반환하고 as! 는 런타임 에러를 발생시킵니다.
14. 메서드 안에서 언제 self를 사용해야할까요? (When would you use self in a method?)
💡 파라미터의 이름이 인스턴스의 프로퍼티 이름과 겹칠 경우에 인스턴스의 프로퍼티임을 명시 하기 위해서 self를 사용할 수 있습니다.
15. Class와 Struct의 공통점과 차이점을 설명해보세요. (What Classes and Structs have in common in Swift and what are their differences?)
💡 Class 와 Struct 모두 프로퍼티를 정의해 데이터를 저장하고 인스턴스를 만들어 객체의 형태 로 사용할 수 있습니다.
💡 Class 와 Struct 모두 프로토콜을 채택 할 수 있습니다.
💡 Class 는 참조 타입 이지만 Struct는 값 타입 입니다.
💡 Class 는 참조 타입이기 때문에 최적화를 사용하지 않지만 구조체는 값 타입의 복사를 최적화하기 위해서 Copy-On-Write 를 사용합니다. 실제로 변경이 일어나기 전까지는 구조체를 다른 변수에 할당하더라도 같은 주소의 구조체를 공유하다가 변경이 발생하면 새로운 주소에 인스턴스를 생성해 할당하는 것을 의미합니다.
💡 Class 는 힙 영억 에 인스턴스를 저장하고 인스턴스의 주소값을 스택 영역에 저장합니다. 반면에 Struct는 스택 영역 에 인스턴스가 저장됩니다.
💡 Class 는 인스턴스끼리의 상속 이 가능하지만 Struct는 불가능합니다. 대신 프로토콜 을 통해 상속의 동작을 구현할 수는 있습니다.
16. 강한 참조는 무엇이고 왜 필요한가요? (What’s a strong reference, and why do we need it?)
💡 강한 참조는 참조 타입 인스턴스를 변수에 할당하는 것을 의미합니다. 스위프트의 ARC는 강한 참조에 참조 카운트를 증가 시키고, 강한 참조가 해제되면 참조 카운트를 감소시킵니다.
💡 참조 카운트가 0이 되면 메모리에서 인스턴스를 해제 합니다.
💡 따라서 강한 참조가 있어야만 스위프트에서 참조 타입의 인스턴스르 메모리에 유지할 수 있습니다.
17. strong, weak, unowned reference는 각각 언제 사용할까요? (When to use strong, weak and unowned references?)
💡 메모리에서 인스턴스가 해제되는 것을 막기 위해 강한 참조인 strong reference 를 사용할 수 있습니다. strong reference는 참조 카운트를 1 증가 시키기 때문입니다. 기본적으로 참조의 방향이 단방향으로 이루어지면 strong reference는 항상 안전합니다.
💡 weak reference 는 참조 카운트를 증가시키지 않습니다 . weak reference는 항상 var 로 선언되는 옵셔널 타입이 되어야합니다. weak으로 참조하고 있던 인스턴스가 해제될 수 있기 때문입니다. 순환 참조의 가능성이 있는 상황에서 weak을 통해 방지할 수 있습니다.
💡 unowned reference 는 weak 과 동일하게 참조 카운트를 증가시키지 않습니다. 그리고 동시에 unowned 로 선언된 변수는 nil을 가질 수 없다 는 특징이 있습니다. unowned 로 참조하고 있던 인스턴스가 해제되면 unowned 는 nil이 아니라 더 이상 참조할 수 없는 주소를 계속 참조하게 되고 unowned 변수를 참조하려고 하면 런타임 에러가 발생합니다. 따라서 unowned는 해당 변수가 참조하는 인스턴스보다 먼저 해제되는 것이 확실한 상황에서만 사용 해야 합니다. Optional이 아니기 때문에 캡쳐 리스트나 옵셔널 바인딩을 사용하지 않아도 된다는 장점이 있습니다.
18. Array, Set, Dictionary의 차이점이 뭘까요? (What’s the main difference between the Array, Set and Dictionary collection type?)
💡 Array는 리스트 컬렉션으로 Random Access 가 가능해 인덱스를 통해 요소에 접근할 수 있습니다.
💡 Set은 Hashable 프로토콜을 채택 하는 값을 저장해 중복되지 않은 데이터를 관리하는 콜렉션입니다. 순서가 보장되지 않으며, 교집합, 차집합 등 집합 연산을 메서드로 제공합니다.
💡 Dictionary 는 Key-Value 형태로 데이터를 관리하는 콜렉션입니다. 딕셔너리의 Key로 사용될 타입은 Hashable 프로토콜을 채택 하고 중복된 키를 허용하지 않으며 순서를 보장하지 않습니다.
19. required 키워드에 대해서 설명해보세요. (What does the required keyword in Swift mean?)
💡 required 키워드가 붙은 클래스의 생성자는 해당 클래스를 상속받는 자식 클래스가 해당 생성자를 반드시 구현하도록 강제합니다.
💡 required 에는 override 키워드의 기능이 포함되어 있기 때문에 override를 생략하고 구현할 수 있습니다.
20. Self와 self의 차이가 뭘까요? (What’s the difference between Self vs self?)
💡 self 는 현재 인스턴스를 가리킵니다.
💡 Self 는 프로토콜에서 사용되면 프로토콜을 채택하는 타입을 의미하고, 클래스, 구조체, 열거형에서 사용되면 실제 선언에 사용된 타입을 의미합니다.
class Superclass { func f() -> Self { return self } } let x = Superclass() print(type(of: x.f())) // Prints “Superclass” class Subclass: Superclass { } let y = Subclass() print(type(of: y.f())) // Prints “Subclass” let z: Superclass = Subclass() print(type(of: z.f())) // Prints “Subclass”
-> MetaType에 대한 공부가 필요할 것 같습니다ㅠ 헷갈리네요..
21. Array보다 Set을 사용하는게 더 좋을 때는 언제일까요? (When to use a set rather than an array in Swift?)
💡 순서가 중요하지 않고 데이터를 중복없이 고유하게 관리 할 때 Set을 사용하는 것이 더 좋습니다.
💡 특히, Set은 삭제, 삽입, 조회를 모두 O(1)에 할 수 있기 때문에 순서가 중요하지 않으면서 삭제와 삽입이 빈번할 때 도 Set이 더 좋을 수 있습니다.
22. Trailing Closure에 대해서 설명해보세요. (What is trailing closure syntax?)
💡 함수의 인자로 들어갈 클로저를 함수 호출 외부로 분리해서 코드를 작성하는 방법입니다.
💡 trailing closure의 파라미터 레이블을 생략할 수 있고, 만약 호출하는 함수의 파라미터가 클로저 뿐이라면 () 도 생략할 수 있습니다.
func someFunctionThatTakesAClosure(closure: () -> Void) { // function body goes here } // Here’s how you call this function without using a trailing closure: someFunctionThatTakesAClosure(closure: { // closure’s body goes here }) // Here’s how you call this function with a trailing closure instead: someFunctionThatTakesAClosure() { // trailing closure’s body goes here }
23. @objc는 언제 사용하나요? (When to use @objc attribute?)
💡 @objc 는 스위프트의 API를 Objective-C 런타임에 사용할 수 있도록 하기위해 사용합니다.
24. deinit은 언제 사용할까요? (When should I use deinit?)
💡 deinit 은 인스턴스가 메모리에서 해제되기 직전에 호출됩니다. 인스턴스를 해제하기 전에 선행되어야 하는 작업이 있다면 deinit에 구현할 수 있습니다.
25. DispatchQueue.main.async 와 DispatchQueue.main.sync 의 차이를 설명해보세요. (Explain the difference between DispatchQueue.main.async and DispatchQueue.main.sync?)
💡 두 방법 모두 DispatchQueue에 작업을 등록하고 Main 스레드에서 작업이 수행되도록 합니다 .
💡 DispatchQueue.main.async 는 작업을 등록할 때 async 하게 등록하기 때문에 등록한 작업이 끝나길 기다리지 않고 등록 후 곧바로 다음 코드를 실행 합니다.
💡 DispatchQueue.main.sync 는 작업을 등록할 때 sync 하게 등록하기 때문에 등록한 작업이 끝날 때 까지 다음 코드로 진행하지 않습니다. 이때 작업을 등록한 스레드 역시 메인 스레드라면 스레드가 sync에 의해 동작을 멈춘 상태에서 메인스레드에 큐에 등록된 작업이 할당됩니다. 메인 스레드는 큐에 등록했던 작업이 끝나길 기다리고, 동시에 메인 스레드에 할당된 작업은 실행되길 기다리기 때문에 데드락 상태 에 빠지게 됩니다.
26. Defer에 대해 설명해보세요. (Explain the defer usage in Swift)
💡 defer 는 클로저에 정의된 코드가 읽어진 이후에 함수가 끝나기 전 마지막에 실행되도록 합니다.
func deferTest() { print(1) defer { print(“last”) } print(2) } deferTest() // 1 // 2 // last
💡 defer 코드가 실행되지 않으면 함수가 끝나도 클로저는 실행되지 않습니다.
func deferTest() { print(1) return defer { print(“last”) } print(2) } deferTest() // 1
💡 여러개의 defer가 실행되었다면 읽혀진 역순으로 실행됩니다.
func deferTest() { print(1) defer { print(“last1”) } defer { print(“last2”) } defer { print(“last3”) } print(2) } deferTest() // 1 // 2 // last3 // last2 // last1
💡 중첩된 defer는 바깥쪽 defer 부터 실행됩니다.
func deferTest() { print(1) defer { print(“last1”) defer { print(“last2”) defer { print(“last3”) } } } print(2) } deferTest() // 1 // 2 // last1 // last2 // last3
27. open과 public 키워드의 차이를 설명해보세요. (What is the difference between open and public keywords in Swift?)
💡 open 과 public 키워드 모두 외부 모듈에서의 접근까지 허용 합니다.
💡 open은 클래스에서만 사용 할 수 있습니다.
💡 open은 외부 모듈에서 클래스를 상속하는 것과 메소드 오버라이딩이 가능하지만, public은 외부 모듈에서의 클래스 상속과 메소드 오버라이딩을 제한 합니다.
💡 동일한 모듈 내에서는 open과 public 모두 클래스 상속과 메소드 오버라이딩이 가능합니다.
28. fileprivate을 설명하고 언제 사용하면 좋을지 이야기해보세요. (When to use fileprivate access modifier in Swift?)
💡 fileprivate은 같은 소스파일 내에서의 접근만 하용 합니다.
💡 fileprivate인 인스턴스를 할당하는 변수는 private이거나 fileprivate 으로 접근이 제한되어야 합니다.
💡 fileprivate인 클래스를 상속할 때도 상속받는 클래스가 private이거나 fileprivate 이어야 합니다.
💡 같은 파일 내부에서만 사용되는 클래스일 때 fileprivate로 제한하면 유용하게 사용할 수 있습니다.
29. fileprivate과 private의 차이를 설명해보세요. (What is the difference between fileprivate and private?)
💡 fileprivate은 같은 파일 내부에 있다면 접근을 허용했지만 private은 같은 파일에 있어도 private으로 선언한 대상의 구현부 내부 , 그리고 같은 파일에 있는 동일한 선언의 Extension 에서의 접근만 허용합니다.
// A.swift private class A { public init() {} private var data: String } extension A { // 같은 파일에 있을 때만 가능 func updateData(data: String) { self.data = data } } // A+External swift extension A { // Error. Cannot find type ‘A’ in scope func printExternal() { print(self.data) } }
30. static func 와 class func의 차이를 설명해보세요. (What is the difference between static func and class func in Swift?)
💡 static func, class func 모두 타입 메소드 이기 때문에 인스턴스를 생성하지 않고 타입에 접근해 함수를 호출할 수 있습니다.
💡 class func는 오버라이딩 을 허용하지만 static func는 오버라이딩을 허용하지 않습니다.
💡 스위프트에서 유일하게 직접적인 상속을 지원하는 객체타입이 클래스라는 것을 생각해보면 class만 오버라이딩을 허용하는 것과 쉽게 연결시킬 수 있습니다!
31. Function과 Closure의 차이를 설명해보세요. (What is the difference between functions and closures?)
💡 Function과 Closure 모두 실행가능한 코드블록을 의미합니다.
💡 Function은 func 키워드와 함께 선언되고 함수의 이름 을 항상 가져야합니다. 반면에 클로저는 이름을 가지지 않습니다.
32. 스위프트에서 추상 클래스를 만들려면 어떻게 해야할까요? (Is there a way to create an abstract class in Swift?)
💡 스위프트는 추상 클래스 문법을 지원하지는 않지만 프로토콜을 통해 동일한 동작을 하도록 할 수 있습니다.
💡 프로퍼티와 메서드의 원형을 프로토콜에 선언해두고, Extension 을 통해 프로토콜 메서드의 기본 구현체를 만들어주면 추상클래스와 동일한 개념의 구현을 할 수 있습니다.
33. Any와 AnyObject의 차이를 설명해보세요. (What’s the difference between Any and AnyObject?)
💡 Any와 AnyObject 모두 범용타입으로 여러 타입을 한번에 표현할 수 있게 해주지만 AnyObject는 클래스 타입만 저장할 수 있다는 제한조건이 추가됩니다.
34. 언제 클래스 대신 구조체를 사용하면 좋을까요? (When should you use Structs over Classes?)
💡 스위프트에서는 기본적으로 구조체를 사용하길 권장하고 있습니다.
💡 구조체는 불변성을 유지하기 때문에 여러 스레드들이 한 인스턴스를 사용하는 다중 스레드 환경에서도 안전 하게 사용될 수 있습니다.
💡 구조체는 스택에 저장하기 때문에 더 빠릅니다. 힙에 저장되는 클래스는 힙에 인스턴스를 저장하고 그 참조값을 스택에 저장합니다.
35. 언제 구조체 대신 클래스를 선택해야할까요? (When should you use Classes over Structs?)
💡 구조체는 값 타입이기 때문에 값이 같은 인스턴스가 매번 복사되어 사용됩니다.
💡 따라서 만약 어떤 인스턴스의 참조값의 고유성을 유지 하고 싶다면 클래스를 사용할 수 있습니다.
💡 또한 Objective-C의 API를 사용할 때 는 클래스가 반드시 필요하기도 합니다. i.e.)NSCache의 value에는 구조체 인스턴스를 사용할 수 없습니다.
36. weak과 unowned 의 차이를 설명하고 예를 들어주세요. (Explain the difference between weak and unowned references. Provide an example.)
💡 weak은 참조하고 있던 인스턴스가 해제되는 것을 염두하여 항상 Optional한 타입을 가집니다. 만약 weak으로 선언한 변수가 참조하고 있던 인스턴스가 메모리에서 해제되면 해당 변수의 값은 nil로 채워집니다.
💡 unowned는 참조하고 있는 인스턴스가 unowned 변수 이전에는 절대 해제되지 않음을 보장하는 상황 에서 사용합니다.
💡 unwoend는 Optional을 허용하지 않습니다 . 따라서 unowned가 참조하고 있던 인스턴스가 해제된 이후에 unowned 변수를 참조하면 런타임 에러가 발생합니다.
// https://stackoverflow.com/questions/24011575/what-is-the-difference-between-a-weak-reference-and-an-unowned-reference class Person { let name: String init(name: String) { self.name = name } var apartment: Apartment? } class Apartment { let number: Int init(number: Int) { self.number = number } weak var tenant: Person? } // Person ===(strong)==> Apartment // Person <==(weak)===== Apartment class Customer { let name: String var card: CreditCard? init(name: String) { self.name = name } } class CreditCard { let number: UInt64 unowned let customer: Customer init(number: UInt64, customer: Customer) { self.number = number; self.customer = customer } } // Customer ===(strong)==> CreditCard // Customer <==(unowned)== CreditCard 37. unowned는 언제 사용하는 것이 안전할까요? (When is it safe to use an unowned reference?) 💡 unowned로 선언된 변수가 참조하는 인스턴스가 해당 unowned 변수가 해제된 이후에 해제되는 것이 보장되는 상황에서 사용하는 것이 안전합니다. // https://www.advancedswift.com/strong-weak-unowned-in-swift/ extension HomeVC { // Calling loadAPI no longer creates a Retain Cycle: // 1. Self (HomeVC) has a strong reference to api // 2. api has a strong reference to completion // 3. completion has a unowned reference to self (HomeVC) func loadAPI() { api.completion = { [unowned self] (data, error) in self.hideLoadingIndicator() } } // HomeVC -> api -> completion === (unonwned) ===> HomeVC }
38. Swift의 Copy-on-Write에 대해서 설명해보세요. (What is Copy on Write (Cow) in Swift?)
💡 COW는 값 타입의 복사를 실제로 값이 수정되기 전까지는 발생시키지 않아 메모리 사용을 최적화 하는 방법입니다. 예를 들어서 값타입인 배열을 두 변수에 저장해두면 두 개의 다른 인스턴스가 생성될 것을 기대하지만 실제로는 주소 값을 공유하고 있다가 변수에 변경사항이 생겼을 때 새로운 인스턴스를 할당합니다.
💡 이렇게 하면 수정이 일어나지 않는 값 타입 데이터는 복사본을 만들지 않고 사용되기 때문에 메모리 사용을 최적화할 수 있습니다.
import Foundation func address(of valueTypePointer: UnsafeRawPointer) -> Int { return Int(bitPattern: valueTypePointer) } func compareValueTypeInstance(of arr1:[Int], with arr2:[Int]) { if address(of: arr1) == address(of: arr2) { print(“same instance”) } else { print(“different istance”) } } let arr1 = [1, 2, 3, 4] var arr2 = arr1 compareValueTypeInstance(of: arr1, with: arr2) // “same instance” arr2.append(5) compareValueTypeInstance(of: arr1, with: arr2) // “different istance”
39. staic 변수와 class 변수에 대해 설명해보세요. (What’s the difference between a static variable and a class variable?)
💡 static 변수와 class 변수 모두 타입 프로퍼티 로 클래스, 구조체, 열거형에 모두 사용할 수 있습니다.
💡 타입 프로퍼티는 lazy 하게 동작해서 실제로 불리기 전까지는 메모리에 로드되지 않습니다.
💡 타입 프로퍼티는 한 번 불리면 메모리에 로드되고 그 이후로는 새로 생성되지 않습니다 .
💡 타입 프로퍼티는 타입 이름을 통해서만 접근이 가능하고 초기값을 항상 가져야합니다 .
💡 class 로 선언된 타입 프로퍼티는 오버라이딩이 가능 합니다.
💡 반면에 static 으로 선언된 타입 프로퍼티는 오버라이딩이 불가능 합니다.
40. ARC와 GC는 어떤 차이점이 있나요? (What is the difference between ARC (automatic reference counting) and GC (garbage collection)?)
💡 ARC와 GC의 가장 큰 차이점은 런타임에 처리를 하는지, 컴파일 타임에 처리를 하는지에 있습니다. ARC 는 Retain과 Release를 컴파일러가 컴파일 타임 에 자동으로 삽입해 Reference Count를 조절합니다.
💡 반변에 GC 는 가비지 콜렉터를 런타임 에 별도로 실행하면서 메모리의 상태를 감시합니다.
💡 ARC는 단순히 카운팅을 통해 인스턴스들을 관리하기 때문에 순환참조의 위험이 있습니다.
💡 GC는 Mark-and-Sweep 방식으로 루트노드부터 도달 가능한 인스턴스들을 모두 체크합니다. 따라서 순환참조가 발생하더라도 두 인스턴스를 참조하는 인스턴스가 해제되면 루트로부터 순환참조가 발생한 인스턴스들에 도달할 수 있는 경로가 없기 때문에 두 인스턴스를 모두 해제할 수 있습니다.
41. autoclosure attribute에 대해서 설명해보세요. (What is the autoclosure attribute and when to use it?)
💡 autoclosure는 클로저가 아닌 코드를 함수의 인자로 받을 때 이 코드를 클로저로 만들어주는 키워드입니다.
💡 autoclosure의 주된 목적은 코드의 실행을 지연 시키기 위함입니다. 클로저를 인자를 넘기는 것으로도 지연 실행을 만족시킬 수 있지만 autoclosure를 사용하면 호출하는 측 코드의 가독성이 좋아집니다.
💡 클로저 사용 X
// https://www.avanderlee.com/swift/autoclosure/ struct Person: CustomStringConvertible { let name: String var description: String { print(“Asking for Person description.”) return “Person name is \(name)” } } let isDebuggingEnabled: Bool = false func debugLog(_ message: String) { /// You could replace this in projects with #if DEBUG if isDebuggingEnabled { print(“[DEBUG] \(message)”) } } let person = Person(name: “Bernie”) debugLog(person.description) // 디버깅 모드가 아니어도 person.description이 실행됨
💡 클로저 사용
let isDebuggingEnabled: Bool = false func debugLog(_ message: () -> String) { /// You could replace this in projects with #if DEBUG if isDebuggingEnabled { print(“[DEBUG] \(message())”) } } let person = Person(name: “Bernie”) debugLog({ person.description }) // 클로저가 넘어가기 때문에 description 참조가 실행되지 않음
💡 autoclosure 사용
let isDebuggingEnabled: Bool = false func debugLog(_ message: @autoclosure () -> String) { /// You could replace this in projects with #if DEBUG if isDebuggingEnabled { print(“[DEBUG] \(message())”) } } let person = Person(name: “Bernie”) debugLog(person.description) // 클로저로 래핑되면서 들어가기 때문에 description 참조가 실행되지 않음
42. GCD의 QoS에 대해서 설명해보세요. (What is QoS (Quality of Service) in GCD?)
💡 Qos 는 DispatchQueue에 등록하는 작업의 우선순위 를 결정할 수 있게 합니다.
💡 우선순위가 높은 작업은 우선순위가 낮은 작업보다 먼저 실행되지만 앱의 리소스를 많이 사용합니다.
💡 qos 수준은 다음으로 정의됩니다.
💡 userInterative : 가장 우선순위가 높습니다. UI작업 등 사용자에게 즉각적인 반응을 해야하는 작업에 사용합니다.
💡 userInitiated : 문서를 열람하거나 인터페이스에 제스쳐를 취하는 등 사용자와의 상호작용이 시작되었을 때 곧바로 결과를 반환해야 하는 작업에 사용합니다.
💡 default : 기본값입니다. 일반적인 작업에 사용합니다.
💡 utility : 데이터를 다룬로드 하는 등 결과를 만들기 위해 시간이 걸리는 작업에 사용합니다. 프로그래스 바나 액티비티 인디케이터와 함께 사용합니다.
💡 background : 사용자가 인지하지 못하는 영역에서 에너지와 리소스를 효율적으로 사용하기 위해 사용합니다.
43. Hashable 프로토콜에 대해서 설명해보세요. (What is the use of Hashable protocol?)
💡 Hashable 프로토콜을 채택하는 타입은 모두 값을 정수인 해시값 으로 표현할 수 있습니다.
💡 스위프트의 기본 타입 중 문자열, 정수, 실수, 불리언, 그리고 Set 콜렉션 이 Hashable 프로토콜을 채택하고 있습니다.
💡 Hashable 프로토콜을 채택하는 커스텀 타입의 저장 프로퍼티가 모두 Hashable 프로토콜을 채택하고 있다면, 별다른 구현없이 Hashable 프로토콜을 채택하는 것 만으로 Hashable한 동작을 제공합니다.
💡 그렇지 않다면 == 메서드를 만들고 hash(into:) 구현해서 해시값을 생성하는데 필요한 프로퍼티를 지정해주어야합니다.
// https://developer.apple.com/documentation/swift/hashable struct GridPoint { var x: Int var y: Int } extension GridPoint: Hashable { static func == (lhs: GridPoint, rhs: GridPoint) -> Bool { return lhs.x == rhs.x && lhs.y == rhs.y } func hash(into hasher: inout Hasher) { hasher.combine(x) hasher.combine(y) } }
44. Hashable 프로토콜을 채택하는 커스텀 타입이 Equtable도 채택해야하는 이유가 무엇인가요?
💡 어떤 값에 대한 Hash 값은 고유하지만, Hash 값을 생성하는 built in 메소드인 hasher(_:) 가 서로 다른 값에 대해 동일한 Hash 값을 생성할 수 있기 때문입니다.
💡 이런 경우를 해시 충돌(Hash Collision)이라고 하고, 해시 충돌이 발생하는 경우를 알기 위해서는 두 인스턴스가 값이 일치하는 확인해야하기 때문에 Equatable 프로토콜을 채택해야합니다.
Hashable에 대한 엄청 좋은 글이 있네요! https://betterprogramming.pub/what-is-hashable-in-swift-6a51627f904
45. 열거형도 Hashable을 채택했을 때 자동으로 Hashable하게 만들 수 있나요?
💡 열거형은 associated value 가 없는 경우에는 Hashable 프로토콜만 채택해도 Hashable하게 사용할 수 있습니다.
💡 하지만 associated value가 있는 경우에는 hash 메서드를 구현해주어야 합니다.
46. init?()과 init()은 어떤 차이가 있나요? (What’s the difference between init?() and init()?)
💡 init?()은 실패가능한 생성자 로 생성자의 코드를 실행하다가 문제가 생겼을 때 nil을 반환하도록 할 수 있습니다.
class A { let a: String init?(a: String) { guard !a.isEmpty else { return nil } self.a = a } } print(A(a: “”)) print(A(a: “abc”)?.a)
47. Never 반환 타입에 대해 설명해보세요. (What is the Never return type? When to use it over Void?)
💡 Never 타입은 비정상적인 종료 에 사용되는 반환 타입이며 값을 지니지는 않습니다.
💡 클로저, 함수에 에러를 throw하는 것으로 잡을 수 없는 심각한 오류가 있음을 알릴 때 사용할 수 있습니다.
func crashAndBurn() -> Never { fatalError(“Something very, very bad happened”) }
48. weak만 사용하지 않고 unowned도 사용하는 이유가 무엇을까요? (Why can not we just use weak everywhere and forget about unowned?)
💡 unowned를 사용하면 옵셔널 을 신경쓰지 않아도 된다는 장점이 있습니다.
💡 unowned를 사용하면 참조하고 있는 인스턴스가 unowned 프로퍼티 이전에 항상 메모리에서 해제되는 것을 명시적으로 표현 할 수 있습니다.
49. ARC가 메모리해제를 할 수 없는 상황에 대해 설명해보세요. GC는 해결할 수 있을까요? (Explain the use case when ARC won’t help you to release memory (but GC will)?)
💡 ARC는 강한 순환 참조 상황에서 인스턴스를 해제하지 못하는 문제가 있습니다. 만약 어떤 두 클래스 인스턴스가 프로퍼티에 서로를 강한 참조 로 저장하고 있을 때 강한 순환 참조 가 발생할 수 있습니다.
💡 순환참조 발생
class A { var b: B? deinit { print(“A deinitialzied”) } } class B { var a: A? deinit { print(“B deinitialzied”) } } var a = A() var b = B() a.b = b b.a = a a = A() b = B() // retain cycle
💡 weak로 순환참조 회피
class A { var b: B? deinit { print(“A deinitialzied”) } } class B { var a: A? deinit { print(“B deinitialzied”) } } var a = A() var b = B() a.b = b b.a = a a = A() b = B() // B deinitialzied // A deinitialzied
50. DispatchGroup에 대해서 설명해보세요. (Explain what is DispatchGroup?)
💡 DispatchGroup은 여러 스레드에 분배되어 있는 작업들을 그룹으로 묶어서 동기적으로 관리하기 위해 사용합니다.
💡 DispatchGroup에 추가될 때 enter 메서드를 통해 작업의 개수를 1 늘려주고, 작업이 끝날 때 DispatchGroup에서 빠져나오면서 leave 메서드를 통해 작업의 개수를 하나 줄여줍니다.
💡 작업의 개수가 0이되면 notify 메서드가 실행되면서 모든 작업이 끝났을 때에 대한 처리를 수행할 수 있습니다.
💡 enter, leave, notoify를 이용해서 여러개의 비동기 작업들이 전부 끝날 때 작업을 수행하게 할 수도 있습니다.
// https://stackoverflow.com/questions/49376157/swift-dispatchgroup-notify-before-task-finish let group = DispatchGroup() let queueImage = DispatchQueue(label: “com.image”) let queueVideo = DispatchQueue(label: “com.video”) group.enter() queueImage.async(group: group) { sleep(2) print(“image”) group.leave() } group.enter() queueVideo.async(group: group) { sleep(3) print(“video”) group.leave() } group.notify(queue: .main) { print(“all finished.”) }
51. DispatchWorkItem의 장점이 무엇인가요? (What are the benefits of using DispatchWorkItem in Swift?)
💡 DispatchWorkItem을 사용하면 DispatchQueue에 등록할 작업을 캡슐화 할 수 있습니다.
let queue = DispatchQueue(label: “custom”) let workItem = DispatchWorkItem { print(“task is running”) } queue.async(execute: workItem)
💡 DispatchWorkItem을 사용하면 cancel , wait 등 제공되는 메서드를 사용해서 쉽게 작업에 대한 동작을 지정할 수 있습니다.
class SearchViewController: UIViewController, UISearchBarDelegate { // We keep track of the pending work item as a property private var pendingRequestWorkItem: DispatchWorkItem? func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { // Cancel the currently pending item pendingRequestWorkItem?.cancel() // Wrap our request in a work item let requestWorkItem = DispatchWorkItem { [weak self] in self?.resultsLoader.loadResults(forQuery: searchText) } // Save the new work item and execute it after 250 ms pendingRequestWorkItem = requestWorkItem DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(250), execute: requestWorkItem) } }
52. Concurrent와 Serial Queue가 async, sync와 함께 사용되는 상황에 대해서 설명해보세요. (Explain usage of Concurrent vs Serial Queues with async and sync blocks)
💡 concurrent + sync : DispatchQueue에 작업이 sync 하게 등록되기 때문에 작업을 등록하는 스레드는 작업을 등록하고 작업이 마쳐질 때까지 기다립니다 . DispatchQueue에 등록된 작업은 concurrent 하게 처리되기 때문에 작업의 종료여부와 상관없이 할당 가능한 스레드가 있다면 큐에 있는 작업을 스레드에 할당 시켜 작업을 시작합니다.
💡 concurrent + async : DispatchQueue에 작업이 async 하게 등록되기 때문에 작업을 등록하는 스레드는 등록한 작업이 끝나길 기다리지 않고 곧바로 다음 코드를 실행합니다. DispatchQueue에 있는 작업은 concurrent 하게 처리되기 때문에 작업의 종료여부와 상관없이 할당 가능한 스레드가 있다면 큐에 있는 작업을 스레드에 할당 시켜 작업을 시작합니다.
💡 serial + sync : DispatchQueue에 작업이 sync 하게 등록되기 때문에 작업을 등록하는 스레드는 작업을 등록하고 작업이 마쳐질 때까지 기다립니다 . DispatchQueue에 등록된 작업은 serial 하게 처리되기 때문에 현재 작업에 대한 처리가 끝나면 큐에 등록된 다음 작업을 스레드에 할당해 시작합니다.
💡 serial + async : DispatchQueue에 작업이 async 하게 등록되기 때문에 작업을 등록하는 스레드는 등록한 작업이 끝나길 기다리지 않고 곧바로 다음 코드를 실행합니다. DispatchQueue에 등록된 작업은 serial 하게 처리되기 때문에 현재 작업에 대한 처리가 끝나면 큐에 등록된 다음 작업을 스레드에 할당해 시작합니다.
53. @escaping에 대해서 설명해보세요.
💡 @escaping은 함수의 인자로 전달된 클로저를 함수가 종료된 후에 실행될 수 있도록 하는 속성입니다.
func completionTest(completion: @escaping () -> Void) { DispatchQueue.global().async { completion() } print(“1”) } completionTest { print(“end”) } // 1 // end
54. @objc와 dynamic의 차이에 대해서 설명해보세요. (What’s the difference between marking a method as @objc vs dynamic, when would you do one vs the other?)
💡 dynamic을 통해 선언된 멤버변수나 객체는 Objective-C를 사용해서 동적으로 디스패치 됩니다. 동적 디스패치는 런타임에 클래스가 연관 클래스들의 메서드 구현체들 중 어떤 클래스의 구현체를 사용하지 결정하는 것을 의미합니다.
💡 @objc는 스위프트의 API를 Objective-C에서 사용할 수 있도록 하는 속성이니다.
55. Extension은 메서드를 Override 할 수 있을까요?
💡 Extension에서는 메서드를 override 할 수 없습니다 .
💡 Extension은 새로운 함수 를 추가하기 위한 기능이지 기존 함수를 대체하기 위한 기능은 아닙니다.
56. RunLoop에 대해서 설명해보세요.
💡 RunLoop는 스레드 당 하나씩 생성되어서 Thread에 작업이 생기면 처리하고, 아닐 때는 대기시키는 역할을 합니다.
💡 RunLoop는 메인 스레드를 제외 한 스레드에서는 자동으로 실행되지 않고 개발자가 직접 실행시켜주어야 합니다.
💡 RunLoop를 실행하면 실행되는 동안 도착한 EventSource (input source, timer source)를 실행합니다.
💡 RunLoop는 한 번만 실행되고 실행이 끝나면 대기상태로 돌아갑니다.
57. autoreleasepool에 대해서 설명해보세요.
💡 autorelease는 참조 카운트의 감소를 즉시하지 않고 예약 을 할 수 있게하는 키워드입니다. 예약된 release는 autoreleasepool에 등록되고, autoreleasepool 인스턴스가 해제되면 등록되어 있던 예약된 release들이 모두 실행됩니다.
💡 만약 함수가 끝나기 전에 메모리에서 해제되어야 하는 인스턴스가 있다면 autorelease pool로 명시적으로 인스턴스의 참조 카운트를 줄여줄 수 있습니다.
func useManyImages() { let filename = pathForResourceInBundle for _ in 0 ..< 5 { for _ in 0 ..< 1000 { let image = UIImage(contentsOfFile: filename) // 5000개 생성 } } // 5000개 해제 } func useManyImages() { let filename = pathForResourceInBundle for _ in 0 ..< 5 { autoreleasepool { for _ in 0 ..< 1000 { let image = UIImage(contentsOfFile: filename) // 1000개 생성 } } // 1000개 해제 } } 58. OperationQueue에 대해서 설명해보세요. DispatchQueue와는 어떤 것이 다른가요? 💡 OperationQueue 는 작업을 나타내는 Operation 클래스의 실행을 관리하는 큐입니다. GCD와는 다르게 OperationQueue는 객체화된 작업을 큐에서 취소할 수 있고, 큐에 등록될 최대 작업의 개수를 설정하거나, 작업 간의 의존성 (어떤 작업이 선행되어야 하는지)에 대한 정보도 설정할 수 있습니다. 즉, DispatchQueue보다 좀 더 고수준의 API를 제공합니다. 💡 OperationQueue는 내부적으로 DispatchQueue 를 이용합니다. 💡 OperationQueue는 작업을 한번 객체화 하고 고수준 API를 지원하기 때문에 DispatchQueue보다 더 많은 리소스를 사용 합니다. 따라서 복잡하고 의존성에 대한 설정이 필요한 작업이 아니라면 DispatchQueue를 사용하는 것이 더 좋을 수도 있습니다. 59. final 키워드를 클래스 앞에 붙이면 어떤 효과가 있을까요? 💡 어떤 클래스의 프로퍼티나 메소드는 다른 자식 클래스로부터 override 될 수 있기 때문에, 이런 override된 메소드는 실제로 어떤 메소드를 실행할지 vtable 을 한 번 탐색해서 결정하게됩니다. 즉, 컴파일 타임이 아닌 런타임에 실제로 실행할 메소드가 결정 되는 것입니다. 이를 dynamic dispatch 라고 합니다. 💡 final 키워드를 사용하면 해당 클래스, 프로퍼티, 메소드가 다른 클래스에 의해 상속되고 있지 않다는 것을 컴파일러에게 알려주기 때문에 컴파일 타임에 어떤 메소드를 사용할지 바로 결정 할 수 있고, vtable을 거치지 않고 직접적으로 호출되기 때문에 성능상 더 좋은 퍼포먼스를 낼 수 있습니다. 60. vtable에 대해서 설명해보세요. 💡 vtable은 가상 메소드 테이블 로 컴파일 타임에 생성 되어 메소드가 호출되었을 때 사용할 구현체를 런타임에 특정 할 수 있게 해줍니다. 💡 vtable은 메소드 구현체의 주소를 배열로 가지고 있습니다. 💡 클래스마다 vtable 이 존재합니다. -> 아직 정확히 잘 모르겠어서 https://developer.apple.com/videos/play/wwdc2016/416/ 이거부터 보려구요ㅠ
61. 프로퍼티 옵저버에 대해 설명해보세요.
💡 프로퍼티 옵저버는 저장 프로퍼티의 값이 변화하는 것을 관찰 하기 위해 사용합니다.
💡 willSet 과 didSet 을 사용해서 프로퍼티의 값이 변화할 때 함께 실행할 작업을 정의할 수 있습니다.
💡 willSet은 새로 변화될 값을 newValue 라는 프로퍼티로 제공하고, didSet은 변화되기 전 값을 oldValue 라는 프로퍼티로 제공합니다.
class A { var name: String { willSet { print(“\(name) will be changed to \(newValue)”) } didSet { print(“\(oldValue) is changed to \(name)”) } } init(name: String) { self.name = name } } let a = A(name: “A”) a.name = “B” // A will be changed to B // A is changed to B
💡 연산프로퍼티는 부모 클래스의 연산 프로퍼티를 오버라이딩하는 경우만 프로퍼티 옵저버를 추가할 수 있습니다.
61. Property Wrapper에 대해 설명해보세요.
💡 프로퍼티 래퍼는 여러 프로퍼티에 대해 반복되는 코드를 재사용 할 수 있도록 해주는 기능입니다.
💡 @propertyWrapper 로 구조체를 정의하고 내부에 프로퍼티에 대한 동작을 정의해두면, 프로퍼티를 선언할 때 프로퍼티 래퍼를 키워드로 붙여 미리 정의한 동작을 재사용할 수 있습니다.
@propertyWrapper struct TwelveOrLess { private var number = 0 var wrappedValue: Int { get { return number } set { number = min(newValue, 12) } } } struct SmallRectangle { @TwelveOrLess var height: Int @TwelveOrLess var width: Int } var rectangle = SmallRectangle() print(rectangle.height) // Prints “0” rectangle.height = 10 print(rectangle.height) // Prints “10” rectangle.height = 24 print(rectangle.height) // Prints “12”
62. 고차함수 중 flatMap과 compactMap의 차이를 설명해보세요.
💡 compactMap 은 1차원 배열에서 각 요소에 대해 nil을 제거 하고 옵셔널 바인딩 을 한 결과를 배열로 만들어 반환합니다.
💡 flatMap 은 배열의 요소 타입이 옵셔널이라면, nil을 제거 하고 옵셔널 바인딩 을 한 결과를 배열로 만들어 반환합니다.
💡 flatMap 은 2차원 배열이면서 요소 타입이 옵셔널이 아니라면, 배열의 요소들을 1차원으로 합친 배열 을 반환하고 nil의 제거와 옵셔널 바인딩은 하지 않습니다.
let test = [1, nil, 2, nil, 3, nil] print(test.compactMap({ $0 })) // [1, 2, 3] let test = [1, nil, 2, nil, 3, nil] print(test.flatMap({ $0 })) // [1, 2, 3] let test = [[1, nil], [2, nil], [3, nil]] print(test.flatMap({ $0 })) // [Optional(1), nil, Optional(2), nil, Optional(3), nil] let test = [[1, nil], [2, nil], [3, nil]] print(test.flatMap({ $0 }).compactMap({ $0 })) // [1, 2, 3] let test = [[1, nil], [2, nil], [3, nil]] print(test.compactMap({ $0 }).flatMap({ $0 })) // [Optional(1), nil, Optional(2), nil, Optional(3), nil] let test = [[1, nil], [2, nil], [3, nil], nil] print(test.compactMap({ $0 }).flatMap({ $0 })) // [[Optional(1), nil], [Optional(2), nil], [Optional(3), nil]]
63. High Order Function에 대해서 설명해보세요.
💡 고차함수는 함수를 인자로 받거나 함수를 결과로 반환할 수 있는 함수입니다.
func test(execution: () -> Void) { execution() }
64. 함수형 프로그래밍은 무엇인가요? Swift는 함수형 프로그래밍 언어인가요?
💡 함수형 프로그램밍은 순수 함수 를 기반으로 하는 프로그래밍 패러다임입니다. 순수 함수는 어떤 입력에 대해 항상 같은 출력 을 만드는 함수를 의미합니다. 즉, 외부에 영향을 주거나 받는 side effect 가 없습니다.
💡 스위프트는 함수형 프로그래밍 언어이면서 동시에 객체 지향 프로그램밍 언어의 특징인 상속, 은닉, 캡슈화, 추상화 등을 제공하는 멀티 패터다임 언어입니다.
65. 순수함수가 무엇인가요?
💡 순수함수는 동일한 입력에 대해 항상 동일한 출력 을 가지는 함수입니다.
💡 순수함수는 사이드 이펙트 를 가지면 안됩니다.
66. 그럼 사이드 이펙트는 무엇인가요?
💡 사이드 이펙트는 함수를 통해 함수 외부 값의 상태가 변하는 것을 의미합니다.
var name = “hunihun956” func getName() -> String { // input(()) -> output(String from outer scope) | Side Effect return name } func getName(name: String) -> String { // input(String) -> output(String) | No Side Effect return name }
67. 순수 함수가 왜 필요하다고 생각하나요?
💡 같은 입력에 대해 항상 같은 출력을 만족하는 순수함수는 테스트가 용이 합니다. 외부 상태에 영향을 받지 않기 때문에 해당 함수만 테스트할 수 있기 때문입니다.
💡 사이트 이펙트가 없다는 것은 순수 함수들을 포함하는 객체의 유지보수성 이 좋다는 것을 의미합니다. 프로퍼티나 함수들이 다른 함수들에 의존적이지 않기 때문에 확장과 변경이 쉽게 가능합니다.
68. 1급 객체(혹은 1급 시민)에 대해서 설명해보세요. Swift에는 어떤 1급 객체들이 있나요?
💡 1급 객체는 함수의 인자로 전달되거나 반환 값으로 사용할 수 있는 객체를 의미합니다.
💡 또 1급 객체는 변수나 상수에 할당 할 수 있는 객체입니다.
💡 스위프트는 기본 타입들과 함수나 클로저까지 모두 1급 객체에 해당합니다.
69. Optional은 내부적으로 어떻게 구현되어 있나요?
💡 Optional은 associated value를 가지는 enum 으로 구현되어 있습니다. 값이 존재할 때는 some에 저장된 값을 반환하고, 값이 존재하지 않으면 nil을 반환합니다.
@frozen enum Optional
{ case none case some(Wrapped) } 70. Swift에서 참조 타입을 말해보세요.
💡 클래스, 함수, 클로저가 모두 참조 타입입니다.
71. String은 왜 subscript로 접근할 수 없을까요?
💡 String을 구성하는 각 문자들은 여러문자가 합성된 Unicode Scalar 로 이루어져 있습니다. 따라서 한 문자가 같은 크기의 메모리를 가지지 않습니다.
// https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html#//apple_ref/doc/uid/TP40014097-CH7-ID285 let eAcute: Character = “\u{E9}” // é let combinedEAcute: Character = “\u{65}\u{301}” // e followed by ́ // eAcute is é, combinedEAcute is é
72. Result 타입에 대해서 설명해보세요.
💡 Result는 success와 failure case 를 가지는 enum입니다.
💡 failure 케이스의 associated value는 반드시 Error 프로토콜 을 채택해야합니다.
💡 네트워크와 같이 실패할 가능성이 있는 작업의 성공여부와 결과를 쉽게 표현할 수 있습니다.
// https://www.hackingwithswift.com/articles/161/how-to-use-result-in-swift fetchUnreadCount1(from: “https://www.hackingwithswift.com”) { result in switch result { case .success(let count): print(“\(count) unread messages.”) case .failure(let error): print(error.localizedDescription) } }
73. some 키워드에 대해서 설명해보세요.
💡 some은 opqaue result type 입니다.
💡 함수 내부에서 반환되는 타입을 외부에서 명확하게 알 수 없도록합니다.
// Error. 구체타입을 명시하지 않음 func someList() -> Collection { return [1,2,3] } // OK. 구체타입을 알 수는 없지만 Collection을 채택하는 타입이 반환될 것을 보증함 func someList() -> some Collection { return [1,2,3] }
74. KVC에 대해서 설명해보세요.
💡 KVC는 Key-Value Coding 으로 객체의 값을 직접 사용하지 않고 KeyPath를 이용해 간접적 으로 사용하고 수정하는 방법입니다.
💡 {백슬래시(\)}.{타입}.{keypath} 로 keypath를 만들어 사용할 수도 있습니다.
struct A { var data = “Data” } var aInstance = A() print(aInstance[keyPath: \.data]) // Data print(aInstance.data) // Data aInstance[keyPath: \.data] = “Data2” print(aInstance[keyPath: \.data]) // Data2 let key = \A.data print(aInstance[keyPath: key]) // Data2
75. KVO에 대해서 설명해보세요.
💡 KVO는 Key-Value Oberving 으로 어떤 Key에 등록된 변수가 변경이 되는 것을 관찰하고 변경이 발생할 때마다 특정한 작업을 수행하기 위해 사용합니다.
💡 Objective-C 런타임에 의존하기 때문에 NSObject 를 채택해야하고, 관찰할 프로퍼티에는 @objc 와 dynamic 키워드를 붙여야 합니다.
class Obj: NSObject { @objc dynamic var data = “Data” } let obj = Obj() let observer = obj.observe(\.data, options: [.new, .old]) { _, changeInfo in print(“\(changeInfo.oldValue) has been changed to \(changeInfo.newValue)”) } obj.data = “Data2” // Optional(“Data”) has been changed to Optional(“Data2”)
Questions Source
💡 https://www.fullstack.cafe/interview-questions/swift
💡 https://github.com/JeaSungLEE/iOSInterviewquestions
키워드에 대한 정보 ios 면접 질문
다음은 Bing에서 ios 면접 질문 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 앱개발_리얼면접 Ep13 ㅣ ‘알집’ 이스트소프트 면접리뷰
- 앱개발
- 앱개발자
- 앱개발면접
- 앱개발코딩
- 앱개발자브이로그
- 현업자브이로그
- 면접브이로그
- 모의면접
- 1분자기소개
- 어플개발
- 개발자포트폴리오
- 리얼면접
- 개발코딩
- 깃허브
앱개발_리얼면접 #Ep13 #ㅣ #’알집’ #이스트소프트 #면접리뷰
YouTube에서 ios 면접 질문 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 앱개발_리얼면접 Ep13 ㅣ ‘알집’ 이스트소프트 면접리뷰 | ios 면접 질문, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.