24.09.05 Today I Learned
2024. 9. 5. 18:35
오늘은 모의 면접을 대비해서 면접 예상 질문을 공부해봤다.
- Extension에서 저장 프로퍼티를 사용할 수 있나요?
불가능함. extension에서는 저장 프로퍼티 추가 못 함. extension은 기존 클래스나 구조체에 새로운 기능(메서드, 연산 프로퍼티, 초기화 함수 등)을 추가할 때만 사용 가능함. 저장 프로퍼티는 인스턴스에 메모리를 차지하는데, extension에서는 그걸 허용하지 않기 때문임. - Array에 대해서 설명해주세요.
Array는 같은 타입의 값들을 순서대로 저장하는 컬렉션 타입임. 인덱스를 사용해 요소에 접근할 수 있음. 배열은 Array<Element> 형태로 선언되고, 요소의 타입은 제네릭으로 정의됨. 배열은 가변적일 수 있고, append, remove, insert 같은 메서드를 사용해 요소를 추가하거나 제거할 수 있음. - Stack, Queue 차이점에 대해서 설명해주세요.
- Stack: LIFO(Last In, First Out) 구조임. 마지막에 추가된 요소가 먼저 제거됨. push와 pop으로 관리함. 함수 호출 스택, 네비게이션 스택 같은 곳에서 사용됨.
- Queue: FIFO(First In, First Out) 구조임. 가장 먼저 추가된 요소가 가장 먼저 제거됨. enqueue와 dequeue로 관리함. 프린터 작업 대기열 같은 곳에서 사용됨.
- iOS에서 Stack을 사용하는건 어떤게 있을까요?
내가 사용해본건 네비게이션 스택에 Stack 개념을 사용함. 예를 들어, UINavigationController가 있음. 이 컨트롤러는 뷰 컨트롤러들을 스택으로 관리하며, 새로운 화면을 push하고, 이전 화면으로 pop하는 방식으로 작동함.
예를 들면, 첫 화면이 스택에 들어가서 FirstViewController가 가장 아래에 깔리게 되고, 사용자가 새 화면으로 가면 SecondViewController가 그 위에 쌓이게 됨. 그러고 이제 뒤로가기 버튼등을 눌렀을때 SecondViewController가 스택에서 먼저 제거가 되므로 다시 첫화면으로 돌아가는 것임. - 저장 프로퍼티와 연산 프로퍼티에 대해서 설명해주세요.(솔직히 아직 잘 모름)
- 저장 프로퍼티: 클래스나 구조체의 인스턴스에 실제로 값을 저장하는 프로퍼티임. 값을 저장하고 유지함.
- 연산 프로퍼티: 값을 저장하지 않고, 대신 다른 프로퍼티나 계산을 통해 값을 반환하는 프로퍼티임. get과 set을 통해 값을 계산하거나 설정할 수 있음.
- lazy 프로퍼티에 대해서 설명해주세요. (솔직히 아직 잘 모름)
lazy 프로퍼티는 최초 접근 시점에 초기화되는 저장 프로퍼티임. 초기화 비용이 크거나, 인스턴스 생성 시점에 바로 필요하지 않은 경우에 사용됨. 주로 클로저를 통해 초기값을 지정하며, 해당 프로퍼티에 처음 접근할 때 클로저가 실행되어 값을 설정함. - Optional에 대해서 설명해주세요.
Optional은 값이 있을 수도 있고, 없을 수도 있는 상황을 표현하는 타입임. Optional 타입은 nil을 가질 수 있으며, Swift에서 안전하게 값의 유무를 처리하기 위해 사용됨. Optional 타입은 ?를 사용해 선언됨. - Optional을 사용하는 이유에 대해서 설명해주세요.
Optional을 사용함으로써 값이 존재하지 않을 수 있는 상황을 안전하게 처리할 수 있음. nil이 될 수 있는 변수를 명확히 표현해, 런타임 오류를 방지하고 코드의 안정성을 높임. - Optional 언래핑 방법에 대해서 아는만큼 설명해주세요.
- Forced Unwrapping: !를 사용해 강제로 언래핑함. 값이 nil이면 런타임 오류 발생함.
- Optional Binding: if let이나 guard let을 사용해 안전하게 언래핑함. 값이 nil이 아닐 때만 사용함.
- Nil-Coalescing Operator: ?? 연산자를 사용해 Optional 값이 nil일 때 기본값을 제공함.
- Optional Chaining: ?를 사용해 Optional 값의 속성이나 메서드에 접근함. 중간에 nil이 있으면 전체 표현식이 nil을 반환함.
- Closure에 대해 설명해 주세요. (솔직히 아직 잘 모름)
Closure는 코드에서 전달되고 사용할 수 있는 독립적인 블록임. 함수와 유사하며, 변수나 상수로 저장하거나 함수의 매개변수로 전달될 수 있음. Swift에서 클로저는 클로저 표현식, 축약된 문법, 후행 클로저 등 다양한 형태로 사용됨. - Escaping Closure에 대해 설명해 주세요.
Escaping Closure는 함수의 실행이 끝난 후에도 호출될 수 있는 클로저임. 클로저가 함수의 외부에서 사용되거나 나중에 실행될 때 @escaping 키워드를 사용해 정의함. 주로 비동기 작업에서 사용됨. (Rxswift로 바꿔서 사용해봄) - Extension에 대해 설명해 주세요.
Extension은 기존 클래스, 구조체, 열거형, 프로토콜에 새로운 기능을 추가할 수 있는 기능임. Extension을 통해 기존 타입에 메서드, 연산 프로퍼티, 이니셜라이저, 서브스크립트, 프로토콜 준수 등을 추가할 수 있음. 기존 타입을 확장하고, 재사용성을 높이며, 코드를 더 모듈화할 수 있게 해줌. - Extension을 사용해보셨나요?
사용해 봤음. 기존 타입에 새로운 메서드를 추가하거나, 프로토콜을 채택하도록 확장하는 데 사용했음. 예를 들어, UI 관련 코드를 분리하는 데 활용했음. - class와 struct의 차이점에 대해서 설명해주세요.
- 클래스 (Class): 참조 타입임. 인스턴스를 다른 변수에 할당하거나 함수에 전달할 때 복사본이 아닌 참조가 전달됨. 상속 가능함. 런타임에 ARC로 메모리 관리됨.
- 구조체 (Struct): 값 타입임. 인스턴스를 다른 변수에 할당하거나 함수에 전달할 때 복사본이 전달됨. 상속 불가능함. 가벼운 메모리 관리 제공함.
- class func와 static func의 차이점에 대해서 설명해주세요.
- class func: 클래스 메서드임. 서브클래스에서 재정의 가능함. 메서드가 호출될 때 해당 클래스의 인스턴스에 접근할 수 있음.
- static func: 타입 메서드임. 서브클래스에서 재정의 불가능함. 메서드가 호출될 때 클래스나 구조체 자체에만 접근할 수 있음.
- call by reference와 call by value에 대해서 설명해주세요. (이해못함)
- Call by Value: 함수에 인자를 전달할 때 값이 복사되어 전달됨. 함수 내에서 인자의 값을 변경해도 원본 값에 영향 없음.
- Call by Reference: 함수에 인자를 전달할 때 인자의 참조가 전달됨. 함수 내에서 인자의 값을 변경하면 원본 값도 변경됨.
- mutating 키워드에 대해서 설명해주세요. (이해못함)
mutating 키워드는 구조체나 열거형의 메서드에서 인스턴스의 프로퍼티를 수정할 수 있게 해줌. 기본적으로 구조체와 열거형은 값 타입이기 때문에, 메서드 내에서 프로퍼티 수정 불가능함. mutating 키워드 사용하면 프로퍼티 수정하거나, self를 새로운 인스턴스로 교체 가능함. - 객체지향 프로그래밍에 대해서 설명해주세요. (이해못함)
객체지향 프로그래밍(OOP)은 프로그램을 객체라는 기본 단위로 구성하는 프로그래밍 패러다임임. 각 객체는 데이터와 메서드를 가지며, 프로그램은 이 객체들 간의 상호작용으로 이루어짐. OOP는 코드의 재사용성, 확장성, 유지보수성을 높이는 데 중점을 둠. - 객체지향 프로그래밍의 특징에 대해서 아는만큼 설명해주세요. (이해못함)
- 추상화: 복잡한 시스템을 단순화해 핵심 개념만 모델링함.
- 캡슐화: 객체의 상태와 행동을 하나로 묶고, 외부에 노출하지 않음. 내부 구현을 숨길 수 있음.
- 상속: 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받아 사용할 수 있음.
- 다형성: 동일한 인터페이스나 메서드를 다양한 방법으로 구현할 수 있음.
- 상속에 대해서 설명해주세요. (이해못함)
상속은 한 클래스가 다른 클래스의 속성과 메서드를 물려받아 사용하는 것임. 상속을 통해 코드 재사용성을 높이고, 기존 클래스를 확장할 수 있음. - protocol에 대해서 설명해주세요. (이해못함)
protocol은 특정 기능이나 속성의 청사진을 정의하는 것임. 클래스, 구조체, 열거형이 이 protocol을 채택해서 정의된 요구사항을 구현해야 함. 다중 상속이 불가능한 Swift에서 프로토콜을 사용하면 다양한 타입에 공통된 기능을 추가할 수 있음. - Codable에 대해서 설명해주세요. (이해못함)
Codable은 Swift에서 JSON이나 Plist 같은 외부 데이터 포맷을 인코딩(Encoding)하고 디코딩(Decoding)하는 프로토콜임. Encodable과 Decodable 프로토콜을 함께 사용한 약어임. 이 프로토콜을 채택하면 구조체나 클래스가 손쉽게 외부 데이터를 변환할 수 있음. - Dictionary를 사용해보셨나요?
사용해보진 못했지만 팀원이 사용하는 것은 봤음. Firestore에서 데이터를 가져올때 swift에서는Dictionary 형태로 데이터를 처리하는 것으로 알고있음. 그래서 데이터를 읽어오면 Swift에서는 Dictionary<String, Any>로 반환 되는 것으로 앎. - Hashable에 대해서 설명해주세요. (이해못함)
Hashable은 객체를 해시 값으로 변환할 수 있게 하는 프로토콜임. 이 해시 값은 컬렉션 타입에서 빠른 검색과 비교를 가능하게 함. Dictionary나 Set과 같은 타입에서 키로 사용되는 타입은 Hashable을 준수해야 함. (이게 무슨뜻이지..) - Swift 접근제어자에 대해서 아는만큼 설명해주세요.
Swift 접근제어자는 코드의 접근 범위를 제한하는 데 사용됨. private, (fileprivate), (internal), public, (open)이 있음. private은 같은 파일 내에서도 같은 타입에서만 접근 가능, fileprivate은 같은 파일에서 접근 가능, internal은 모듈 내에서 접근 가능, public은 모듈 외부에서도 접근 가능, open은 public보다 더 자유롭게 상속이나 오버라이드가 가능함. - Swift Default 접근제어자는 무엇인지 설명해주세요.
Swift에서 기본 접근제어자는 internal임. 별도로 접근제어자를 명시하지 않으면 같은 모듈 내에서 접근 가능함.
'Today I Learned > 2024' 카테고리의 다른 글
24.09.12 Today I Learned (0) | 2024.09.12 |
---|---|
24.09.10 Today I Learned (0) | 2024.09.10 |
2024.09.03 Today I Learned (1) | 2024.09.03 |
24.09.02 Today I Learned (0) | 2024.09.02 |
24.08.26 Today I Learned (0) | 2024.08.26 |