IOS 앱 개발 기본 상식

hankyulee·2022년 9월 21일
0

인터뷰

목록 보기
2/12

KVC: Key Value Coding 프로퍼티에 간접 접근해서 데이터 읽거나 쓰는것 -> 런타임 중에 key 값이 결정되기 때문에 객체간 의존도 낮출수 있다.

KVO: Key Value Observing . @objc dynamic 키워드를 붙여서 Objective-C 런타임 중에 접근이 가능하도록 한다. RxSwift의 Subscribe 처럼 뷰모델의 어떤 프로퍼티 변화가 생겼을때 View에서의 변화 유도가능. NSObject를 채택해야하고, 관찰할 프로퍼티에는 @objc 와 dynamic를 붙인다. It’s useful for communicating changes between logically separated parts of your app—such as between models and views.
https://developer.apple.com/documentation/swift/using-key-value-observing-in-swift

출처: https://dongminyoon.tistory.com/70?category=419822

고차함수: 다른 함수를 인자로 받거나 반환하는 함수. Swift는 일급 객체이기때문.
Map, Fllter, Reduce...

upcasting: 아래에서 위로. 컴파일 타임. 항상 성공
downcasting: 위에서 아래. 실패 가능 as? as as!

클래스은 실체를 가지고있지만 프로토콜은 메서드의 인터페이스만 가지고 있습니다.

enum:
associated value는 튜플을 통해 각 case들이 다른 타입을 가지게 할 수도 있고, named tuple로 이름을 붙일 수도 있으며, 여러개의 값을 가지게 하는 것도 가능합니다.

Class 는 힙 영억에 인스턴스를 저장하고 인스턴스의 주소값을 스택 영역에 저장합니다. 반면에 Struct는 스택 영역에 인스턴스가 저장됩니다.

강한 참조는 참조 타입 인스턴스를 변수에 할당하는 것을 의미합니다. 스위프트의 ARC는강한 참조에 참조 카운트를 증가시키고

ARC와 GC의 가장 큰 차이점은 런타임에 처리를 하는지, 컴파일 타임에 처리를 하는지에 있습니다. ARC는 Retain과 Release를 컴파일러가 컴파일 타임에 자동으로 삽입해 Reference Count를 조절합니다.
💡 반면에 GC는 가비지 콜렉터를 런타임에 별도로 실행하면서 메모리의 상태를 감시합니다.
💡 ARC는 단순히 카운팅을 통해 인스턴스들을 관리하기 때문에 순환참조의 위험이 있습니다.
rc는 힙에 저장된다.

qos: GCD에서 우선순위. Quality of Service

기본 자료형은 컴파일러에 의해 Hashable 프로토콜이 알아서 채택

struct Human {
    let name: String
    let age: Int
}
 
let myDict: [Human: Int] //에러!

Never 타입은 비정상적인 종료에 사용되는 반환 타입이며 값을 지니지는 않습니다.

DispatchGroup은 여러 스레드에 분배되어 있는 작업들을 그룹으로 묶어서 동기적으로 관리하기 위해 사용합니다.

큐에 있는 작업을 스레드에 할당

autoclosure

@objc와 dynamic차이

RunLoop는 스레드 당 하나씩 생성되어서 Thread에 작업이 생기면 처리하고, 아닐 때는 대기시키는 역할을 합니다.
RunLoop는 메인 스레드를 제외한 스레드에서는 자동으로 실행되지 않고 개발자가 직접 실행시켜주어야 합니다.

final: vtable을 거치지 않고 직접적으로 호출되기 때문에 성능상 더 좋은 퍼포먼스를 낼 수 있습니다.

vtable은 가상 메소드 테이블로 컴파일 타임에 생성되어 메소드가 호출되었을 때 사용할 구현체를 런타임에 특정할 수 있게 해줍니다.

compactMap은 1차원 배열에서 각 요소에 대해 nil을 제거하고 옵셔널 바인딩을 한 결과를 배열로 만들어 반환합니다.

순수함수는 동일한 입력에 대해 항상 동일한 출력을 가지는 함수입니다.

String을 구성하는 각 문자들은 여러문자가 합성된 Unicode Scalar 로 이루어져 있습니다. 따라서 한 문자가 같은 크기의 메모리를 가지지 않습니다. 따라서 String에서는 Subscript를 사용할 수 없습니다.

DispatchQueue - Async, Sync: 두 방법 모두 DispatchQueue에 작업을 등록하고 Main 스레드에서 작업이 수행되도록 합니다.

open과 public 키워드 모두 외부 모듈에서의 접근까지 허용합니다
open은 외부 모듈에서 클래스를 상속하는 것과 메소드 오버라이딩이 가능하지만, public은 외부 모듈에서의 클래스 상속과 메소드 오버라이딩을 제한합니다

fileprivate은 같은 소스파일 내에서의 접근만 하용합니다.//

static func, class func 모두 타입 메소드이기 때문에 인스턴스를 생성하지 않고 타입에 접근해 함수를 호출할 수 있습니다.

class func는 오버라이딩을 허용하지만 static func는 오버라이딩을 허용하지 않습니다.
스위프트에서 유일하게 직접적인 상속을 지원하는 객체타입이 클래스라는 것을 생각해보면 class만 오버라이딩을 허용하는 것과 쉽게 연결시킬 수 있습니다!

일급객채: 함수의 입력인자, 반환값, 변수에 할당 가능.
스위프트의 함수는 일급객체의 조건을 만족시킨다고 하는데요..!

추상클래스
자바 - abstract사용. 음료라는 음료는 없다. 객체 생성 불가.
스위프트는 추상 클래스 문법을 지원하지는 않지만 프로토콜을 통해 동일한 동작을 하도록 할 수 있습니다. 인터페이스 장점: 다형성, 그룹화

Any와 AnyObject 모두 범용타입으로 여러 타입을 한번에 표현할 수 있게 해주지만 AnyObject는 클래스 타입만 저장할 수 있다는 제한조건이 추가됩니다

swift는 OOP(객체지향), POP(프로토콜지향), FP(함수형)을 지원하는 멀티 패러다임 언어

구조체는 불변성을 유지하기 때문에 여러 스레드들이 한 인스턴스를 사용하는 다중 스레드 환경에서도 안전하게 사용될 수 있습니다.
💡 구조체는 스택에 저장하기 때문에 더 빠릅니다. 힙에 저장되는 클래스는 힙에 인스턴스를 저장하고 그 참조값을 스택에 저장합니다
만약 어떤 인스턴스의 참조값의 고유성을 유지하고 싶다면 클래스를 사용할 수 있습니다
cow: Swift에선 Collection Type을 복사해서 사용할 때 일어남. 복사할때까지는 같은 주소값인데, 둘중하나를 수정하면 주소값이 바뀜.

함수형 프로그래밍: 외부 상태에 영향을 받지 않기 때문에 해당 함수만 테스트 가능. output을 만드는데 input만을 사용한다는 의미로, 함수 외부의 값을 사용하지 않아 사이드 이펙트가 없습니다.함수형 프로그래밍은 입력된 인자에만 의존하기 때문에 항상 예측할 수 있는 결과가 나옵니다

만약 weak으로 선언한 변수가 참조하고 있던 인스턴스가 메모리에서 해제되면 해당 변수의 값은 nil로 채워집니다.

hashable: 해시테이블에서 키값에 맞도록 하는 프로토콜
딕셔너리도 해시 테이블로 되어있는데, 해시 함수에 키값을 넣어 주소값을 얻은 후 그 주소값에 맞는 Index에 Value를 넣는다.
equtable: class의 경우 직접 ==을 구현해야함. struct는 기본타입이라면 안해도됨.

viewdidload: controller’s view is loaded into memory.

선언형, 명령형: https://velog.io/@kkh3/UIKit-vs-SwiftUI-%EC%B0%A8%EC%9D%B4%EC%A0%90

A view is a subclass of UIResponder and can respond to touches and other types of events.

오토레이아웃: 그 뷰가 다른 뷰의 hierarchy의 변화에 어떻게 size, position이 반응할 것인지 정하는 룰.
https://developer.apple.com/documentation/uikit/uiview

lazy: 나중에 메모리에 올려 메모리 관리, 클래스 생성후 내부 프로퍼티에 접근할때

Dispatch란 어떤 메서드를 호출할 것인지를 결정하여, 그것을 실행하는 메커니즘이다. 다이나믹 디스패치: 런타임때 호출할 함수를 결정. vTable에서 가져옴. 프로토콜도 기본적으로 dynamic dispatch.

contentoffset은 점이다. contentOffset이 scrollview의 bounds를 설정.
contentInset: The custom distance that the content view is inset from the safe area or scroll view
edges. contentInset은 컨텐츠에 상하좌우 여백을 주는 것이라고 생각하면 됩니다.

awakeFromNib: Prepares the receiver for service after it has been loaded from an Interface Builder archive, or nib file. 객체가 초기화(인스턴스화)된 후 호출된다. label, imageview등 객체 설정해 놓는코드 등이 들어간다.

UIControl: UIView상속받음
UIView: Screen의 네모 영역을 manage하는 객체
UIViewController: 앱의 뷰 계층 구조를 관리하는 객체
- container ViewController: UINavigationController, UITabBarController 및 UISplitViewController
- content ViewController: 루트뷰와 서브뷰들 이벤트 처리 등 매니저역할.
View는 사용자에게 보여지는 부분인 객체이고, ViewController는 화면에 보이지 않는 객체입니다.
https://velog.io/@swiftist9891/UIView-UIViewController

An outlet is a property in your view controller that includes the IBOutlet keyword. The presence of that keyword tells Xcode to expose that property in your storyboard.

스토리보드로 만들면 init 컨트롤 못한다. An example of that is when building view controllers, especially if you are using XIBs or Storyboards to define them, since then you are no longer in control of your class' initializer.

prepareforreuse: Called when the view is removed from the reuse queue.

다시

@objc는 스위프트의 API를 Objective-C에서 사용할 수 있도록 하는 속성.

dispatch, operation queue

hashable

출처:
https://jeonyeohun.tistory.com/331
https://babbab2.tistory.com/149

0개의 댓글