Haru's 개발 블로그

iOS interview preview(추가중) 본문

IOS/interview

iOS interview preview(추가중)

Haru_29 2022. 5. 11. 19:17

1. iOS 아키텍처에 대하여 설명하여라

iOS는 계층구조를 가진다. iOS 아키텍처는 4가지 레이어로 구성되있으며 각 레이어는 하드웨어 위에서 작동하는 어플리케이션을 만들기 위하여 프로그래밍 프레임워크를 제공해준다. 통신은 응용 프레임워크와 하드웨어 계층에 의해 향상이 된다. 하위 계층은 모든 어플리케이션이 필요로 하는 서비스를 제공하고 상위 계층은 그래픽 및 인터페이스 관련 서비스를 제공한다.

1) 코어 OS 레이어: 코어 OS 레이어는 기기 하드웨어 바로 위에 위치하며 iPhone OS 스택의 맨 아래 레이어입니다. 메모리 관리, 파일 시스템 처리 및 스레드와 같은 기본 운열 체제 서비스 외에도 이 계층은 저수준 네트워킹, 외부 악세서리에 대한 액세스를 제공한다.

2) 서비스 계층: 상위 계층이나 사용자가 요구하는 서비스를 설계하는 것이 목적이다. 다른 필수 기능 중에는 블록 계체,Grand Central Dispatch, 인앱구매, iCloud 저장 공간이 있습니다. 그리고 ARC의 추가로 서비스 계층이 강화되었습니다.

3) 미디어 계층: 비디오, 오디오, 그래픽 등과 같은 미디어를 처리합니다. 미디어 계층을 통해 시스템의 모든 그래픽, 비디오 및 오디오 기술을 사용할 수 있습니다.

4) 코코아 터치 레이어: 어플리케이션 레이어라고 합니다. 어플리케이션이 빌드될 때 프레임워크가 생성되는 곳입니다. 또한 iOS 사용자가 운영 체제와 작업할 수 있는 인터페이스 역할을 합니다. 여기에는 터치 및 모션 기능이 포함이 됩니다.

 

2. iOS에서 속성이란 무엇을 의미합니까?

속성은 기본적으로 클래스, 구조체 또는 열거형을 의미합니다. 그들을 하위 변수 -> 다른 객체의 일부라 생각이 가능합니다.

struct Icecream {
	var flavor : String = ""
}
var choco = Icecream()
choco.flavor = "Chocolate Icecream"

위 코드에서는 Icecream이라는 구조를 만들었습니다. 속성 중 하나는 초기 값이 비어 있는 String인 flavor입니다.

 속성의분류

2-1) 저장된 속성: 이 유형의 속성은 상수 또는 변수 값을 인스턴스로 저장하는데 사용할 수 있스며 일반적으로 클래스 및 구조에서 제공합니다.

class Programmer {
	var progName : String
   	let progLanguage : String
    var totalExperience = 0
    var secondLanguage : String?
}

위의 Programmer 클래스는 progName, progLanguage, totalExperience 및 secondLanguage의 4가지 저장 속성을 정의합니다.

이들은 클래스 인스턴스의 일부인 값을 포함할 수 있으므로 저장된 속성입니다. 위의 예는 기본값이 있거나 없는 속성과 선택적 속성을 보여줍니다.

  2-2) 계산된 속성: 이러한 속성은 값을 저장하는 대신 값을 계산하는데 사용할 수 있으며 일반적으로 클래스, 열거형 및 구조에서 제공합니다.

struct Angle {
	var degrees: Double = 0
    
    var rads: Double {
    get {
    	return degrees * .pi /180
    }
    set(newRads) {
    	degrees = newRads * 180 / .pi
    }
  }
}

위와 언급한 것과 같이 angle 구조는 각도를 도 단위로 저장하기 위해 도라는 저장 속성을 가진다. 또한 각도는 라디안으로 표현 할 수 있고 Angle 구조에는 계산된 속성인 Rads 속성이 포함된다.

 

3. 원자적 성질과 비원자적 성질의 차이? , 합성 속성의 기본값?

원자 속성: 기본 속성이며 유효한 값이 getter에서 반환되거나 setter에서 설정이 가능하다. 이렇게 하면 하나의 스레드만 주어진 속성의 getter/setter에 엑세스할 수 있고 다른 모든 스레드는 첫 번쨰 스레드가 getter/setter를 해제할 때까지 기다려야 한다. 그래서 스레드로부터 안전함에도 불구하고 프로세스가 완전히 완료되었음을 보장받으므로 빠르지 않다.

비원자적 속서이 비원자 속성을 사용하면 여러 스레드가 주어진 속성의 getter/setter 메서드에 동시에 애세스할 수 있스므로 값 간에 불인치 가능성이 있다. 엑세스가 향상되었지만 반환 값을 보장받을 순 없다.

 

 

4. ios 어플리케이션 상태의 다른 유형은 무엇인가?

실행 과정에서 ios 어플리케이션에서 일련의 과정을 가진다. -> 이러한 상태를 어플리케이션의 생명 주기라고 한다.

 

Not running : Running 상태가 아님 상태에서 응용 프로그램이 사작되지 않았거나 시스템에 의해 종료됨

inactive : 앱이 active 상태를 벗어나 들어가는 동안 잠시 비활성 됩니다. foreground에서 실행되고 있음에도 불구하고 아직 사용자 입력이나 이벤트를 수락할 준비가 되지 않았다.  -> 이것은 어플리케이션 isactive 상태라 한다.

active: active 상태란 앱이 foreground에서 실행중이고 이벤트를 수신하고 있음을 의미한다. 이것은 일반적으로 foreground 앱의 일반 모드이며 사용자 인터페이스에 액세스 할수 있다.

background: 이 상태에서 어플리케이션의 사용자 인터페이스는 숨겨지지만 ios 시스템의 백그라운드에서 계속 실행합니다. 응용 프로그램은 일반적으로 일시 중단되기 때문에 이 상태를 통과합니다.

suspended: 이 경우 어플리케이션은 백그라운드에 있지만 코드를 실행하고 있지 않습니다. 그러나 그것은 메모리에 남아있습니다.

메모리 부족 상태에서 시스템은 경고 없이 일시 중단된 상태의 앱을 삭제할 수 있다.

 

5. iOS 개발자란 무엇이며 어떤 책임이 있습니까?

iOS 개발자는 iOS 장치에서 Apple iOS를 실행하는 응용 프로그램을 설계 및 개발하는 프로그래머 또는 소프트웨어 엔지니어입니다.

이상적으로는 iOS 개발자는 Objective-C와 Swift의 두 가지 프로그래밍 언어에 능숙해야 합니다.

iOS 개발자의 주요 책임

  5-1)iOS 어플리케이션을 위한 깨끗하고 효율적인 코딩

  5-2)어플리케이션에 대한 문제 해결 및 버그 수정을 수행하여 깨끗하고 안전한 코드를 보장합니다.

  5-3) 고급 앱 기능의 개발 및 배포는 물론 기존 기능의 유지 관리 및 개선

  5-4)고객의 비지니스 요구 사항을 충족하는 혁신적인 솔루션을 개발

  5-5) 설계, 테스트, 릴리스 및 지원을 포함하여 어플리케이션 개발의 모든 측면을 지원

  5-6) 개발 효율성을 극대화하기 위해 지속적으로 새로운 기술을 탐색, 평가 및 구현합니다.

 

6. iOS에서 딥링킹은 무엇인가?

딥링크는 URI 또는 범용 링크를 사용하여 웹사이트나 스토어가 아닌 앱으로 직접 사용자에게 보내는 링크입니다.

URL 체계는 딥 링크를 갖는 잘 알려진 방법이지만 유니버셜 링크는 동일한 링크 아래에서 웹 페이지와 앱을 연결하는 Apple의

새로운 연결 방식이다. 딥링킹에는 앱을 여는 클릭 가능한 링크뿐만 아니라 리소스로 이동하는 스마트한 링크도 포함이 된다.

사용자는 이러한 링크도 포함이 된다. 사용자는 이러한 링크를 사용하여 인앱 위치로 바로 연결되므로 해당 페이지를 직접 찾는 시간과 노력을 줄일수 있게 된다.

7. iOS에서 GCD(Grand Central Dispatch)가 무엇인가?

GCD(Grand Central Dispatch)는 백그라운드에서 스레드를 관하여 사용자가 동시 작업(동시에 발생)을 실행할 수 있는

저수준 API입니다. GCD는 동시성과 병렬성을 iOS 어플리케이션에 구축하는 Apple의 솔루션이므로 메인 스레드에 영향을 주지 않고

background에서 여러 background 작업을 동시에 실행 할수 있습니다. 작업의 작업의 직렬 실행의 지루한 프로세스를 피하기 위해 개발

 

 

8.ARC(Automatic Reference Counting)이란?

Swift 프로그래밍 언어에서 ARC은 앱의 메모리 사용량을 관리하는 데 사용됩니다. 시스템 리소스를 초기화 및 초기화 해제하여 더 이상 필요하지 않을 때 클래스 인스턴스가 예약한 메모리를 해제합니다. ARC는 현재 각 클래스 인스턴스를 참조하는 속성, 상수 및 변수의 수를 추적합니다. 인스턴스에 대한 확성 reference가 하나 이상 있는 경우 ARC는 해당 인스턴스에서 할당 해제되지 않습니다.

 8-1) ARC는 init()를 사용하여 새 클래스 인스턴스를 만들고 정보를 저장하기 위해 memory의 chunk를 할당

 8-2) memory는 인스턴스 유형 및 해당 값에 대한 정보를 저장

 8-3) 클래스 인스턴스가 더 이상 필요하기 안흥면 ARC는 deinit()를 호출하며 자동으로 메모리를 해제해준다.

 8-4) 현재 참조하는 클래스의 속성, 상수 및 변수를 추적하여 ARC는 deinit()가 사용되지 않는 인스턴스에만 적용되야 한다.

 

9. cocoa와 cocoa Touch

Cocoa Cocoa Touch
Mac OS X에서 실행되는 응용 프로그램을 빌드하기 위한 응용 프로그램 프레임워크입니다. iPhone 및 iPad와 같은 장치에서 실행되는 응용 프로그램을 빌드하기 위한 응용 프로그램 프레임워크입니다.
Foundation 및 AppKit와 같은 프레임워크가 Cocoa에 통합 Cocoa Touch은 Founation 및 UIKit와 같은 프레임워크가 Cocoa Touch에 통합된 조합
Cocoa 클래스는 NS(cocoa 프레인워크의 모든 클래스 및 상수에 사용됨) 접두사(예: NSTextField, NSWindow)를 사용합니다. 반면에 Cocoa Touch 클래스는 UI(cocoa touch 프레임워크의 모든클래스 및 상수에 사용됨) 접두사(예: UITextField 및 UIWindow)를 사용

10. iOS용 어플리케이션 인터페이스를 구축하는 데 사용되는 프레임워크는 무엇인가?

iOS 및 OS X 개발을 위한 클래스, 프로토콜 및 기능을 정의하는 Foundation 프레임워크와 달리 UIKit은 iOS 개발을 위해 특별히 설계되었습니다. iOS에서는 UIKit을 사용하여 어플리케이션의 사용자 인터페이스와 그래픽 인프라를 개발합니다.

  10-1) Event handing

  10-2) App structure

  10-3) User interface

  10-4) Graphic, Drawing, and Printing

 

11. iOS에서 동시성을 달성하는 다양한 방법은 무엇이 있을까?

동시성이란 같은 작업을 동시에 실행한다는 것을 의미한다. 동시성을 통해 iOS 장치는 응답하는 사용자 인터페이스를 유지하면서 background 작업(ex: 데이터 다운로드 및 처리)을 처리할수 있다. iOS에서는 GCD 및 Operations를 사용하여 동시 작업을 관리할 수 있습니다. 동시성을 달성하기 위해 iOS는 다음과 같은 3가지 방법을 제공한다.

  11-1) Dispatch queues: FIFO(선입 선출) 순서로 작업을 관리하고 순차적으로 또느 동시에 작업을 실행하는데 사용이 된다.

  11-2) Threads: 독립적인 명령 시퀸스는 프로그램 내의 다른 코드와 별도로 실행할 수 있습니다. 스레드를 통해 단일 어플리케이션에서 여러 코드 경로를 동시에 실행이 가능하다. Thread를 갖는 것은 프로그램은 프로그램의 나머지 실행에 영향을 주지 않고 긴 작업을 하는데 용의하다.

  11-3) Operation Queues: Operation queue의 객체들은 우선 순위 및 준비 상태에 따라 호출된다. 기본적으로 작업 대기열은 GCD를 기반으로 구축된 대기열 모델의 상위 수준 추상화입니다. 따라서 GCD와 마찬가지로 객체 지향 방식으로 작업을 동시에 실행이 가능하다.

 

12. 프로세스와 쓰레드의 차이

  12-1) 프로세스와 쓰레드의 차이

    1)프로세스 : 운영체제로부터 시스템 자원을 할당받는 작업의 단위

각각의 독립된 영역(Code, Data, Stack, Heap)을 각자 할당 받음!

따라서 프로세스끼리는 서로의 변수나 자료구조에 대해 절대 접근을 할 수가 없다....

만약, A 프로세스가 B 프로세스 자원 접근하려고 하면, 프로세스간 통신(IPC)를 사용해야 한다

 

2. 쓰레드: 한 프로세스 내에서 동작되는 여러 실행의 흐름 -> 쓰레드는 프로세스가 아닌, 프로세스 내에서 동작되기 때문에 메모리 영역을 독립적으로 할당할 수 없다.

이런 느낌으로 Code, Data, Heap 영역은 공유 -> Stack 영역만 독립적으로 할당 -> Stack 영역이 LIFO이라서, 

Stack이 쌓이면 프로세스가 섞인 채로 순서대로 나와 흐름을 방해해줌

따라서 쓰레드들끼리는 힙 영역을 공유하여 같은 자원을 접근 가능 -> 단, 각자의 스택 영역은 접근할 수 없음

 

12-2) 멀티 프로세스, 멀티 쓰레드

멀티 프로세스
멀티 쓰레드

 

  멀티 프로세스 멀티 쓰레드
정의 하나의 프로그램을 여러 개의 프로세스로 구상하여, 각 프로세스마다 하나의 작업(Task)씩 처리하도록 하는 것 하나의 프로그램을 여러 개의 쓰레드로 구성
-> 각 쓰레드마다 하나의 작업(Task)씩 처리하도록 하는 것
생성/ 종료 시간 많은 시간 소요 적은 시간 소요
Context Switching 많은 시간 소요 적은 시간 소요
자원 접근 IPC 사용 공유 자원 사용
메모리 할당 Code/Data/Stack/Heap 모두 독립적으로 할당 Code/Data/Heap만 공유
Stack만 독립적으로 할당
장점 독립된 구성이므로 안전성이 높음 1.Context Switching이 빠름
2. 생성/ 종료 시간도 빠름
3. 프로세스 간 자원 공유가 간단함
단점 1. Context Swiching시 시간이 많이 소요됨 -> 오버헤드발생
2. 생성/ 종료 시간이 오래 걸림
3. 프로세스 간 자원 공유가 어려움
1. 설계가 까다로움
2. 동기화 문제가 있음
3.하나의 쓰레드에서 문제가 발생 시 전체 쓰레드에영향이 감

13. App ID와 Bundle ID사이의 상태?

Bundle ID: Apple 생태계에서 어플리케이션의 고유 식별자입니다. 즉, 어플리케이션이 동일한 식별자를 가질 수 없다. 번들링 ID는 OS X 및 iOS 앱 모두에 사용되며 앱 업데이트를 인식하는데 사용가능

ex) 조직의 도메인이 scaler.com이고 Edge라는 앱을 만드는 경우 com.scaler.edge 문자열을 앱의 Bundle ID로 할당 가능하다.

 

App ID: 이 문자열은 동일한 개발 팀의 하나 이상의 앱을 고유하게 식별합니다. 문자열레는 마침표(.)로 구분된 팀 ID와 번들 ID의 두 가지 구성 요소가 있습니다. Apple은 특정 개발 팀을 식별하기 위해 팀 ID를 제공하는 반면 개발자는 단일 앱 또는 앱 모음을 식별하기 위해 Bundle ID를 제공

ex) ABC.com.scaler.edge -> ABC: 팀 ID, com.scaler.edge: Bundle ID

 

14. Write the difference between assign and retain keywords

Assign: Assign을 사용하면 소스의 보유 횟수(얼마나 많은 객체를 "유지"하는지 추적하는 숫자)를 늘리지 않고

한 객체에서 다른 객체로 reference가 생성. 값을 복사하거나 유지하지는 않지만 할당

if(object != object) {
	[object realease];
    object = nil;
    object = object;
}

여기서 Assign은 값을 복사하거나 유지하지 않고 인스턴스 변수에 직접 할당하는 setter를 생성

retain: 이 방법을 사용하여 한 개체에서 다른 개체로의 reference를 만들고 원본 개체의 유지 횟수를 늘립니다.

if(object != object) {
	[object realease];
    object = nil;
    object = [object retain];
}

15. Swift에서 NSError를 설명하라.

오류 조건에 대한 정보는 확장 가능하고 객체 지향적인 방식으로 NSError 객체 내에 캡슐화됩니다. NSError 객체는 사전

정의된 오류 도메인(문자열으로 표시됨), 도메인별 오류 코드 및 응용 프로그램별 정보를 포함하는 사용자 정보 사전의

세 가지 기본 속성을 구성

ex) NSString *도메인 = @"com.MyCompany.MyApplication.ErrorDomain";

NSString *desc = NSLocalizedString(@"프로세스를 완료할 수 없습니다.",@"");

NSDictionary *userInfo = @{NSLocalizedDescriptionKey: 설명 };

NSError *error = [NSError errorWithDomain:도메인 코드:-101 userInfo:userInfo];

 

16. 메모리 저장 방식 - Big Endian / Little Endian

Bid Endian: 데이터를 메모리에 저장할 때, 큰 단위가 앞에오게끔 저장하는 방식

Little Endian: 데이터를 메모리에 저장할 때, 작은 단위가 앞에오게끔 저장하는 방식

  Big Endian Little Endian
장점 1. 숫자 비교가 빠르다
2.소프트웨어 디버그가 편하다
1.수학적 연산이 쉽다
2. 타입을 읽거나 형변환 하는 게 빠르다
단점 1.수학적 연산이 어렵다
2.타입을 읽거나 형변환 하는 게 느리다
1. 숫자 비교가 느리다
2. 소프트웨어 디버그가 불편하다

Network Byte Order : 네트워크 상에서 데이터 전송할 땐 네트워크 바이트 오더를 따라야 한다

그 중 가장 흔한 포맷 -> Big Endian -> 따라서 내 컴퓨터가 Little Endian이면 서버에서 데이터를 전송할 때

Big Endian으로 변환하는 작업을 해줘야 함

16-1) Little Endian -> Big Endian

htons(host to network short): short 메모리 값을 호스트 바이트 순서에서 네트워크 바이트 순서로 바뀜

htonl(host to network long) : long 메모리 값을 호스트 바이트 순서에서 네트워크 바이트 순서로 바꿈

16-2) Big Endian -> Little Endian

htons(host to network short) : short 메모리 값을 네트워크 바이트 순서에서 호스트 바이트 순서로 바꿈

htons(host to network short): long 메모리 값을 네트워크 바이트 순서에서 호스트 순서로 바뀜

 

17) iOS는 Big Endian or Little Endian??

그러면 iOS는 메모리를 저장할 때 Big Endian으로 저장할지 Little Endian으로 저장할지 알아보자

Objective-C으로 직접 실험하기

int num = 1;
char *ptr = #

if(*ptr == 1){
	NSLog(@"LITTLE ENDIAN");
    }else {
    NSLog(@"BIG ENDIAN");
}

으로 확인을 해보자

이때 num은 4Byte이기 때문에

Big Endian일 때와 Little Endian일 때 각각 위 그림처럼 저장 되있다.

근데 이제 1Byte 크기의 ptr 포인터 변수를 선언해서 num의 첫 번째 Byte를 가르키게 한다.

Big Endian이면 *ptr이면 0

Little Endian이면 *ptr의 값이 1이 나온다.

결과는..

따라서 iOS는 Little Level으로 데이터를 저장한다.

따라서, 만약 아주 작은 Low Level로 통신해야 하는 경우면 

네트워크 바이트 오더로 변경하는 작업을 해야한다.

 

18) Swift에서 KVC와 KVO의 차이점을 알아보자

KVC(Key-Value Coding): 개발 중에 속성 이름을 정적으로 알지 않고 문자열을

사용하여 런타임에 개체 속성에 액세스할 수 있다.

KVO(Key-Value Observing): Objective-C와 Swift에서 KVO는 프로그램 상태 변화를 관찰하는 방법

개체에 인스턴스 변수가 있는 경우 KVO는 다른 개체가 해당 변수의 변경 사항을 관찰할 수 있도록 한다.

 

 

19) TDD(Test- Driven Development) 설명하기

 

소프트웨어 개발자는 소프트웨어 개발에 테스트 주도 개발(TDD)을 사용할 수 있습니다. TDD에서 개발자는 만들고자

하는 소프트웨어의 기능을 계획한 다음 구현하기 전에 각 기능에 대한 테스트 케이스를 작성합니다.

테스트 주도 개발을 톹ㅇ해 구현 품질(작동하는지)과 디자인 품질(잘 구성되어있는지)에 대한 통찰력을 얻을 수 있습니다.

 

처음에는 코드가 아직 구현되지 않았기 때문에 테스트 케이스가 실패(적색 단계) -> 그 후 테스트 케이스가 통과하고 구성 요소 또는 

현재 테스트 케이스를 중단하지 않는지 확인하기 위해 코드를 작성합니다(녹색 단계)

그런 다음 개발자는 코드베이스를 정리 및 유지 관리하고 효율성을 최적화하여 코드 구현을 리팩토링해야 한다. ->

새로운 태스트 케이스가 추가할 때마다 프로세스를 반복한다.

Comments