https://github.com/yurrrri/ready-for-tech-interview.git
https://github.com/JaeYeopHan/Interview_Question_for_Beginner.git
https://github.com/iStudyiOS/iOS_iAmReadyForInterview.git
- PNG와 JPG의 차이점은?
PNG는 무손실 이미지 포맷으로 JPG는 손실 이미지 포맷이라는 점이 가장 큰 차이점입니다.
png는 이미지 품질을 유지하지만 파일 크기가 크고
jpg는 이미지 품질을 조절할 수 있으나 이미지 데이터가 손실이 되고 파일크기가 작습니다.
PNG는 투명도를 지원하지만 JPG는 지원하지 않는다는 차이점도 있습니다.
따라서 PNG는 로고같이 투명도가 필요하거나 그림과 같이 고유한 색을 표현하여 원본 데이터가 중요할 때 사용합니다.
JPG는 사진이나 복잡한 이미지를 저장할 때 사용하고 호환성이 좋기 때문에 웹이나 기기에서 저장할 때 주로 사용합니다.
png = portable network graphics
손실 없는 이미지 포맷으로, 이미지 압축을 사용하지 않고 이미지 품질 손실 없이 저장
투명도를 포함한 이미지를 지원 이미지의 배경이 투명한 경우 사용
비손실 압축 방식으로 이미지의 품질을 유지하지만 파일 크기가 크다
주로 로고 아이콘 그래픽 디자인과 같이 투명도가 중요한 경우 사용
이미지에 고유한 색상이 포함되어있는 경우 사용한다.
jpg = joint photographic experts groups
손실 압축 이미지 포맷으로 이미지의 품질을 일부 손실시키고 파일 크기를 줄이는 방식으로 저장
압축률을 조정하여 이미지의 품질과 파일 크기를 조절 가능 높은 압축율일수록 파일 크기가 작아짐
사진이나 복잡한 이미지를 저장할 때 사용한다.
웹이나 기기에서 저장할 때 주로 쓴다 호환성 최고다!
- 그렇다면 무손실 압축은 뭘까요?
압축된 데이터를 원본 데이터로 완벽하게 복원할 수 있는 방법을 얘기한다.
텍스트 파일, png파일, ZIP 파일에서 사용한다.
허프만 압축 알고리즘을 사용할 수 있다.
허프만 압축 알고리즘은 자주 나타나는 문자에는 짧은 이진코드를 드물게 나타나는 애는 긴 이진코드를 붙인다
시간복잡도는 O(nlogn)이다.
- 그렇다면 손실 압축은 뭘까요
불필요한 정보나 데이터를 비슷하게 대체하여 압축을 한다.
음악 mp3 압축, 이미지 jpeg, 비디오 압축등이 있다
원본 데이터의 품질이 중요하지 않고 데이터 용량을 최소화할 때 유용하다.
이미지 데이터를 블록으로 나누고 각 블록을 일부 손실시키면서 색상 정보를 줄이는 방식으로 한다.
그렇다면 heic은 뭘까요?
High Efficiency Image File Format의 약자로 고효율 이미지 파일 형식을 말한다.
무손실과 손실 압축을 모두 사용해 높은 품질의 이미지를 상대적으로 작은 파일로 저장한다.
그럼 왜 heic을 안써요?
호환성 문제때문이다. 기기, OS, 브라우저, 편집 툴에서 지원을 안한다.
JPG와 PNG를 면접에서 물어보면 왜 물어볼까? 그리고 꼬리질문으로 뭐가 있을까?
*GIF는 뭐야?
비손실 압축으로 이미지를 저장한다. 애니메이션을 만들때사용한다.
*BMP뭐야
픽셀단위로 비트맵을 표현하는 비손실 압축 방식.
모든 픽셀에 대해 정확한 색상정보를 저장하기때문에 파일크기가 겁나 큼.
사진에는 왜 Jpg 씀?
압축률이 높아 파일크기 줄일수있음
호환성이 좋아 다양한 기기에서 사용가능
압축과 해제과정이 빠르다.
파일크기가 작아 네트워크 통신에 유리
dp란?
최적화 문제를 해결하는 알고리즘입니다.
기억하기 알고리즘.
입력 크기가 작은 부분문제들을 해결한 후에 그 답을 이용하여 큰 크기의 부분 문제를 해결하는 방식이다.
최적 부분 구조(Optimal Substructure)와 중복되는 부분 문제(Overlapping Subproblem)의 조건을 만족할 때 사용
최적화 문제는 뭔가요??
주어진 조건 또는 제약에서 어떤 목적 함수의 값을 최대화 혹은 최소화하는 것을 목표로하는 것입니다.
예를 들어 배낭 문제나 최단경로 문제가 있습니다.
최적 부분 구조와 중복되는 부분 문제란 뭔가요?
각 부분 문제들의 결과들을 결합하여 전체 문제의 결과를 얻을 수 있는 구조를 가진 문제를 의미
피보나치에서 결과값을 얻으려면 이전의 두개의 결과값을 더하여 만드는 구조를 말한다.
중복되는 부분 문제는 말그대로 같은 부분 문제들이 반복적으로 발생하는 특성을 의미한다.
메모이제이션은 뭐야?
디피를 구현하는 방법중 하나로 부분 문제의 결과를 기억하는 것을 말한다.
일반적으로 탑다운에서 사용하며 바텀업에서는 디피 테이블과 반복문을 통해 중복계산을 피한다.
탑다운은 재귀적인 방법으로, 바텀업은 반복문을 사용하여 해결한다.
피보나치 탑타운으로 구현해보실래요?
func fibonacci(_ n: Int, _ memo: inout [Int?]) -> Int { if n <= 1 { return n } if memo[n] != nil { return memo[n]! } memo[n] = fibonacci(n - 1, &memo) + fibonacci(n - 2, &memo) return memo[n]! } var memo = Int? print(fibonacci(10, &memo)) // 55
피보나치 swift와 c++을 이용해서 바텀업으로 구현해보실래요?
func fibonacci(_ n: Int) -> Int { if n <= 1 { return n }
1 |
|
dp와 분할정복의 차이점과 어떤 상황에서 사용하나요
두 기법은 목적과 접근 방식에서 차이가 있습니다.
dp는 부분문제가 서로 의존적이나 분할정복은 독립적인 차이가 있습니다.
dp는 문제를 쪼개서 탑다운 바텀업 방식으로 구현하지만 분할정복은 재귀함수를 사용한다.
dp는 최적부분 구조와 중복 부분 문제를 가지고 있거나 최적화 문제에 사용한다.
분할정복은 독립적인 부분 문제로 쉽게 분할하고, 이들을 병렬처리하여 해결할 수 있을 때 사용한다.
dp를 사용할 때 주의할 점
적절한 메모지에이션을 하지 않으면 중복계산을 할 수 있다.
결과를 저장할 배열이나 맵을 사용하면 메모리 사용량이 증가할 수 있다.
최적 부분 구조, 중복 부분 문제를 가지는 지 확인해야한다. 없다면 정답을 보장할 수 없다.
virtual memory란?
가상 메모리는 컴퓨터 시스템에서 실제 물리적인 램보다 큰 주소 공간을 제공하는 기술입니다.
컴퓨터의 프로그램들이 실행될 때, 각 프로세스마다 독립적인 가상 주소 공간을 할당받는다.
가상 메모리는 프로세스가 필요로하는 메모리보다 더 큰 메모리 공간을 제공한다.
따라서 메모리 의존성을 낮춰주고 자원회수를 잘하여 메모리 관리가 더 편하게 된다.
이걸 가능하게 하는 기술은 페이지 테이블과 페이징이다.
가상메모리를 사용하는 이유는 뭔가요?
메모리 관리의 단순화, 메모리 용량 및 안정성 보장을 하기 위해
프로세스가 독립적인 메모리 공간을 갖기 때문에 다중 프로세스를 효과적으로 지원할 수 있다.
가상 메모리는 프로세스에게 필요한 메모리만 할당하므로 효율적인 메모리 관리가 가능하다.
메모리 공간이 격리되어있기 때문에 서로의 메모리에 접근하는 것을 방지하여 안정성과 보안을 제공한다.
페이징은 뭔가요?
프로세스를 4kb의 크기의 작은 블록인 페이지로 분할하는 메모리 관리 기법입니다.
프로세스의 가상 주소 공간을 페이지 단위로 나누고
각 페이지는 페이지 번호로 식별되며
페이지 번호는 페이지 테이블을 통해 물리적인 주소와 매핑된다.
페이지 테이블은 가상주소를 물리적인 주소와 매핑해주는 자료구조이다.
각 프로세스마다 페이지 테이블이 할당되며 배열형태나 해시 테이블 형태로 구현된다.
가상메모리의 특징과 장단점이 뭔가요?
프로세스들이 서로의 공간을 침범하지 않고 독립적으로 실행됩니다.
운영체제는 물리 램보다 주소 공간을 사용할 수 있다.
각 프로세스는 자신의 가상주소만 접근할 수 있고 다른 프로세스의 주소공간에 접근을 방지한다.
필요한 부분만 메모리에 로드하여 대용량 데이터 처리에도 효과적이다.
2차 메모리는 속도가 굉장히 느리다.
페이지 테이블등 추가적인 자원과 처리과정에서의 오버헤드,
페이지 교체를 수행할 때의 오버헤드가 발생할 수 있다.
맥 기준 페이지는 뭐라그래 몇키로바이트야 가상메모리 개념을 macOS 차원에서 설명해줘
윈도우랑 같음
세그멘테이션이랑 페이지 차이점이뭐야
세그먼트의 크기가 서로 다를 수 있지만 페이지는 고정된 크기를 갖는다.
면접 기술질문에서 가상메모리를 물어봤어 꼬리질문이 뭐가있을까?
페이지 폴트가 어떤 상황에서 발생하나요? 페이지 폴트를 처리하는 방법은?
할당되지 않은 곳을 접근할 때, 프로세스의 페이지가 메모리에 있지 않을 때
페이지 교체나 디스크I/O를 통해서 해결한다.
가상메모리 성능 향상 기법은 뭐가있나요?
메모리 압축, 페이지 교체 알고리즘 최적화, 스와핑 최소화, 페이지 크기 최적화, 디스크 I/O 최적화
페이지 교체 알고리즘은 뭐가있나요?
LRU(Least Recently Used): 가장 오래전에 사용된 페이지를 교체한다.
FIFO(First In First Out): 가장 먼저 메모리에 로드된 페이지를 교체한다.
LFU(Least Frequently Used): 가장 적게 사용된 페이지를 교체한다.
MFU(Most Frequently Used): 가장 많이 사용된 페이지를 교체한다.
가상 메모리와 관련된 페이지 테이블의 구조는?
페이지 번호: 가상메모리 페이지의 인덱스
프레임 번호: 물리메모리 페이지의 인덱스
유효비트: 메모리에 로드되어 유효한 페이지 인지 확인
기타 제어비트: 쓰기권한 수정여부같은 기타비트
메모리 압축이 뭐야
페이지 폴트를 줄이고 물리 램의 활용성을 높이기 위한 기술이다.
메모리에 저장된 데이터를 압축 알고리즘을 이용해서 압축하고 빠르게 압축해제하여 사용한다.
가상메모리가 디스크를 사용하지 않아도 유용한 이유
프로세스 격리로 보안강화, 필요한 페이지만 적재하여 메모리 관리의 효율성, Fork 기능
사용하지 않는 메모리 자원 회수의 효율성
공유메모리가 뭐야
프로세스나 스레드가 같은 물리적인 메모리 영역을 공유하여 데이터를 주고받는 것
병렬 처리, ipc, 멀티스레드에서 사용합니다.
프로세스와 스레드
프로세스는 시스템 리소스를 할당 받아 실행 중인 프로그램의 인스턴스입니다.
스레드는 프로세스 내에서의 실행 단위입니다.
멀티스레딩을 사용하는 이유는 무엇인가요?
병렬처리로 인한 성능향상을 얻기위해, UI의 응답성을 높이기 위해, 자원공유와 효율성
멀티스레딩을 할 때 주의할 점이 잇나요?
공유된 데이터를 수정하는 경우 생기는 동기화 문제가 있는데요.
경쟁 조건과 교착상태등의 문제가 발생할 수 있다.
스레드의 동기화란 무엇이고 왜필요한가요
여러개의 스레드가 공유된 데이터나 자원에 접근하고 수정하는 동작을 조율하는 기술을 말한다.
멀티스레딩 환경에서 여러 스레드가 동시에 공유된 데이터를 수정할 때 데이터 일관성을 유지하고
예측가능한 작업을 보장하기 위해 필요하다.
여러 스레드가 동시에 하나의 데이터를 변경하려고 하는 경쟁 조건 방지를 하기 위해서입니다.
반대로 서로가 서로의 자원을 기다리면서 무한히 대기하는 상태인 교착상태를 방지하기 위해서입니다.
교착상태는 언제 생겨?
상호배제, 점유대기, 비선점, 순환대기의 상태가 모두 충족되면 발생한다.
상호배제는 자원은 한번에 하나의 스레드에 의해서만 점유되고 사용될 수 있어야한다.
점유대기는 점유한 상태에서 기다린다는 것이다.
비선점은 해당 스레드가 끝날 때까지 자원을 점유하는 것을 의미한다.
순환대기는 스레드들이 서로를 대기하는 사이클이 형성되는 것을 의미한다.
경쟁조건이랑 교착상태를 해결하는 방법은 뭐야
경쟁조건은 뮤텍스, 세마포어, 모니터링을 통해 해결할 수 있습니다.
교착상태는 필요조건중 하나를 제거하여 예방하거나, 모니터링하여 회피하거나, 탐지하면 스레드를 중지하거나 리소스를 해제한다.
dump
세마포어와 뮤텍스는 뭐야
다중 프로세스 또는 다중 스레드 환경에서 공유 자원에 대한 접근을 동기화하는 동기화 기법이다.
세마포어는 정수 변수로 임계구간을 처리할 수 있는 리소스의 수이다.
Down or wait 이나 up signal 연산을 하여 세마포어의 값을 변환시킨다.
뮤텍스는 상호배제 원칙을 기반으로 한다.
락과 언락의 연산만 하며 0또 1로 판별한다.
세마포어는 임계구간을 처리할 수 있는 리소스의 수가 여러개일 때, 작업간의 실행 순서를 정하고 싶다면
뮤텍스는 한개의 리소스를 제어할 때, 즉 상호배제만 하고 싶을 때 사용한다.
동시성과 병렬성은?
동시성은 단일 CPU 코어에서 작업이 문맥교환이 일어나며 파바바바박 해서 동시에 돌아가는 것처럼 보이는것
병렬성은 여러 CPU 코어로 실제로 동시에 실행되는 것을 말한다.
스레드의 상태전이는? 디스패치 생성 -> 준비 <-> 실행 -> 종료 인터럽트 중단 대기
프로세스간 통신과 스레드간 통신의 차이점을 설명하고 어떤 상황에 사용하는가?
IPC를 이용하여 통신하는데 공유메모리를 사용하는 방법이있다. 복붙같은 것에 사용한다.
스레드간 통신은 동기화를 통해 일관성과 안정성을 보장한다. GUI와 백그라운드 통신에 사용한다.
멀티 스레드와 멀티 프로세스 차이와 언제 사용하는지, 어느 것이 성능이 더 좋은지
멀티 스레드는 하나의 프로세스 내에서 여러개의 스레드를 생성하여 동시에 실행하는 방식
같은 프로세스 리소스를 공유하기 때문에 데이터 공유가 간단하고 빠르다.
멀티 프로세스는 여러개의 프로세스를 생성하여 동시에 실행하는 방식이다.
멀티 스레드는 I/O 바운드, 자원공유가 필요할 때, 동기화 문제 고려
멀티 프로세스는 계산 위주의 CPU 바운드, 안정성과 보안이 중요할 때, 프로세스간 통신 고려
즉 프로세스의 속도가 cpu에 영향을 받으면 멀티 프로세스가 유리, I/O 에 영향을 받으면 멀티스레드가 유리
멀티프로세스와 멀티스레드를 사용하는 예시를 들어주세요
웹 브라우저, 파일입출력
Garbage Collection이란?
더 이상 필요하지 않은 메모리를 해제하여 메모리 누수를 방지하고 프로그래머의 메모리 관리 부담을 줄이는데 사용한다.
Garbage Collection 동작원리는 뭐야
Reachable 한 지 Unreachable한 지 판단하여 메모리 해제 시킨다.
객체가 생성되면 eden이라는 부분에 할당이 되고 스택안에서 선언된 객체들은 스택이 끝나면 Unreachable하다.
그런 것들만 해제하고 계속 Reachable한 객체들은 마킹해서 survive 공간에 보낸다.
swift의 ARC를 알고있다.
ARC와 Garbage Collection의 차이점과 장단점
ARC는 각 객체에 대한 참조 횟수를 추적하여 참조 횟수가 0이 되면 자동으로 해제한다.
GC는 더이상 사용하지 않는 객체들을 주기적으로 탐지하여 자동으로 해제한다.
ARC는 컴파일 시간에 참조 개수를 추적하므로 런타임 오버헤드가 적다.
그러나 순환참조같이 객체들이 복잡한 관계에 있다면 메모리 누수가 일어날 수 있다.
GC는 순환참조 같은 복잡한 상황에서도 메모리 누수를 방지할 수 있다.
실행시간에 GC를 하므로 런타임 오버헤드가 있다.
ARC의 동작원리 설명해주세요
각 객체는 참조 횟수를 가지고 있습니다. 객체를 생성하거나 참조당할 때 횟수가 올라가고 더 이상 참조되지 않으면 감소합니다.
ARC는 기본적으로 강한 참조를 사용합니다.
변수가 객체를 참조하면 해당 객체의 참조 횟수가 올라가고 변수가 다른 값이 되거나 범위를 벗어나면 감소한다.
ARC는 순환참조를 방지하기 위해 약한 참조를 사용할 수 있다.
약한 참조는 객체의 참조횟수를 증가시키지 않고 객체가 해제되면 자동으로 nil이 설정된다.
상수를 약한 참조 할 수 없으며 약한 참조는 항상 옵셔널이어야한다.
ARC는 순환참조를 방지하기 위한 다른 방법을 제공하는데 미소유 참조이다.
참조하고 있는 객체가 항상 유효해야한다. Weak와 달리 자동으로 nil을 설정하진 않는다.
따라서 객체가 해제되어도 접근이 가능하다. 위험하다 weak로 다 할 수 있으니 하지마라.
Swift와 Xcode에서 Memory Leak의 대처방법은?
논리적으로 강한 참조 순환 방지를 해준다.
순환참조와 클로저 내에서 강한 참조하는 경우를 방지하기 위해 캡쳐리스트에서 약한 참조를 사용한다.
Instruments를 사용하여 메모리 누수를 확인한다. 디버그 세션을 이용하여 확인한다.
메모리 그래프를 파일 형식으로 내보내고 leaks로 누수가 난 객체를 확인할 수 있다.
malloc_history로 객체를 어디서 생성하는지 확인하고 누수를 해결한다.
deinit을 이용하여 로그를 찍어본다.
그럼 프로젝트에서 릭 대처를 해보셨나요?
C 프로젝트에서는 단 하나의 릭도 안나도록 했습니다.
그러나 Swift 프로젝트에서는 메모리그래프 파일로 릭체크를 하고 역추적 하는등 경험해보았습니다.
캐시란 무엇인가?
CPU에 위치하여 CPU와 메모리간의 접근을 도와주는 역할을하는 메모리입니다.
데이터를 더 빠르게 접근하여 시스템의 성능을 향상시키기 위해 사용합니다.
캐시는 데이터의 지역성 원리를 기반으로 동작한다.
cpu가 필요한 데이터가 캐시에 있을 때는 캐시 히트. 없을 때는 캐시 미스라고 한다.
캐시는 CPU가 자주 사용하는 데이터나 사용할 것 같은 데이터를 예측해서 가져온다.
캐시는 데이터 일관성을 보장해야합니다.
데이터의 지역성은 뭔가요?
캐시의 지역성은 데이터에 접근할 때 특정 시간동안 일정 지역 주변에 있는 데이터에 더 자주 접근하는 현상입니다.
캐시의 적중율을 높이려면 어떻게 해야하나요?
시간 지역성, 공간 지역성을 활용합니다.
적절한 캐시 크기 선택이 중요합니다. 작으면 적중률이 낮아지고 크면 히트 시간이 길어지거나 메모리 공간의 낭비가 발생한다.
캐시 미스가 나는 상황에는 어떤 것들이 있나요?
프로그램을 처음 실행할 때 해당 메모리 주소를 처음 불러왔기 때문에 캐시 미스가 발생합니다.
캐시의 용량이 작아서 없는 경우도 있습니다.
CPU 캐시말고 캐시의 종류와 그것들에 대해 모두 설명해 주세요
디스크 캐시, 메모리 캐시, 페이지 캐시, 웹 캐시, 데이터베이스 캐싱
hdd, ssd, dram, sram?
hdd는 하드디스크로 기계적으로 회전하는 원판위에 데이터를 저장하는 메모리입니다.
데이터 접근 속도가 느리며, 기계적인 움직임으로 인해 물리적인 지연이 있을 수 있다.
기계적이기 때문에 물리적 충격이 가해지면 데이터가 손실되거나 소음이 있을 수 있다.
ssd는 반도체 기반의 메모리로 기계적인 부품이 없어 물리적인 지연이 없다.
dram은 메인 메모리로 CPU와 가까운 위치에 있어 빠른 데이터 접근 속도를 가진다.
전원이 공급되는 동안만 데이터를 유지하기 때문에 휘발성 메모리이다.
윈도우와 달리 맥북은 재부팅을 해도 하던 작업을 자동으로 켜줍니다. 꺼지기 전 메모리 상태를 디스크에 저장한다.
SRAM은 비휘발성으로 데이터를 유지한다. 속도와 안정성이 뛰어나다.
hdd, ssd, dram, sram을 면접에서 물어봤어 꼬리질문이 뭘까?
깃이란?
Version Control System중에 하나로 파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼낼 수 잇는 시스템을 말한다.
VCS에는 로컬 버전 관리, 중앙집중식 버전관리, 분산버전 관리 시스템이있다.
로컬 버전 관리는 말그대로 로컬환경에서 버전 관리하는 것인데 Revision Control System라는 도구를 이용한다.
중앙집중식은 파일을 관리하는 서버가 별도로 있고 클라이언트가 서버에서 파일을 받는 형식이다.
중앙 서버에 너무 의존적이기 때문에 리스크가 있다. 위키피디아 같이 서버는 한군데 있고 많은 사용자들이 수정하는 경우이다.
분산버전은 저장소 전부를 복제한다. 깃은 이 분산버전에 해당한다.
깃 파일관리에 대해 말씀해주세요
Commited, Modified, Staged로 관리하는데
Commited는 데이터가 로컬DB에 저장된 상태를 말한다.
Modified는 로컬에서 수정한 파일을 로컬DB에 커밋하지 않은 것을 말한다.
Staged란 커밋 대상을 추린 커밋 직전의 상황을 말한다.
깃의 장단점은?
분산 버전관리 방식이기 때문에 개발자들이 저장소를 복제하여 독립적으로 작업할 수 있다.
이슈나 풀리퀘같은 유연한 브랜치 관리로 협업을 용이하게 해줍니다.
모든 변경 사항에 대한 기록이 남기 때문에 버그나 이슈를 추적하기 쉽다.
깃은 따로 공부를 해야하므로 사용하는데에 시간이 걸린다.
큰 프로젝트 같은 경우는 병합 충돌이 발생하여 동기화를 일일이 해줘야한다.
git은 파일 이름만 추적하므로 이름이 바뀌면 해당 파일의 이전 변경 내역을 추적할 수 없다.
git flow에 대해서 설명해봐라
master은 제품이 출시될 수 잇는 최종버전
develop은 기능들이 추가되는 기본이 되는 브랜치
feature은 새로운 기능 개발을 하는 브랜치
DB index 추가의 장단점은?
DB인덱스란 데이터베이스의 테이블에서 특정 컬럼에 대해 검색 성능을 향상시키기 위해 새로 생성하는 자료구조다.
DB index를 추가하면 인덱스를 통해 데이터를 빠르게 검색할 수 있다.
인덱스의 단점은 데이터의 복사본이 필요하므로 추가 저장공간이 필요하다는 점입니다.
인덱스도 같이 업데이트를 해야돼서 삽입 수정 삭제의 오버헤드가 있을 수있다.
모든 컬럼에 인덱스를 걸면될텐데 그렇게 하지 않는 이유는?
추가 저장공간과 오버헤드같이 비용이 증가함으로 하지 않습니다.
인덱스는 b트리로 구현되어있는데 루트노드 이외에는 디스크에 있습니다.
디스크의 접근속도는 램에 비해 매우 느립니다. 따라서 인덱스는 비교적 접근 속도가 느리다는 단점이 있습니다.ㄴ
인덱스는 데이터 양이 많고 데이터 갱신보다 검색이 자주 되는 컬럼에 주로 사용한다.
관계형 데이터 베이스란 뭘까?
데이터를 테이블 형태로 저장하고 관리하는 시스템이다.
테이블은 행(로우, 레코드), 열(컬럼, 필드)로 이루어져있으며 SQL을 이용하여 관계형 db를 조작하고 관리할 수 있다.
데이터베이스의 키에 대해서 말해보세요
각각의 레코드를 구별하고 식별하기 위한 것.
기본 키는 각 레코드를 고유하게 식별하는 키이다.
후보키는 기본키가 될 수 있는 모든 키를 의미한다.
대체 키는 후보키에서 기본키가 되지 못한 키들을 말한다.
외래키는 다른 테이블의 기본키를 참조하는 키이다.
SQL은 뭔가요?
SQL은 크게 DML과 DDL로 나누어진다.
DDL은 테이블을 정의할 때, DML은 테이블의 데이터를 관리할 때 사용한다.
Create, alter, drop //// insert, select, update, delete
데이터베이스의 정규화란 무엇인가요
데이터베이스의 정규화는 데이터베이스 설계과정에서
중복을 최소화하고 데이터의 일관성과 무결성을 보장하기 위해 테이블을 나누는 것이다.
1 정규화 : 테이블의 각 열이 하나의 값만 가지도록 분리한다. 2 정규화 : 현재 테이블의 주제와 관련없는 컬럼을 분리한다. 3 정규화 : 특정 컬럼에 종속되는 컬럼을 분리한다.. BCNF : 후보키에 의해 결정되는 모든 결정자가 후보키가 되도록한다. 4 정규화 : 다치 종속성을 제거하여 테이블의 중복을 최소화한다. 5 정규화 : 조인 종속성을 제거하여 테이블간의 종속성을 최소화한다.
대칭 암호화란
암호화와 복호화에 동일한 암호 키를 사용하는 방식이다.
des : 32/32로나누고 하위 32비트를 expand하여 48비트로 만든다.
48비트와 키를 XOR 연산을 하고 치환 테이블에 따라 32비트로 치환한다.
그것을 재배치해서 맨 처음 상위 32비트와 XOR 연산을 한다. 결과의 상위 32비트에는 처음 하위 32비트를 넣는다.
aes
비대칭 암호화란
암호화와 복호화에 사용되는 키가 다른 암호화 방식
공개 키와 개인 키라는 것을 사용하여 더욱 안전하고 효율적이다.
비대칭 암호화의 알고리즘으로는 RSA가 있다.z`
비대칭 암호화를 면접에서 왜물어볼까
SSL은 무엇인가?
secure sockets layer의 약자로 네트워크 상에서 데이터를 안전하게 전송하기 위한 프로토콜이다.
웹 브라우저와 웹 서버간의 통신에서 가장 흔하게 사용되며,
https 프로토콜을 통해 웹 사이트의 보안 연결을 구현하는데 사용한다.
- 서버는 공개키를 클라이언트에게 준다.
- 클라이언트는 공개키를 사용하여 자신의 대칭키를 암호화하여 보낸다.
- 서버는 비밀키로 암호화된 대칭키를 해독한다.
- 이후 모든 데이터는 대칭키를 사용하여 암호화된다.
오토레이아웃이 뭐야
오토레이아웃은 ios 개발에서 UI를 구축하는 데 사용하는 레이아웃 시스템입니다.
Constraints를 이용해서 뷰의 “위치”와 “크기”를 “동적”으로 지정하는 것
뷰들간의 상대적인 관계를 정의하여 유연한 인터페이스를 구성한다.
오토레이아웃의 장점은 무엇인가요?
다양한 디바이스 크기와 방향에 대응하여 앱의 인터페이스를 쉽게 조정할 수 있다.
인터페이스의 유연성과 일관성을 확보할 수 있다.
오토레이아웃의 기본 구성요소는?
Constraints: 뷰들 사이의 상대적인 관계를 정의한다.
Constraints의 우선순위: 제약 조건에 우선순위를 부여하여 충돌을 해결한다.
스택뷰: 뷰들을 수평, 수직으로 그룹화하여 배치한다.
제약 충돌이 발생하는 경우는 어떡하나요?
우선순위를 조정하여 충돌을 해결할 수 있다.
제약조건을 다시 부여한다.
오토레이아웃을 코드로 구현하려면?
NSLayoutConstraint클래스를 사용하여 뷰들의 제약조건을 코드로 작성한다.
Visual Format Language를 사용하여 제약조건을 정의한다.
NSLayoutAnchor으로 제약 조건을 더 간결하게 설정한다.
1️⃣ addSubView로 뷰 추가해주기
Button.trailingAnchor.constraint(equalTo: self.view.trailingAnchor , constant: -80).isActive = true trailingAnchor / bottomAnchor에 한해서 storyboard와 달리 -(minus)를 붙여주어야 한다는 사실 잊지 마셈
NSLayoutAnchor의 하위클래스로는 NSLayoutXAxisAnchor - 수평 제약 NSLayoutYAxisAnchor - 수직 제약 NSLayoutDimension - 너비, 높이
오토레이아웃의 동작 방식에 대해 설명해주세요
각 뷰에 대해 위치, 크기, 간격등의 제약 조건을 설정
화면에 인터페이스를 배치할 때 시스템은 설정된 제약 조건을 계산한다.
시스템은 계산된 제약조건을 기반으로 각 뷰의 위치와 크기를 설정한다.
이후 화면 변화에 대응하여 자동으로 제약 조건을 계산한다.
오토레이아웃에서 Intrinsic Content Size란?
뷰의 콘텐츠가 있어 제약조건을 부여하지 않아도 되는 뷰들의 크기를 말한다.
라벨과 버튼같이 너비, 높이 둘다 내재된 컨텐츠 크기를 가지고 있는 경우
슬라이더같이 너비만 가지고 잇는 경우 UIView처럼 아무것도 가지고 있지 않은경우
content hugging은 Intrinsic Content Size의 최대값을 지정하는 것
뷰가 컨텐츠를 적절하게 감싸기 위해
compression resistance은 최소값을 지정하는 것이다.
뷰가 컨텐츠를 가리지 않기 위해 사용
스택뷰는 뭔가요
스택뷰는 여러 뷰들을 horizontal vertical으로 그룹화하여 정렬하는데 사용한다.
스냅킷이란 무엇인가
짧은 코드로 autolayout을 표현할 수 있도록 도와주는 프레임워크
sampleView.snp.makeConstraints{ (make) in make.width.equalTo(self.view) make.height.equalTo(70) make.top.equalTo(self.view).offset(30) }
sampleView.translatesAutoresizingMaskIntoConstraints = false sampleView.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true sampleView.heightAnchor.constraint(equalToConstant: 70).isActive = true sampleView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 30).isActive = true
Safe area에 대해 설명하시오.
iOS 화면에서 실제로 컨텐츠를 배치할 수 있는 영역을 의미한다.
Safe Area를 설정해야 뷰를 레이아웃할 때 그것을 기준으로 시스템 UI와 겹치지 않는다.
Storyboard를 이용했을 때의 장단점을 설명하시오.
앱의 흐름을 직관적으로 볼 수 있다.
UI 개발 속도가 빠르다.
Storyboard에 많은 컴포넌트들이 있으면 로딩시간이 오래걸린다.
Storyboard 파일의 포맷이 XML이기 때문에 협업 시에 Merge Conflict가 발생하고, 해결하기 어렵다.
협업 시 다른 사람이 만든 View의 수정을 하기가 어렵다.
Pull Request를 할 때 View의 수정사항을 자세히 써주지 않으면, 어떠한 점이 변경되었는지 파악하기 힘들다.
View의 재사용성이 떨어진다.
MVC란 무엇인가?
모델은 데이터를 담당한다. 외부 서비스와 상호작용하여 데이터를 가져오고 저장하는 역할을 한다.
뷰는 데이터에 대한 화면표현을 담당한다.
컨트롤러는 모델과 뷰 사이에 위치하여 데이터를 가공하여 뷰로 전달하고 뷰에서 발생하는 이벤트를 입력받아 처리한다.
그러나 코코아 MVC는 살짝 다른 개념으로 이해했습니다.
기존의 MVC는 모델이 변경사항이 있을 때 뷰로 직접 알려줬다면 iOS 개발할 땐 뷰컨을 무조건 이용해야했습니다.
MVC의 장점과 단점은?
계층을 분리함으로써 독립적으로 개발하고 관리할 수 있다.
이로인해 코드의 가독성과 재사용성이 향상된다.
역할 분담을 하여 개발자가 동시에 작업할 수 있다.
구성 요소간의 통신과 상호작용할 때 오버헤드가 발생할 수 있다.
모델과는 분리되어있지만 뷰와 컨트롤러는 강하게 결합되어있다.
MVVM이란?
MVVM은 view controller를 View로 취급한다.
그렇게 뷰와 그외의 요소간의 의존성을 제거하는 데 집중했다.
뷰모델이 뷰를 알지 못한다면 뷰가 표현할 데이터는 데이터 바인딩이라는 것을 통해 해결한다.
뷰만 뷰모델을 알고 있고 UI 인스턴스와 뷰모델이 가진 프로퍼티를 사용한다.
MVVM에서 뷰는 버튼이 터치되었다는 사실만 뷰모델에 전달한다. 그럼 요구사항을 이해하고 모델로부터 데이터를 가져온다.
데이터 바인딩이란?
뷰와 뷰모델을 연결하여 뷰모델에서 변경된 데이터가 자동으로 UI에 업데이트되도록 하는 것
mvvm의 장단점?
UI 와 비즈니스 로직 코드가 분리되었기에, 테스트 하기 쉬워졌다.
이름, 개념 단위로 파일명을 작성하니 구조만 보더라도 무엇을 담당하는 파일인지 쉽게 알 수 있게되고
무엇보다 재활용성이 높아졌다.
UI 내부에서 비즈니스 로직을 처리하기 까다롭다는 점
Combine 을 비롯한 다수의 비즈니스 로직을 viewModel 이라는 레이어를 만들면 한 곳에서 직관적으로 풀 수 있다는 점
SwiftUI.View라는 것은 이미 “View + ViewModel”의 기능을 갖고 있어서
직접 Model의 값을 Reactive하게 View에 반영하는 것이 가능하다는 것 입니다.
MVC와 MVVM을 사용한 이유는
우선 빵딜은 UIKit 프로젝트입니다. UIKit 프로젝트는 스토리보트와 뷰컨트롤러로 설계되어있습니다.
기존의 MVC가 아닌 코코아 MVC가 자동으로 적용되어 모델만 따로 빼주면 개발에 용이하다고 생각했습니다.
요즘은 UIKit도 MVVM으로 개발하는 경우가 있다고 들었는데 그것은 뷰 컨트롤러가 처리하는 로직이 커질때 사용한다고 알고있습니다.
그정도 규모의 프로젝트는 아니라고 생각했고 애플에서 정해준 가이드라인대로 개발하고자 MVC를 사용했습니다.
그다음 dq는 SwiftUI 프로젝트입니다. dq를 처음 설계할 때 어떤 아키텍처를 채택할 지 고민이 많았습니다.
뷰가 뷰모델이나 뷰컨트롤러의 기능을 할 수 있는데 왜 굳이 뷰모델이라는 것을 만드는지 이해가 안갔습니다.
그래서 여기저기 물어보고 정보도 찾아다녔습니다. 그러다 한 답변을 듣고 MVVM을 선택하기로 했습니다.
많은 사람들이 채택하니깐이었습니다. 회사에 들어가면 협업을 하게됩니다.
아무리 좋은 패턴, 아키텍처, 앱이 있어도 사용하는 사람이 없으면 의미가 없다고 생각하기에 의문이 있음에도 채택했습니다.
KVC와 KVO란?
객체 간의 데이터 통신을 위해 사용한다.
kvc는 객체의 프로퍼티에 직접 접근하지 않고 문자열 기반의 키를 이용하여 프로퍼티 값을 가져오는 것이다.
KVO는 객체의 프로퍼티 값 변경을 관찰하고 변경될때 이벤트를 받아 처리할 때 사용한다.
델리겟, 노티피케이션
프로토콜을 이용하여 특정 기능을 정의해놓고 데이터 통신을 할 다른 객체에게 위임하는 것이다.
노티피케이션은 노티피케이션센터라는 옵저버에 데이터를 post하여 어디서든 접근할 수 있는 데이터 통신을 하는 것이다.
스위프트의 특징은?
var과 let, 옵셔널을 이용하여 안정성을 높였다.
구조체와 클래스를 지원하여 객체지향 프로그래밍이다.
클로저와 고차함수를 지원하는 함수형 프로그래밍이다.
프로퍼티와 메서드를 정의해놓은 프로토콜을 지원하는 프로토콜지향 프로그래밍이다.
ARC를 이용하여 메모리관리에 용이한언어이다.
컴파일 시간에 모든것을 하기 때문에 컴파일이 오래걸린다.
스위프트의 자료형은?
값타입인 Int, Bool, Float, Character, String, Tuple, Array, Dictionary, Set, Enum, Struct
레퍼런스타입인 Class, function, Closure가 있다.
array, string, Dictionary, Set과 같이 가변길이를 가지면 힙
값타입 레퍼런스타입?
Value Type 은 copying시 data의 unique한 복사본을 생성합니다.
반면 Reference Type은 shared instance 를 사용합니다
값타입은 속도에 장점이 레퍼런스는 메모리효율에 장점이 있다.
속도는 다음의 항목에 따라 결정된다.
Allocation: 인스턴스를 생성하면 Stack과 Heap 중 어느 곳에 할당 되는 지
Reference Counting: 인스턴스를 통해 레퍼런스 카운트가 몇개가 발생하는지
Method Dispatch: 인스턴스에서 메소드를 호출했을 때, 메소드 디스패치가 정적인지 동적인지, 클래스의 다형성
구조체와 클래스 차이
구조체는 값타입으로 레퍼런스 카운팅이 안됨, 클래스는 참조타입으로 레퍼런스 카운팅이 됨
구조체는 스택에 독립된 공간으로 할당되므로 스레드로부터 안전하다
클래스는 힙에 공유된 공간으로 할당되므로 스레드로부터 위험하다.
구조체는 상속이 불가능하고 클래스는 가능
구조체는 타입 캐스팅이 불가능 클래스는 타입 캐스팅이 가능
deinit은 클래스에서만 사용 가능하다
공통점은
프로퍼티와 메서드를 지원한다. 생성자로 초기상태를 정의할 수 있다. 프로토콜을 채택할 수 있다.
값타입은 왜 상속할 수 없는가?
구조체와 클래스의 사용
값들의 캡슐화
캡슐화된 값을 복사할 때
프로퍼티가 모두 값타입일때
상속이 필요없을 때 구조체 사용하고 나머진 클래스 사용
데이터 변경등의 이벤트를 관찰하고 싶을 땐 고유성이 있어야하므로 그럴땐 클래스 사용
레퍼런스타입의 저장프로퍼티를 사용할 경우나 크기가 커질 경우 클래스를 사용한다.
객체지향 프로그래밍의 특징은?
상위의 것을 하위가 물려받을 수 있는 상속
다형성이란 한 객체가 다른 형태로 재구성되는 것이다.
같은 것을 상속받아도 다르게 사용할 수 있다는 것인데, 오버로딩과 오버라이딩이 대표적인 예시이다.
오버로딩이란 이름이 같아도 파라미터나 리턴값을 다르게 하여 함수를 재정의할 수 있다는 것이다.
오버라이딩이란 부모클래스의 프로퍼티, 메서드를 재정의하여 사용할 수 있다는 것이다.
SOLID는 뭐야?
single: 하나의 클래스는 하나의 책임만
open/close: 클래스는 확장에는 열려있고 수정에는 닫혀있어야함
리스코프: 서브클래스는 부모클래스로 교체할 수 있어야함
interface: 인터페이스 분리해야함
dependency: 구현 클래스 말고 인터페이스 참조해서 써라
함수형 프로그래밍이란?
- 객체가 런타임에도 생성 가능하다.
- 객체를 인자 값으로 전달할 수 있어야 한다.
- 객체를 반환 값으로 사용할 수 있어야 한다.
- 데이터 구조 안에 저장할 수 있어야 한다.
함수를 변수나 상수처럼 사용할 수 있다.
클로저와 고차함수가 있다.
스위프트에서 고차함수란?
다른 함수를 매개변수로 받거나 함수를 반환하는 함수를 의미한다.
함수를 하나의 값으로 다룬다.
맵: 배열이나 컬렉션의 각 요소를 변환하여 새로운 배열을 생성한다.(글자수로 바꿔라)
필터: 말그대로 필터(세글자 이상인 친구)
reduce: 다 더해주거나 다 빼주거나 통합시켜주는거
compactMap: 옵셔널 값을 추출하고 nil값을 없앤다.
flatMap: 배열이나 컬렉션의 이차원배열을 일차원배열로
foreach: 각 요소들 순환해주는 거
클로저는 뭐고 왜사용함?
함수의 일급객체 특성을 이용하여 코드 블록을 변수나 상수에 저장하고 전달할 수 있는 개념이다.
외부에 있는 변수나 상수를 레퍼런스 타입으로 캡처하여 사용할 수 있다.
비동기 작업이 완료됐을 때 호출되는 콜백 함수로 사용한다.
프로토콜과 인터페이스 차이?
인터페이스는 기본값설정 가능 프로토콜은 불가능
인터페이스는 모두 구현해야함 프로토콜은 선택하여 구현해도됨
메소드 스위즐링은 왜사용하나요?
런타임에 원하는 함수를 실행한다.
앱에 분석기능을 통합하기 위해
이미지 리스트의 성능을 향상시키는 법
-
이미지 크기 최적화: 불러올때 크기를 최적화하여 불러온다.
-
이미지 캐싱: 이미지를 한번 다운로드하면 메모리나 디스크에 캐싱한다. 킹피셔
-
비동기 이미지 로딩: 이미지 로딩은 GCD를 이용하여 스레드를 하나 더만들어 처리한다.
-
Lazy을 이용하여 초기 로딩시간을 줄인다.
-
CoreImage프레임워크로 GPU 가속을 이용한다.
1바이트란?
정보를 표현하는 최소 처리 단위로 8비트로 구성되어있습니다.
초기 컴퓨터에는 메모리와 CPU의 성능에 한계가 있었습니다.
8비트는 그 당시 한번에 표시할 최대 크기였으며 이 8비트면 로마자와 숫자는 충분히 표현할 수 있었습니다
8비트의 아스키코드를 이용하여 문자단위로 데이터를 처리했습니다.
이 단위가 표준이 되어 지금까지도 1바이트 단위로 정보를 표현하고 있습니다.
아스키코드는 왜 8비트인가요?
문자를 표현할 수 있는 7비트와 에러를 검출하는 한개의 패리티비트를 합쳐 8비트입니다.
7비트중 1의 개수가 홀수면 1, 짝수면 0인 규칙으로 수신측에서 잘 받았는지 확인할 수 있습니다.
48 65 97
아스키코드의 문제점은 뭔가요?
아스키의 A가 아메리칸인 것처럼 영어 알파벳만 존재하였습니다.
시간이 지나며 동아시아, 아랍등 다양한 나라에서 사용하며 그 문자들을 표현하면 깨지는 문제가 발생했다.
결국 16비트의 65536개가 있는 유니코드를 만들었습니다.
유니코드의 문제점은 뭔가요?
영어를 표현할 땐 1바이트, 한글은 2바이트로 읽을 때 몇바이트를 읽어야하는지에 대한 문제가 발생했습니다.
따라서 UTF-8, UTF-16같은 컴퓨터가 몇바이트씩 읽어야하는지 알려주는 인코딩 방식이 등장했다.
UTF-8은 뭔가요?
한글은 3바이트로 표현되며 첫번째 바이트의 상위비트를 보면된다.
보통 웹에서 채택하고 있는 인코딩 방식인데 한글이 깨지는 것은 이 인코딩 방식을 디코딩할 때 다른 포맷으로 해서그런다.
1바이트로 표현가능한 양의 정수만, 음의 정수 포함 등
양의 정수만 표현한건 Unsigned하다고 표현하며 0부터 255까지 입니다.
0000 0000 ~ 1111 1111
음의 정수를 포함하는 것는 Signed하다고 표현하며 -128부터 127까지 입니다.
1000 0000 ~ 0111 1111
unsigned int 의 경우 int 였으면 2 의 보수 표현을 통해 음수로 해석될 수를 그냥 양수라고 생각할 뿐이지요.
스택과 힙?
스택은 함수 호출과 로컬 변수등을 관리하는데 사용되는 메모리 영역입니다.
스택의 크기는 1메가바이트정도로 작으며 컴파일 타임에 어디에 얼마나 할당할지 정해진다.
힙은 동적으로 크기가 변할 수 있는 데이터와 객체를 관리하는데 사용되는 메모리 영역입니다.
런타임에 동적으로 변하며 다 사용했으면 해제를 해줘야 메모리 누수가 일어나지 않는다.
스택은 왜이렇게 작아?
함수 호출시마다 스택프레임이 생성되며 데이터가 저장된다. 작게 유지해야 생성과 삭제의 오버헤드가 일어나지 않는다.
가상 주소는 예약을 해놔야 합니다. 예전에 32비트 환경에서는 가상 메모리 주소를 4기가였어요. 거기서 사용자가 사용할 수 있는 것은 2기가였는데
이 2기가에서 스택이 1메가라면 2000개의 스레드를 만들수있어요 근데 100메가라면 20개밖에 못만들어요.
그래서 최대한 작게 만들어 메모리 관리를 용이하게 하고 성능을 높이고자 했습니다.
바이트 수를 지금까지 별 불편함이 없으니 사용하는 것처럼
메모리를 많이 잡아먹을 것 같은 데이터는 힙에 할당하면 되었기에 스택도 그 관행이 내려오고 있다고 알고 있습니다.
배열과 링크드 리스트의 차이
배열은 연속된 메모리 공간에 정적으로 존재하고
링크드리스트는 메모리 상에서 떨어져 있는 데이터들이 앞의 데이터와 뒤의 데이터를 기억하는 형태로 동적으로 존재한다.
시간 복잡도란 ?
알고리즘의 효율성을 판단하기 위한 지표로서, 프로그램 수행에 걸리는 절대적 시간이 아닌,
산술, 대입, 비교, 이동이 몇 번 이루어지는가에 대한 것을 상대적 지표로 나타낸 것이다.
이것은 보통 최악의 경우를 표기하는 빅오표기법을 따른다.
O(1) < O(log n) < O(n) < O(nlogn) < O(n^2) < O(2^n) < O(n!) 연산 이진트리 반복문 퀵소트 힙소트 삽입,선택,버블소트 피보나치
이진탐색트리란? 최악의 경우는 언제?
트리가 한쪽으로 치우쳐진 상태이다. 123456을 차례대로 삽입하면 최악 o(n)이다.
이것을 해결하기 위해 AVL트리나 B트리를 사용한다.
b트리란?
하나의 노드가 가질 수 있는 자식노드의 최대 숫자가 2이상인 트리이다.
최악의 경우도 o(logn)을 보장한다.
b+트리란?
b트리의 변형으로
모든 데이터를 리스트 형태로 리프노드에 저장한 상태로 탐색에 장점이 있다.
db 인덱스에서 왜 b+트리를 사용?
우선 균형이진트리이 때문에 o(nlogn)의 성능을 보장한다는 장점이있다.
데이터베이스는 크기가 크므로 디스크에 저장되어있는데요. 디스크 IO는 너무 느리다.
한 노드에 여러 키들이 들어있으므로 디스크 접근의 최소화를 할 수 있다.
그리고 디스크에서 데이터를 가져올땐 페이지 단위로 일정 단위로 가져온다.
근접해있는 키들이 한 노드에 있으므로 페이지 스왑의 효율을 높일 수 있다.
AVL 트리란?
균형이진트리를 보완하기 위한 트리로 좌측 노드의 높이와 오른쪽 노드의 높이의 차이가 -1, 0, 1을 보장한다.
AVL 트리는 탐색 성능이 중요할 때 사용. 삽입 삭제시엔 로테이트 연산을 해야하므로 더많은 연산을 해야할수도?
RB트리란?
완전이진트리이지만 모든 노드에 레드 혹은 블랙의 특성을 가지고 이 색들을 이용하여 균형을 체크한다.
1px 는 몇 바이트
1픽셀은 크기를 나타내는 개념이 아니라 하나의 빛 점을 나타내는 개념으로 딱 몇바이트라 떨어지진않습니다.
기기별, OS별, 이미지별로 다른데
대신 어떤 채널을 사용하는 이미지냐에 따라 달라지는데
흰색 검은색으로만 표현한 바이너리 이미지는 1비트입니다.
흰색부터 검은색까지의 밝기를 표현한 그레이스케일 이미지는 1바이트입니다.
레드 그린 블루의 색 조합으로 컬러를 표현하는 rgb 이미지는 각 1바이트씩 하여 3바이트입니다.
16:9
hd = 1280 * 720
fhd = 1920 * 1080
qhd = 2560 * 1440
4k = 3840 * 2160
아이폰 해상도는?
19.5:9
2532 x 1170
맥북의 해상도는?
16: 10
2880 × 1800
1920 1200
1680 1050
1440 900
아이패드의 해상도는?
4: 3
2048 * 2732
1000 * 1000의 jpg파일의 크기? 3메가바이트
1kb == 1024 1000개의 바이트
1mb == 1000000 100만개의 바이트
1gb == 1000000000 10억개의 바이트
아이폰 카메라의 화소는?
12MP
1200만 픽셀
12메가는 몇개야?
공유기의 원리는?
공유기는 글로벌 ip 주소를 여러대의 호스트가 사용할 수 있게 해주는 L3 라우터이다.
공유기는 사설 IP 주소와 글로벌 IP 주소를 사용하는데 그 구분을 해주는 장치이다.
공유기 내부에는 NAT-Table이라는 자료구조를 가지고 있는데
호스트가 날린 패킷을 분석하여 로컬IP와 도착지의IP주소, 포트등의 정보를 남긴다.
Enum
swift의 특별한점?
스트링이아님 따라서 string 프로토콜을 따르고 rawvalue사용하면됨
CaseIterable프로토콜을 사용하면 allcases를 이용하여 array처럼 사용가능
포인터에 대해서 설명해주실래요?
포인터는 메모리 주소를 나타내는 값 또는 개념을 의미합니다.
애스터리스크를 붙여 메모리 주소를 가리키는 변수인 포인터 변수를 만들 수 있습니다.
포인터를 사용하면 메모리 위치에 직접 접근하고 조작할 수 있습니다.
이때 말하는 메모리는 보통 힙메모리이며 얼만큼 할당할 지를 직접계산하고 해제를 해줘야합니다.
맥os와 윈도우 차이점이 뭔가요?
유닉스 기반이기에 쉘프롬프트로 명령을 실행하고 개발도구를 사용할 수 있다.
macOS는 스위프트와 Xcode를 이용하여 주로 iOS 및 macOS 애플리케이션 개발에 적합한 환경을 제공합니다.
윈도우는 C샵과 비쥬얼스튜디오를 이용하여 Windows 애플리케이션 개발에 적합한 환경을 제공한다.
맥은 Apple이 제공하는 하드웨어와 조합되어 사용되므로 하드웨어 및 소프트웨어의 성능을 최대로 활용할 수 있다.
윈도우는 다양한 하드웨어 제조사의 제품에 설치되며 범용성이 좋다는 특징이있다.
프로그래밍 언어와 운영체제를 활용하여 어떤 프로젝트나 작업을 해보셨나요?
C언어를 이용하여 쉘 프로그램을 만들었습니다.
스위프트와 UIKit, SwiftUI를 이용한 iOS 앱을 만들어본 경험이 있습니다.
자주 사용해보신 프레임워크나 라이브러리는 무엇인가요?
Standard C Library: C 언어의 기본 라이브러리로, C 언어의 기본 함수들을 제공합니다.
UIKit: iOS 애플리케이션의 사용자 인터페이스(UI)를 구축하는 데 사용되는 프레임워크입니다.
버튼, 레이블, 뷰 컨트롤러 등 UI 구성 요소를 제공합니다.
Core Data: 데이터베이스와 관련된 작업을 쉽게 수행할 수 있도록 도와주는 프레임워크로
데이터를 관리하고 저장하는 기능을 제공합니다.
프레임워크와 라이브러리 차이는 뭐야
프레임워크는 애플리케이션의 구조와 흐름을 제어하기 위한 규칙과 틀을 제공하고
라이브러리는 개발자가 필요한 기능을 호출하여 사용할 수 있는 도구들을 제공합니다.
iOS에서는 UIKit, SwiftUI가 프레임워크에 해당하고, LottieUI, 킹피셔가 라이브러리에 해당된다.
왜 크로스플랫폼이 아니라 네이티브를 선택하셨나요?
크로스 플랫폼은 어쩔 수 없이 네이티브에 의존적이라는 생각 때문입니다.
네이티브에서 새롭게 업데이트한 내용을 크로스플랫폼에서 지원해줄 때까지 활용하기 어렵습니다.
또 크로스플랫폼에 버그가 있다면 해결해주기 전까지 디버깅이 까다롭습니다.
또 애플이 iOS개발 플랫폼을 지원중단할 확률은 거의 없지만 리액트네이티브처럼 개발사에서 지원중단을 할수도 있으므로
개발사에 너무 의존적이라는 생각을 했습니다.
또한 저는 1인개발이나 창업이 목표가 아니라 취업이 목표로 그렇다면 많은 회사에서 사용하는 스킬을 훈련하는것이
저라는 상품을 홍보하기에 용이하다고 생각했습니다.
UIKit과 SwiftUI의 장단점을 설명해주세요
UIKit은 오랜 기간동안 iOS 개발에 사용되어왔기 때문에 안정성이 높습니다.
다양한 기능과 컴포넌트를 제공하며, 많은 개발자들이 익숙합니다.
모든 iOS 버전에서 호환성을 유지할 수 있습니다.
복잡성: UIKit은 복잡한 코드와 중복된 작업을 유발할 수 있습니다.
인터페이스 구축에 많은 코드를 작성해야 하며, Auto Layout 등의 레이아웃 시스템도 학습이 필요합니다.
SwiftUI는 선언적 구문을 사용하여 UI를 설계하므로, 코드의 가독성이 높아지고 복잡성이 감소합니다.
SwiftUI는 적은 양의 코드로도 복잡한 UI를 구현할 수 있습니다.
코드의 양을 줄이면서도 같은 기능을 구현하는 데 더 적은 시간이 소요됩니다.
SwiftUI는 프리뷰 기능을 제공하여 코드 작성 중에 실시간으로 UI를 확인할 수 있습니다.
SwiftUI는 iOS, macOS, watchOS, tvOS에 모두 적용할 수 있는 다중 플랫폼 프레임워크입니다.
애플에서 매년 스유의 신기능을 업데이트 해주고 있습니다. 비전 OS라던가 위젯같은 신기능들은 스유로만 개발가능합니다.
스유는 신기술로 아직 참고자료가 많지 않고 미지원 기능들이 있습니다.
iOS13이후만 지원하므로 기기별 호환성에 문제가 있습니다.
그러면 그 문제를 해결하기 위해 한것이 있나요??
빵딜
브라우저에 네이버를 치면 접속되기까지의 과정
WWW.naver.com은 도메인네임으로 도착지의 IP주소를 알아야합니다.
컴퓨터마다 있는 hostfile을 찾습니다. DNS 질의를 하고난 캐시결과를 보고 존재한다면 그 주소를 사용한다.
없다면 DNS 서버에 질의를 하는데 만약 디바이스가 공유기 설정이 되어있다면 공유기에게 물어볼때도 잇습니다.
만약 DNS 설정을 안했다면 ISP가 정해준 DNS 설정을 사용하는데 DNS 서버에 직접 질의를 할 수 도 있습니다.
이때 네이버같이 큰 회사들은 CDN서비스를 제공하는데 아카마이라는 회사를 주로 이용합니다.
CND이란 컨텐츠딜리버리네트웍서비스의 줄임말로 DNS역할을 해줄 수 있는 시스템을 하나 만듭니다.
DNS가 알려주는 것이 IP 주소인데 이 주소는 클라이언트가 접속하기 가장 원활하고 응답성이 높은 주소로 알려준다.
접속자의 IP의 주소를 가지고 CDN이 클라이언트의 위치를 파악한다. 네이버의 판교서버, 강릉서버등 어디에 접근해야 가장 빠른주소를 알려준다.
이런식으로 획득한 IP주소를 기반으로 TCP 연결을 합니다.
브라우저의 통신은 HTTP기반인데 이 프로토콜은 TCP 연결을 기반으로 한것이기때문입니다.
이 TCP연결이 성공하면 HTTP 리퀘스트를 보낸다. 그에 따른 응답을 서버에서 보낸다.
아카마이? CDN, GSLB.
DNS에서 알려주는 실제 IP주소는 사용자의 위치와 환경에따라 달라질 수 있습니다.
브라우저에 네이버를 입력을 하고 웹서버에서 가져오는 데이터는 HTML CSS JS 이미지이다.
브라우저는 렌더링 엔진, JS 엔진, 로컬 저장소를 가지고 있습니다.
브라우저는 문서뷰어입니다. 가져온 HTML 파일을 파싱을 해서 DOM트리를 만들고 그것을 기반으로렌더트리를 만들고 렌더링을 한다.
TCP연결을 하면 맨 처음으로 HTML을 가져온다. 이것을 파싱해서 DOM트리를 만든다.
그 다음 CSS파일을 가져오는데 이것과 DOM 트리를 기반으로 렌더트리를 만들고 렌더링을 한다.
웹의 클라이언트가 인터넷이라는 공개 네트워크에 접속하고 웹서버를 만나게 된다.
TCP 연결을 기반으로 연결은 상태의 개념을 포함하는데 HTTP 통신을 하는데 이 프로토콜은 Stateless이다.
이때 http.request를 클라이언트에서 보낸다. request에는 GET이나 POST같은 요청을 주는데
그에 따른 응답을 웹서버에서 준다. HTML문서를 보내주는데 브라우저는 파싱을 한다. 구문분석된 결과를 가지고
자료구조를 생성하는데 DOM트리라는 비선형 자료구조를 만든다.
그 다음 가져온 CSS파일과 돔트리를 가지고 렌더링을 한다.
공유가기 DNS 포워딩 기능을 제공하는데 공유기가 응답을 하지 않는다면 ISP가 제공하는 DNS를 물어본다.
한번 접속한 IP주소를 DNS 캐시에 저장을 한다
DNS란 문자열주소를 IP 주소로 알려주는 전화번호부같은 느낌
연결은 3Way Handshake을 통해 체크한다.
서버에 소켓이 하나 열려있는데 소켓의 본질은 파일이다.
서버는 프로세스인데 파일에 대해 RWX를 할 수 있는데 소켓통신에 실행은 없다.
읽는다라는 개념은 Recieve라고 하고 쓴다라는 개념은 Send를한다라고 부른다.
수신측의 윈도우사이즈
로그인 성공과 같이 연결중에 동적으로 생성될 수 있다.
HTML이 동적으로 생성이 될 수 있는데 이 동적인 동작을 처리할 수 있는 것이 자바스크립트 엔진이고
-
브라우저 캐시 확인
-
OS DNS 캐시 확인
-
HostFile 확인
-
공유기 혹은 라우터 DNS 캐시 확인
-
isp 캐시 확인
-
없다면 DNS 서버에게 쿼리
-
DNS 서버 캐시를 확인
-
없다면 루트 DNS에게 .com을 관리하는 DNS 쿼리
-
루트 DNS가 알려준 탑레벨 DNS에게 naver.com을 관리하는 애를 쿼리
-
탑레벨 DNS가 알려준 세컨레벨 DNS에게 naver.com의 ip주소를 획득
-
DNS는 클라이언트에게 획득한 Ip 주소를 알려줌
-
브라우저는 획득한 서버 Ip 주소에 tcp 연결을 함
-
웹서버는 도착한 웹페이지 URL 정보에 해당하는 데이터를 검색함.
-
브라우저는 html의 http.request.get 요청을 보냄
-
정적인 데이터인 html,css,이미지는 아파치와 같은 친구가 보내줌
-
동적인 데이터들은 톰캣과 같은 WAS에 처리를 요청한다. 이친구들은 데이터베이스와 통신하여 처리
-
서버는 그에 따른 html 파일을 보냄
-
브라우저는 html파일을 dom트리라는 비선형 자료구조로 파싱
-
브라우저는 css 파일을 요청함
-
서버는 그에 따른 css 파일을 보냄
-
돔트리와 css를 기반으로 렌더트리를 만듬
-
브라우저에 렌더링
어떤 개발 환경이나 도구를 좋아하시나요?
Xcode 코드편집기, 디버거, Instrucments, 인터페이스 빌더, 프리뷰 및 시뮬레이터, 버전관리
형상관리 툴인 Git을 사용하는 것도 좋아합니다.
좋아하는 IDE에서 자주 사용 하는 기능들 또는 특별히 좋은 기능들에 대해서 얘기해 보라.
동영상 압축 원리
동영상이란 여러사진을 빠르게 보여주는 것
MPEG
이미지 압축 방식을 사진 하나하나 압축한다.
동영상에는 대부분 똑같은 픽셀이고 특정부분만 달라지는데 16*16 블록으로 쪼개서 비교하면서 달라진 부분만 저장한 방식을 사용
중간중간 기준이 되는 프레임을 넣고 블록단위로 비교하면서 달라진 부분만 저장
그리고 코덱으로 해독을 한다.
100기가 파일 복사하는데 얼마나 걸리나요
작은 파일의 경우 파일 시스템의 입출력 오버헤드로 인해 더 많은 시간이 소요
hdd - 16분정도
ssd - 3분정도
ssd는 초당 500메가정도
hdd는 초당 100메가정도
디스크와 메모리의 속도 차이는 어느 정도이고 그 원인은 무엇인가?
메모리는 나노세크단위이고 디스크는 밀리세크단위이다.
밀리초는 1000분의 1초 0이 3개
마이크로초는 100만분의 1초 0이 6개
나노초는 10억분의 1초 0이 9개
전기 vs 자기 = 입출력 시간, 랜덤액세스 vs 순차접근 = 액세스 시간
hdd와 ssd의 속도차이는 왜날까?
기계적 부품의 유무
데이터 접근 방식
접근 시간
기계적 vs 전기 신호
카피를 동시에 여러 개 돌리면 더 빨라질까?
cpu와 디스크 자원을 최대한 사용할 수 있다.
리소스들이 경쟁상태에 놓여 성능저하, 디ㅅ크 헤더 이동, cpu 스케쥴링
만약 1메가바이트짜리 1만 개라면 더 빠른가?
단일 크기의 10기가 하나를 복사하는게 더빠름
파일마다 디스크 헤더가 움직임
파일을 열고 닫는 작업 파일시스템에 메타데이터를 기록하는 작업등 오버헤드가 발생할 수 있다.
병렬작업은 리소스가 경쟁상태에 놓여 느려질수도 잇음
디스크에 데이터를 저장하는 방식
파일 시스템을 이용한다
파일시스템은 데이터를 조직화하고 저장하는 방식을 정의하고 파일 생성, 관리, 읽기쓰기실행을 하게해줌
window = FAT, mac = Apple File System, linux = EXT
하드디스크의 자성 물질로 덮인 플래터를 회전 시키고
그 위에 헤드를 접근시켜 플래터 표면을 자기 배열을 변경하는 방식으로 데이터를 읽거나 쓴다.
내부의 자석들이 정렬되어있으면 1 정렬되어있지 않으면 0으로 표현한다.
ssd 는 반도체의 전기적 신호를 기반으로 동작한다. 전기신호가 전해지면 메모리 셀에 전자가 저장되고 이를 바탕으로 1과 0을 표현
셀은 낸드플래시에 정보를 저장할 수 있는 단위
ssd보다 램이 빠른이유
램은 cpu에 직접적으로 연결되어 빠른 데이터 접근 가능
랜덤 액세스 반도체 vs nand 플래시 메모리
랜던액세스 vs 순차접근
설계
한국의 gmail 사용자가 미국의 gmail 사용자에게 메일을 보냈다. 얼마 만에 도착 할까? 어떤 과정을 거칠까?
smtp(simple message transfer protocol)
abc@xxx.com 도메인 네임
메일도 도메인 주소를 가지고 있다. 따라서 dns를 이용하여 수신메일서버의 ip를 확인
http 대신 smtp를 연다.
수신할 때는 pop3 프로토콜을 이용
이메일을 전송하면 각 도메인의 SMTP 서버에 도달(Gmail, naver SMTP 서버)
메일 큐라는 공간에 저장
서버는 @를 기준으로 도메인네임과 아이디를 나누고 도메인 네임을 DNS에 질의
수신측 SMTP 서버에 도달 후 사용자별로 나눠 저장
POP3 혹은 IMAP 프로토콜을 이용하여 이메일 수신
IMAP은 서버에 저장된 정보를 가져와서 내용을 보여주고 변경 사항을 동기화
POP3는 우리가 사용하는 기기에 정보를 저장
디지털 시계 프로그램을 만들어야 한다. 초 단위로 표시해야 한다. 어떻게 작성할 것인가?
블로킹 상태, sleep함수는 실행중인 스레드를 놀게함 리소스낭비
timer, runloop는 뭔가
RunLoop 객체는 소켓, 파일, 키보드 마우스 등의 입력 소스를 처리하는 이벤트 처리 루프로,
쓰레드가 일해야 할 때는 일하고, 일이 없으면 쉬도록 하는 목적으로 고안되었다
런루프는 Thread의 외부 입력 소스 및 Timer를 처리할 때 사용
런루프는 current로 접근할 때 생성됨
전임자가 만든 어떤 프로그램이 있는데 생각보다 너무 느리게 동작하는 것 같다.
프로그램의 어느 부분이 성능 문제를 일으키는지 프로파일링 한다.
메모리 관리, 파일, 네트워크 IO를 최소화, 외부리소스 확인
DNS의 역할이 무엇인가요?
도메인명에 대한 호스트 정보를 제공해줍니다.
기본적으로 UDP상에서 동작합니다.
인터넷에서 사용되는 라우팅 알고리즘은 뭐야
거리벡터 : 특정 라우터까지 가는 거리를 계산해서 저장
링크상태 : 인접 라우터까지의 비용을 모두 저장
그래픽작업을 cpu에서 하지 않는 이유는
cpu는 순차처리에 최적화. 그래픽작업은 대량의 데이터를 동시에 처리
연산작업을 gpu에서 하지 않는 이유는?
데이터 의존성, 경쟁조건, 순차적처리
tcp udp 차이
IP가 데이터의 전송을 처리한다면 TCP는 패킷 추적 및 관리를 하게 된다
흐름 제어: 보내는 측과 받는 측의 데이터 처리속도 차이를 조절해주는 것 ack
혼잡 제어: 네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지하는 것 시퀀스넘버
3way, 4way 핸드쉐이크
객체지향 프로그래밍
함수형 프로그래밍
자료처리를 수학적 함수의 계산으로 취급/ 순수함수를 조합하고 프로그램을 만드는 방식
순수함수는 동일한 input에 대해 항상 같은 output을 내고 함수 내부에서 함수 외부의 상태에 영향을 끼치지 않는 함수
순수함수의 장점 thread safe하다. 병렬처리 개굿
함수를 1급객체로 취급
불변성 = 사용하고 잇는 모든 데이터가 변경 불가능
고차함수 = 함수를 다루는 함수
클로져
lazy
swiftui 오토레이아웃
Stack, padding, spacer, GeometryReader
iOS
앱 퍼포먼스 향상
assign vs weak Bounds 와 Frame 의 차이점을 설명하시오. AppDelegate 에서 앱의 상태 변화에 따라 호출되는 함수에 대해 명확히 설명할 수 있나요 ? 스레드(thread) 와 프로세스(Process) 의 차이점 ? / Program vs Process 객체 지향 프로그래밍(OOP) 의 정의와 특징
‘Call by value’ vs ‘Call by reference’
동기 vs 비동기
메모리 구조 와 스택
링크드리스트(Linked List) 란?
64비트와 32비트의 차이
Mutable 객체 vs Immutable 객체.
샌드박스란 무엇이고 왜 샌드박스를 사용하는지?
Delegate / Notification 의 차이와 활용도
push 서비스 등록시 절차과정
카테고리 확장과 / 서브 클래싱 이 둘의 차이와 각각의 활용
Swift 와 Objective - c 를 동일한 코드를 구현할때 서로간에 장점과 단점은?
NSArray, NSDictionary, NSSet의 쓰임
Table View 혹은 Collection View 에서 꼭 필요한 Delegate 와 Function 은 무엇이고 어떤 역할을 하나요 ?
ㄱ. 끝이 ‘-DataSource’ 나 ‘-Delegate’ 로 끝나는 함수들이 꼭 필요한 함수이다. DataSource 의 경우 테이블 뷰나 컬렉션 뷰에 데이터를 제공하는 역할을 하고, Delegate 의 경우에는 이벤트가 발생했을 경우 처리할 메서드를 제공한다.
Instrument 를 활용하여 앱의 Memory 사용량을 확인하고 리팩토링해본 경험이 있나요?
이미지를 Memory-Cache 와 Disk-Cache 를 이용해 보았다면, 설명해볼 수 있나요 ?
GCD(Grand Central Dispatch)의 개념을 설명할 수 있나요 ?
ㄱ. 초보자를 위한 Grand Central Dispatch
(Thread 관련) 화면이 멈추지 않게 하려면 어떤 스레드를 건드리지 말아야 하나요 ? ㄱ. Main Thread 에서 Sync 를 사용하면 안된다.
Background Task 를 이용해 백그라운드에서 동작하는 작업을 설명할 수 있나요 ?
CustomScheme 를 이용해 딥링크 기능 구현을 설명할 수 있나요 ?
Universal Link를 사용해 웹에서 앱을 연동하는 것을 설명할 수 있나요 ?
Google Analytics, Tune, Fabric등 모바일 애널리틱스 툴을 연동한 경험이 있나요 ?
Push 서비스를 구현한 경험이 있나요 ?
UICollectionView와 UITableView의 스크롤 속도를 최적화를 위해 어떠한 방법을 사용해보셨나요?
선호하는 UI 구현 방식에 대해 설명해주세요.
iPhone의 다양한 해상도를 지원하기 위해 어떤 방식을 활용하고 있는지, 다양한 해상도를 지원하기 위해 특별히 고려한 것들이 있는지 설명해주세요.
OpenURLScheme 을 사용해 보았나요 ?
상단 상태바의 색을 변경하는 방법은 ? 실제 디바이스가 없을 경우 개발 환경에서 할 수 있는 것과 없는 것을 설명하시오. 앱의 콘텐츠나 데이터 자체를 저장/보관하는 특별한 객체를 무엇이라고 하는가? 앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체를 무엇이라고 하는가? App thinning에 대해서 설명하시오. 앱이 시작할 때 main.c 에 있는 UIApplicationMain 함수에 의해서 생성되는 객체는 무엇인가? @Main에 대해서 설명하시오. 앱이 foreground에 있을 때와 background에 있을 때 어떤 제약사항이 있나요? 상태 변화에 따라 다른 동작을 처리하기 위한 앱델리게이트 메서드들을 설명하시오. 앱이 In-Active 상태가 되는 시나리오를 설명하시오. scene delegate에 대해 설명하시오. UIApplication 객체의 컨트롤러 역할은 어디에 구현해야 하는가? App의 Not running, Inactive, Active, Background, Suspended에 대해 설명하시오. NSOperationQueue 와 GCD Queue 의 차이점을 설명하시오. GCD API 동작 방식과 필요성에 대해 설명하시오. Global DispatchQueue 의 Qos 에는 어떤 종류가 있는지, 각각 어떤 의미인지 설명하시오. iOS 앱을 만들고, User Interface를 구성하는 데 필수적인 프레임워크 이름은 무엇인가? Foundation Kit은 무엇이고 포함되어 있는 클래스들은 어떤 것이 있는지 설명하시오. Delegate란 무엇인지 설명하고, retain 되는지 안되는지 그 이유를 함께 설명하시오. NotificationCenter 동작 방식과 활용 방안에 대해 설명하시오. UIKit 클래스들을 다룰 때 꼭 처리해야하는 애플리케이션 쓰레드 이름은 무엇인가? App Bundle의 구조와 역할에 대해 설명하시오. 모든 View Controller 객체의 상위 클래스는 무엇이고 그 역할은 무엇인가? 자신만의 Custom View를 만들려면 어떻게 해야하는지 설명하시오. View 객체에 대해 설명하시오. UIView 에서 Layer 객체는 무엇이고 어떤 역할을 담당하는지 설명하시오. iOS에서 뷰(View)와 레이어(Layer)의 개념과 차이점에 대해 설명해보세요. UIWindow 객체의 역할은 무엇인가? UINavigationController 의 역할이 무엇인지 설명하시오. TableView를 동작 방식과 화면에 Cell을 출력하기 위해 최소한 구현해야 하는 DataSource 메서드를 설명하시오. 하나의 View Controller 코드에서 여러 TableView Controller 역할을 해야 할 경우 어떻게 구분해서 구현해야 하는지 설명하시오. setNeedsLayout와 setNeedsDisplay의 차이에 대해 설명하시오. stackView의 장점과 단점에 대해서 설명하시오. NSCache와 딕셔너리로 캐시를 구성했을때의 차이를 설명하시오. URLSession에 대해서 설명하시오. prepareForReuse에 대해서 설명하시오. 다크모드를 지원하는 방법에 대해 설명하시오. ViewController의 생명주기를 설명하시오. TableView와 CollectionView의 차이점을 설명하시오. Dynamic Library와 Static Library의 차이점에 대해 설명해보세요. Diffable Datasource Frame vs Bounds Compositional Layout Multiple Gesture Recognizer ViewController 라이프사이클 이해 및 활용 오토레이아웃을 코드로 작성하는 방법 Left, Right Constraint vs Leading, Trailing Constraint Safe Area 스토리보드의 장단점 Responder Chain First Responder UI를 메인스레드에서 다루는 이유 View Drawing Cycle setNeedsDisplay, setNeedsLayout UITableView 기초부터 다시 살펴보기 dequeueReusableCell (withIdentifier:for:) vs (withIdentifier:)
Autolayout
오토레이아웃을 코드로 작성하는 방법은 무엇인가? (3가지) hugging, resistance에 대해서 설명하시오. Intrinsic Size에 대해서 설명하시오. 스토리보드를 이용했을때의 장단점을 설명하시오. Safearea에 대해서 설명하시오. Left Constraint 와 Leading Constraint 의 차이점을 설명하시오. Auto Layout과 Frame-based Layout의 차이점은 무엇인가요? 성능 향상을 위해 어떤 디버깅 도구를 사용할 수 있나요? 각각의 디버깅 도구는 어떤 상황에서 사용하는 것이 좋나요?
Swift
클로저(Closure) AutoLayout IBDesignable & IBInspectable Swift vs Objective-C Cocoapods ARC vs non-ARC / (ARC 관련) Strong, Weak, Unowned 의 개념 ARC와 Block, GCD 와 연관해서 설명해보세요 Static 키워드 Overloading vs Overriding Access Control 의 종류와 특징 Delegate 와 Protocol 의 차이는 무엇일까요 ? Rxswift 란 무엇일까요 ? HIG(Human Interface Guideline) 을 알고 있나요 ? 옵셔널(Optional) 의 개념에 대해 설명할 수 있나요 ? struct와 class와 enum의 차이를 설명하시오. class의 성능을 향상 시킬수 있는 방법들을 나열해보시오. Copy On Write는 어떤 방식으로 동작하는지 설명하시오. Convenience init에 대해 설명하시오. AnyObject에 대해 설명하시오. Optional 이란 무엇인지 설명하시오. Struct 가 무엇이고 어떻게 사용하는지 설명하시오. Subscripts에 대해 설명하시오. String은 왜 subscript로 접근이 안되는지 설명하시오. instance 메서드와 class 메서드의 차이점을 설명하시오. class 메서드와 static 메서드의 차이점을 설명하시오. Delegate 패턴을 활용하는 경우를 예를 들어 설명하시오. Singleton 패턴을 활용하는 경우를 예를 들어 설명하시오. KVO 동작 방식에 대해 설명하시오. Delegates와 Notification 방식의 차이점에 대해 설명하시오. 멀티 쓰레드로 동작하는 앱을 작성하고 싶을 때 고려할 수 있는 방식들을 설명하시오. MVC 구조에 대해 블록 그림을 그리고, 각 역할과 흐름을 설명하시오. 프로토콜이란 무엇인지 설명하시오. Protocol Oriented Programming과 Object Oriented Programming의 차이점을 설명하시오. Hashable이 무엇이고, Equatable을 왜 상속해야 하는지 설명하시오. mutating 키워드에 대해 설명하시오. 탈출 클로저에 대하여 설명하시오. Extension에 대해 설명하시오. Extension 내부에서 함수를 override할 수 있는지 설명하시오. 접근 제어자의 종류엔 어떤게 있는지 설명하시오. defer란 무엇인지 설명하시오. defer가 호출되는 순서는 어떻게 되고, defer가 호출되지 않는 경우를 설명하시오. property wrapper에 대해서 설명하시오. Generic에 대해 설명하시오. some 키워드에 대해 설명하시오. Result타입에 대해 설명하시오. Codable에 대하여 설명하시오. Closure에 대하여 설명하시오. Closure와 함수와의 관계에 대해 설명하시오. Optional Chaining과 nil-coalescing operator(??)의 차이점과 사용 시 주의사항은 무엇인가요? Swift에서 Async/Await 기능이 도입되기 전에, 비동기(Asynchronous) 작업을 처리하는 방법에는 어떤 것들이 있나요? 타입 변환(Type Casting)과 다형성(Polymorphism)에 대해 설명해보세요. Swift에서 타입 안전성(type safety)은 어떤 방식으로 보장되나요? Struct와 Class, Enum의 차이점 ARC 메모리 관리 방식 strong, weak, unowned Foundation Generic Codable Protocol Dynamic Dispatch UserDefaults Codable vs NSCoding 문자열 처리 NSCache vs NSDictionary KVC(Key-Value Coding) KVO(Key-Value Observing) async await Task Actor defer Convinience init Escaping Closure NotificationCenter sort의 내부구현 Localizing Method Swizzling autoreleasepool
ARC
ARC란 무엇인지 설명하시오. Retain Count 방식에 대해 설명하시오. Strong 과 Weak 참조 방식에 대해 설명하시오. 순환 참조에 대하여 설명하시오. 강한 순환 참조 (Strong Reference Cycle) 는 어떤 경우에 발생하는지 설명하시오. Functional Programming
순수함수란 무엇인지 설명하시오. 함수형 프로그래밍이 무엇인지 설명하시오. 고차 함수가 무엇인지 설명하시오. Swift Standard Library의 map, filter, reduce, compactMap, flatMap에 대하여 설명하시오. Either type이란? Architecture
MVVM, MVI, Ribs, VIP 등 자신이 알고있는 아키텍쳐를 설명하시오.
의존성 주입에 대하여 설명하시오.
SwiftUI
@State에 대해서 설명하시오.
Combine
PassthroughSubject에 대해서 설명하시오 @Published에 대해서 설명하시오 AnyCancellable에 대해서 설명하시오 sink에 대해서 설명하시오 throttle과 debounce의 차이점을 설명하시오. Data를 Binding 하는 방법에 대해서 설명하시오. Optional
Rx
Reactive Programming이 무엇인지 설명하시오. RxSwift를 왜 사용하는지 설명하시오. RxSwift의 단점을 설명하시오. RxSwift에서 Hot Observable과 Cold Observable의 차이를 설명하시오. Subject의 종류와 차이점에 대해 설명하시오. Subject와 Driver의 차이를 설명하시오. Single, Completable, Maybe의 차이점에 대해 설명하고, 언제 적용하면 좋을지 설명하시오.
Advanced
method swizzling이 무엇이고, 어떨 때 사용하는지 설명하시오. NSCoder 클래스는 어떤 상황에서 어떻게 써야 하는지 설명하시오. Responder Chain 구조에 대해 설명하고, First Responder 역할에 대해 설명하시오. NSObject부터 UIButton 까지 상속 과정의 계층과 역할을 설명하시오. shallow copy와 deep copy의 차이점을 설명하시오. Push Notification 방식에 대해 설명하시오. Foundation 과 Core Foundation 프레임워크의 차이점을 설명하시오. NSURLConnection 에서 사용하는 Delegate 메서드들에 대해 설명하시오. Synchronous 방식과 Asynchronous 방식으로 URL Connection을 처리할 경우의 장단점을 비교하시오. Plist 파일 구조와 Plist 파일에 저장된 데이터를 다루기 적합한 클래스를 설명하시오. Core Data와 Sqlite 같은 데이터 베이스의 차이점을 설명하시오. JSON 데이터를 처리하는 방식과 파서, 객체 변환 방식에 대해 설명하시오. 웹 서버와 HTTP 연결을 사용해서 데이터를 주거나 받으려면 사용해야 하는 클래스와 동작을 설명하시오. Protocol에서는 왜 var만 되는지 설명하시요. DispatchQueue.main.sync를 사용하는 상황을 설명하시오. Run Loops에 대해 설명하시오. 객체지향
객체지향이 무엇인가요? 절차지향과의 차이점은 뭐죠? 객체지향 SOLID 원칙에 대해서 설명해 주세요. 객체지향 4가지 특징에 대해서 설명해 주세요. 대표적인 객체지향 언어에는 어떤 것들이 있나요? 함수형 프로그래밍에 대해서 설명해 주세요. 클래스, 객체, 인스턴스 차이에 대해서 설명해 주세요. 순수 추상 클래스와 인터페이스의 차이는 무엇인가요? 인터페이스는 주로 언제 사용하나요? 오버로딩과 오버라이딩의 차이는 무엇인가요? 업캐스팅과 다운캐스팅이란? 디자인 패턴
디자인 패턴이란 무엇인가요? 추상 팩토리 패턴이란? 싱글톤 패턴이란? 빌더 패턴이란? 팩토리 메소드 패턴이란? 옵저버 패턴이란? 어댑터 패턴이란? 뷰홀더 패턴이란?
자료구조
배열과 링크드 리스트의 차이점에 대해서 설명해 주세요. 스택과 큐에 대해서 설명해 주세요. 우선순위 큐에 대해서 설명해 주세요. 해시테이블에 대해서 설명해 주세요. 그래프와 트리의 차이점에 대해서 설명해 주세요. 최소 신장 트리에 대해서 설명해 주세요. 힙 자료구조에 대해 설명해 주세요. 힙의 삽입과 삭제는 어떻게 이루어지나요? 이진 탐색 트리에 대해 설명해 주세요. 포화(Perfect) 이진트리, 완전(Complete) 이진트리, 정(Full) 이진트리의 차이점에 대해 각각 설명해주세요. 레드 블랙 트리에 대해 설명해주세요. 레드 블랙 트리의 삽입과 삭제 과정에 대해서 말해보세요. AVL에 대해 설명해주세요. B-Tree와 B+Tree에 대해서 설명해 주세요. String / Long Data
String Comparison Complexity에서 시간 복잡도가 최악인 경우는? 발생할 확률은? String Comparison Complexity를 개선할 수 있는 방법은? (길이비교, 해시) substr(), length(), indexOf() 를 직접 구현해보자 비교기반 자료구조/탐색알고리즘에 적용하면 생기는 문제점과 해결책 (hash / graph) String Literal과 언어에서 String의 구현방법 Substring Problem의 종류와 원리를 설명하시오
al
시간복잡도
시간 복잡도 VS 공간 복잡도 시간 복잡도는 실제 수행 시간과 어떤 관계가 있는가? 시간복잡도가 작은 알고리즘은 무조건 빠른가? 최악의 복잡도는 나쁘지만 실제로는 자주 사용되는 알고리즘을 나열하시오 빅오 표기법에 대해서 설명해주세요
알고리즘
최장 증가 수열(LIS) 최소 공통 조상(LCA) 비트마스크(BitMask) Call by value, call by reference의 차이점을 설명하시오. DFS & BFS 크루스칼 알고리즘과 프림 알고리즘에 대해서 설명해 주세요. 다익스트라 알고리즘에 대해서 설명해 주세요. LinkedList vs ArrayList의 차이점에 대해 설명하시오 인접행렬과 인접리스트에 대해 설명하시오
정렬
54321 배열이 있을 때, 어떤 정렬을 사용하면 좋을까요? 랜덤으로 배치된 배열이 있을때, 어떤 정렬을 사용하면 좋을까요? 자릿수가 모두 같은 수가 담긴 배열이 있을 때, 어떤 정렬을 사용하면 좋을까요? 정렬을 하는 이유는 무엇인가요? 선택 정렬(Selection Sort) 삽입 정렬(Insertion Sort) 거품 정렬(Bubble Sort) 퀵 정렬(Quick Sort) 병합 정렬(Merge Sort) 힙 정렬(Heap Sort) 기수 정렬(Radix Sort) 계수 정렬(Count Sort) 이분 탐색(Binary Search) 언제 불안정정렬 쓰면 안될까? 언어 기본제공 정렬은 어떻게 구현되어 있을까?
Recursive Function / DnC / DP
Tail Recursion 분할정복에 대해 설명하고 그 예시를 드시오 Dynamic Programming가 무엇이고 왜 어떻게 사용하는가? Memoization 에 대해 설명하시오
NET
전산 기본
OSI 7계층에 대해서 설명해주세요. TCP/IP 4계층에 대해서 설명해주세요. DNS가 무엇인가요? www.naver.com에 접속할때 일어나는 일에 대해 설명해주세요. 도메인 이름으로 실제 IP를 어떻게 찾을 수 있는지 흐름을 설명해 주세요. 유니캐스트, 멀티캐스트, 브로드캐스트란? TCP/UDP
TCP와 UDP의 차이에 대해서 설명해 주세요. TCP 헤더에 대해서 설명해 주세요. MTU가 무엇인가요? 3-way hand shake, 4-way hand shake 흐름에 대해서 설명해주세요. HTTP
HTTP 프로토콜에 대해서 아는대로 말해주세요. HTTP와 HTTPS 의 차이는 무엇인가요? HTTPS가 동작하는 방식에 대해서 설명해 주세요. HTTP Method 종류 및 역할 HTTP 1.0과 1.1의 차이는 무엇인가요? HTTP2와 그 특징에 대해서 설명해 주세요. HTTP 헤더의 구조에 대해서 설명해 주세요. keep-alive 헤더에 대해서 설명해 주세요. HTTP GET과 POST의 차이는 무엇인가요? 쿠키와 세션에 대해서 설명해 주세요. 웹
www.google.com에 접속할때 일어나는 일 웹브라우저에서 서버로 요청했을 때, 흐름을 설명해주세요. CORS란 무엇인가요? 웹 서버와 웹 어플리케이션 서버(WAS)의 차이는 무엇인가요? REST API에 대해서 설명해 주세요. REST ful API Gateway란 무엇인가요? API Gateway가 다운되면 모든 API를 사용 못할지도 모르는데, 어떤 방안을 마련해야 할까요? 기타
nagle 알고리즘에 대해 설명하세요. TLS에 패킷 프토토콜의 대해 설명하세요 TLS 네트워크 Layer 라우팅 알고리즘 SNI 필드 차단 흐름제어 / 혼잡제어 / 오류제어 로드 밸런서 / 로드 밸런싱은 무엇인지 설명하세요. WebRTC REST API
서버와 통신해서 데이터를 어떻게 가져왔나요 ?
Alamofire 혹은 AFNetworking 등의 라이브러리 사용 경험이 있나요 ? 네트워크 연동 라이브러리를 왜 사용했으며, 장점과 단점을 설명할 수 있나요 ?
인터넷이 느리고 불안정한 지역에서 서버로 API를 호출하여 10만 개의 데이터를 리스트로 보여줘야 한다. 이 문제를 해결하는 과정 및 그 과정 중에 구현할 요소들과 단계별 고려사항은?
JSON 구조는 어떻게 생겼나요 ?
XML 과 JSON 의 차이점에 대해 설명해주세요.
OSI 7계층에 대해 설명해주세요.
OS
프로세스
프로세스와 스레드의 차이는 무엇인가요? 멀티 스레드 vs 멀티 프로세스 스택을 스레드마다 독립적으로 할당하는 이유는 무엇인가요? PC 레지스터를 스레드마다 독립적으로 할당하는 이유는 뭘까? 멀티 프로세스 대신 멀티 스레드를 사용하는 이유는? 컨텍스트 스위칭(Context Switching)이란 무엇인가요? 컨텍스트 스위칭의 과정 교착상태(Dead Lock)란 무엇인가? 교착상태가 발생하기 위한 조건은? 교착상태의 해결법은 무엇인가요? 회피 기법인 은행원 알고리즘이 뭔지 설명해보세요. 은행원 알고리즘의 단점 기아상태를 설명하는 식사하는 철학자 문제에 대해 설명해보세요. 철학자 문제 교착상태 조건 성립 조건 식사하는 철학자 문제 해결책 Mutex vs Semaphore 임계구역이란? 경쟁 상태(Race Condition)란 무엇인가요? 경쟁상태가 발생하는 경우 경쟁상태를 방지하기 위한 해결법의 충족 조건 경쟁상태 해결방법은 무엇이 있나요? 프로세스 혹은 스레드의 동기화란 무엇인가요? 사용자 수준의 스레드와 커널 수준의 스레드의 차이는 무엇인가요? CPU 스케줄링이란 무엇인가요? 프로세스 스케줄러에는 어떤 것들이 있나요? CPU 스케줄링의 성능 척도에는 어떤 것들이 있나요? CPU 스케줄링 방법에는 대표적으로 어떤 것들이 있나요? 동기와 비동기, 블로킹과 넌블로킹의 차이는 무엇인가요? IPC란 무엇인가요? fork()란 무엇인가요? child process와 zombi process에 대해 설명해 보시오. (고아/좀비) 인터럽트란 무엇인가요? 시스템 콜이란 무엇인가요? 전통적인 동기화 문제에는 어떤 것들이 있나요? 메모리
프로세스에 할당되는 메모리의 각 영역에 대해서 설명해 주세요. 메모리 구조의 순서가 어떻게 되는가? CPU에서 가까운 순으로 말해보시오. 페이지와 세그멘테이션에 대해서 설명해 보시오. 외부 단편화란? 내부 단편화란? 메모리의 First Fit, Best Fit, Worst Fit에 대해서 설명해 보시오. 페이지 교체 알고리즘 종류에는 어떤 것들이 있나요? 가상 메모리(Virtual Memory)란? Demand Paging이란? 가상 메모리를 사용할 시 장단점은? Cache Memory의 역할은 무엇인가 Caching Locality와 Cache Hit Ratio에 대해 설명하시오 Call Stack에 대해 설명하시오 Heap 메모리는 무엇이고 사용하는 이유는 무엇인가 Heap과 Stack의 장단점 비교 (속도, 크기 등) Memory Corruption이란? Heap Corruption에 대해 설명하시오 거짓 공유에 대해 설명하시오 DMA란?