iOS/질문으로 접근하는 CS문제
-
코드 import Foundation import UIKit func abc(query: String) { fetch(query: query, completion: { print("abc") }) } func fetch(query: String, completion: (() -> ())) { print("fetch") } 실행결과 fetch 이유 print("abc") 같은 경우 fetch 메소드의 트레일링 클로저 내부에 있는데 completion()이 fetch에서 완료가 되지 않았기에 해당 부분이 실행이 되지 않는다. fetch 함수 내부에서 completion()을 완료시키면 해당 부분이 실행이 된다. 아래와 같이 func fetch(query: String, completion: (() -> ()..
해당 코드에서 print("abc")가 실행되지 않는 이유를 말해라.코드 import Foundation import UIKit func abc(query: String) { fetch(query: query, completion: { print("abc") }) } func fetch(query: String, completion: (() -> ())) { print("fetch") } 실행결과 fetch 이유 print("abc") 같은 경우 fetch 메소드의 트레일링 클로저 내부에 있는데 completion()이 fetch에서 완료가 되지 않았기에 해당 부분이 실행이 되지 않는다. fetch 함수 내부에서 completion()을 완료시키면 해당 부분이 실행이 된다. 아래와 같이 func fetch(query: String, completion: (() -> ()..
2022.11.24 -
weak와 unowned의 가장 큰 차이점은 nil값의 유무입니다. weak는 nil값을 넣을 수 있으며 unowned는 nil값을 넣을 수 없습니다. 그렇기에 weak는 라이프 사이클이 보다 짧을 때, unowned는 라이프 사이클이 길 때 사용됩니다. 그렇기에 unowned에 nil값이 들어온다면 crash가 일어나는 문제가 있습니다. 다만, 반대로 보자면 unowned를 사용한 값은 코드에서 self?를 쓰지 않아도 되기 때문에 해당 부분을 주의한다면 코드의 가독성이 올라간다는 장점이 있습니다. 또한 해당 문제로 인해서 코드가 긴 프로젝트의 경우에는 혹시 모를 상황을 대비하기 위해서 weak를 주로 쓰는것으로 알고 있습니다.
weak와 unowned의 차이점과 활용방안에 대해 서술하시오.weak와 unowned의 가장 큰 차이점은 nil값의 유무입니다. weak는 nil값을 넣을 수 있으며 unowned는 nil값을 넣을 수 없습니다. 그렇기에 weak는 라이프 사이클이 보다 짧을 때, unowned는 라이프 사이클이 길 때 사용됩니다. 그렇기에 unowned에 nil값이 들어온다면 crash가 일어나는 문제가 있습니다. 다만, 반대로 보자면 unowned를 사용한 값은 코드에서 self?를 쓰지 않아도 되기 때문에 해당 부분을 주의한다면 코드의 가독성이 올라간다는 장점이 있습니다. 또한 해당 문제로 인해서 코드가 긴 프로젝트의 경우에는 혹시 모를 상황을 대비하기 위해서 weak를 주로 쓰는것으로 알고 있습니다.
2022.11.22 -
이유 : 함수 호출과 복귀를 하기 위한 Context Switching 비용이 발생하기 때문에 속도가 상대적으로 느려집니다. 즉, 오버헤드가 발생하여 속도 저하가 발생함. 해결법 : 꼬리 재귀 func 팩토리얼(n, ans) { if n == 1 { return 1 } return 팩토리얼(n-1, ans + n) } func 팩토리얼(n) { if n == 1 { return 1 } return n + 팩토리얼(n-1) } 위에가 꼬리재귀를 사용한 코드이며 밑이 꼬리재귀가 없는 코드이다. 얼핏보면 비슷해 보이지만 return을 할 때 함수의 호출부분에서 연산이 들어가는지 아닌지가 가장 큰 차이점이다. 꼬리재귀를 사용하면 함수한테 추가적인 연산을 바라지 않기에 컴파일러가 스택의 문제를 선형으로 바꿔서 처..
재귀 함수가 반복문보다 느린 이유와 해결 방법을 서술하시오.이유 : 함수 호출과 복귀를 하기 위한 Context Switching 비용이 발생하기 때문에 속도가 상대적으로 느려집니다. 즉, 오버헤드가 발생하여 속도 저하가 발생함. 해결법 : 꼬리 재귀 func 팩토리얼(n, ans) { if n == 1 { return 1 } return 팩토리얼(n-1, ans + n) } func 팩토리얼(n) { if n == 1 { return 1 } return n + 팩토리얼(n-1) } 위에가 꼬리재귀를 사용한 코드이며 밑이 꼬리재귀가 없는 코드이다. 얼핏보면 비슷해 보이지만 return을 할 때 함수의 호출부분에서 연산이 들어가는지 아닌지가 가장 큰 차이점이다. 꼬리재귀를 사용하면 함수한테 추가적인 연산을 바라지 않기에 컴파일러가 스택의 문제를 선형으로 바꿔서 처..
2022.11.19 -
레드 블랙 트리란 완전 이진 트리의 종류 중 하나이다. 레드 블랙 트리의 가장 큰 특징은 높이는 logN에 바운드 되기에 레드블랙트리에서 search연산은 O(logn)의 시간복잡도가 나온다는 것이다. 레드 블랙 트리의 조건은 크게 4가지가 있는데 1. 루트노드의 색깔은 블랙이다. 2. 모든 external node의 색깔은 블랙이다. 3. 빨강 노드의 자식은 black이다. 4. 모든 리프노드에서 black depth는 같다. 레드블랙트리는 노드가 추가될시 Restructuring과 Recoloring이라는 방법을 통해서 색깔의 중복을 피합니다. 다만 restrucuring은 1번으로 끝날 수 있는 반면에 Recoloring은 여러번이 생길 수 있습니다. 장점 1. 삽입, 삭제 시 작업 횟수가 적다. ..
RB(레드 블랙)트리에 대해서 서술하고 장점과 단점에 대해서 서술하시오.레드 블랙 트리란 완전 이진 트리의 종류 중 하나이다. 레드 블랙 트리의 가장 큰 특징은 높이는 logN에 바운드 되기에 레드블랙트리에서 search연산은 O(logn)의 시간복잡도가 나온다는 것이다. 레드 블랙 트리의 조건은 크게 4가지가 있는데 1. 루트노드의 색깔은 블랙이다. 2. 모든 external node의 색깔은 블랙이다. 3. 빨강 노드의 자식은 black이다. 4. 모든 리프노드에서 black depth는 같다. 레드블랙트리는 노드가 추가될시 Restructuring과 Recoloring이라는 방법을 통해서 색깔의 중복을 피합니다. 다만 restrucuring은 1번으로 끝날 수 있는 반면에 Recoloring은 여러번이 생길 수 있습니다. 장점 1. 삽입, 삭제 시 작업 횟수가 적다. ..
2022.11.19 -
원인 : 해시함수의 입력값은 무한한반면 출력값의 가짓수는 유한하기에 발생이 일어난다. 이러한 충돌로 인해서 클러스터링(연속된 레코드에 데이터가 몰리는 현상) 이나 오버플로우( 버킷에 할당된 슬룻 수보다 많이 할당이 되어 더 이상 넣지 못하는 경우) 가 발생한다. 이와 같은 문제를 해결하기 위해서는 크게 3가지 방법이 있다. 첫번째는 체이닝이다. 체이닝이란 버킷 내에 연결리스트를 할당하여 버킷에 데이터를 삽입하는 것이다. 그렇기에 버킷에 제한이 없어지므로 오버플로우를 방지할 수가 있다. 두번째는 개방 주소법이다. 개방 주소법에는 크게 선형 탐색, 2차 검색법, 이중 해시가 있다. 선형탐색이란 해시가 충돌이 일어날 시 다음 버켓이나 혹은 몇 단계를 건너뛰어서 데이터를 삽입하는 것이다. 장점 : 구현이 간단함..
Hash 테이블에서 충돌이 발생하는 상황과 해결방법에 대해서 서술하시오.원인 : 해시함수의 입력값은 무한한반면 출력값의 가짓수는 유한하기에 발생이 일어난다. 이러한 충돌로 인해서 클러스터링(연속된 레코드에 데이터가 몰리는 현상) 이나 오버플로우( 버킷에 할당된 슬룻 수보다 많이 할당이 되어 더 이상 넣지 못하는 경우) 가 발생한다. 이와 같은 문제를 해결하기 위해서는 크게 3가지 방법이 있다. 첫번째는 체이닝이다. 체이닝이란 버킷 내에 연결리스트를 할당하여 버킷에 데이터를 삽입하는 것이다. 그렇기에 버킷에 제한이 없어지므로 오버플로우를 방지할 수가 있다. 두번째는 개방 주소법이다. 개방 주소법에는 크게 선형 탐색, 2차 검색법, 이중 해시가 있다. 선형탐색이란 해시가 충돌이 일어날 시 다음 버켓이나 혹은 몇 단계를 건너뛰어서 데이터를 삽입하는 것이다. 장점 : 구현이 간단함..
2022.11.19 -
Array Linked List 데이터 조회 시간 O(1) O(n) 데이터 삭제, 추가 시간 O(N) O(1) 메모리 할당 Stack 메모리 힙 메모리 메모리 종류 정적 메모리(컴파일 시 할당됨) 동적 메모리(런타임시 할당됨)
Array와 Linked List의 차이에 대해서 서술하시오.Array Linked List 데이터 조회 시간 O(1) O(n) 데이터 삭제, 추가 시간 O(N) O(1) 메모리 할당 Stack 메모리 힙 메모리 메모리 종류 정적 메모리(컴파일 시 할당됨) 동적 메모리(런타임시 할당됨)
2022.11.19