-
[개념정리] iOS 전반 (면접대비)iOS/iOS개념정리 2025. 1. 10. 10:26
공부하기 좋은 자료 모음집!
https://github.com/ClintJang/awesome-swift-korean-lecture/blob/master/README.md#rxswift
추가로 정리하면 좋을 내용: 유튜브에 ios interview questions 검색
iOS 앱개발 지식 전반적으로 정리하고자.. 기초개념은 많이 까먹은거 같다..
정리 내용 출처:
https://www.youtube.com/watch?v=XTAziR-tY-A&list=PL8seg1JPkqgF5wazzCKSq3EEfqt3t8mvA
Codable: 디코딩, 인코딩 모두 가능
- 디코딩: 서버에서 데이터를 다운로드 할때 해당json을 디코딩
- 인코딩: 업로드 할때 ex. 트위터에서 트윗을 json으로 인코딩하여 서버로 전송
위와같이 SwiftUI에서 @State로 정의된 user에 비동기로 값을 받아오면 Text에 바로 변경됨. Flutter방식과 매우 유사함
[ Class vs Struct ]
class= Reference type
struct = Value type
• Class
google sheet와 유사함. 여러 사람과 시트를 공유한 다음
하나의 엑셀시트를 모두가 참조하고 있어서,
하나의 source를 변경하면 모두에게 적용됨
• Struct
- Copied나의 엑셀파일을 copy해서 상대방에게 이메일로 전송하는 개념.
상대방이 변경해도 나의 orginal file에는 영향을 미치지 않음* 예시
class: myCar를 복사한 stolenCar의 속성을 변경하면 원래 객체인 myCar의 속성도 변경됨 (yellow)
struct: myCar는 여전히 Grey
* When to use class or struct
- class has inheritance (상속이 장점) & refernce type
BaseCar를 상속받는 RaceCar는 BaseCar의 기본 정보 + 추가 속성 정의대표적 예시:
class MyCustomButton: UIButton {
}
UIButton의 모든 속성은 가져오면서, 추가로 정의한 custom 속성을 정의할때
- struct: Lightweight & Performant
상속이 필요하지 않을때 사용
[ Generics ]
데이터 타입에 관계없이 동일한 코드를 작성 가능
<T: Comparable>:
- T는 제네릭 타입 매개변수로, 함수에서 사용할 데이터 타입을 일반화합니다.
generic T가 Comparable프로토콜을 따르도록 제한
파라미터인 valueOne과 valueTwo모두 type T 이므로 Comparable프로토콜을 따른다
[예시]
데이터를 주고받는 이 코드는 매우 유사함 > 입력인자(T)를 Decodable로 제한
- Generic의 장점
- 코드 재사용성: 한 번 작성된 코드는 다양한 데이터 타입에 대해 동작합니다.
- 타입 안정성: 제네릭을 사용하면 함수 호출 시 전달되는 타입이 고정되므로, 잘못된 타입으로 인해 발생할 수 있는 오류를 방지합니다.
- 유연성: Comparable처럼 프로토콜 제약을 추가하여, 필요한 동작(예: 비교 연산)이 보장되는 타입에서만 동작하도록 제한할 수 있습니다.
- Generic의 단점
- 코드 복잡성 증가
지금처럼 단순히 Users, Repository를 가져오는 게 아니라, 예를 들어 프로젝트나 GitHub API에서 다른 다섯 가지를 가져와야 한다면,
네트워크 호출이 다섯 개나 여섯 개가 되었고, 이들이 모두 같은 구조를 가지고 있다면, 그때 제네릭을 사용하는 것은 훌륭
but 반복이 조금밖에 없는 경우 Generic을 사용하면 코드가 복잡해짐
[ Closures ]
closer에서는 변수명이 아닌 type이 필요
Trailing Closure Syntax (후행 클로저 문법)
Closure가 함수의 마지막 인수인 경우, 소괄호를 생략하고 함수 호출 뒤에 작성
let result = performOperation(a: 5, b: 3) { $0 * $1 }
print(result) // 출력: 15
@escaping closure
: Closure는 함수의 실행이 끝난 뒤에도 살아있음.
비동기 코드에서 사용되는 이유가 바로 이것.
네트워크 호출 코드가 실행 된 이후에 결과값이 전달됨. @escaping으로 정의했기 때문에 값을 받아올 수 있는것
- retain cycle (참조순환) & memory leak 개념과 연결 !!
네트워크 호출 & 응답 이후 데이터를 UI에 표현하기 위해서 클로저는 호출한 객체 (ViewController) 에 대한 참조를 유지(capture)
>> 따라서 [weak self] 구문으로 순환참조를 방지
** 순환참조에 대해 알고싶다면
https://soultreemk.tistory.com/160
https://soultreemk.tistory.com/161두 포스팅 읽어볼것
[ Filter, Map, Reduce ]
함수 사용법 설명. 패스
[ Array, Set ]
1. Array: 동일한 값 할당 가능. 순서 보장 (복제해도 동일한 순서가 유지됨) > array내의 특정 요소를 탐색할때, for문으로 모든 내용을 검사해야함 : 시간복잡도 증가. array 요소가 커질수록 탐색에 걸리는 시간도 동일하게 증가 O(n)
2.Set: 요소는 고유해야 함. 중복된 값을 허용X 순서 보장 안됨 > Set에 특정 요소가 포함되어 있는지 확인하는 작업은 항상 동일한 시간 복잡도를 가짐 O(1) ( componene in set 이렇게 in으로 포함여부만 체크하면 됨)
따라서, Set은 성능 면에서 뛰어나며, 데이터 비교 및 필터링에 유용한 강력한 메서드를 제공. 굉장히 큰 개수를 다룰때는 Set이 적합
[ Optionals ]
값이 있을 수도 있고 없을 수도 있는 변수를 나타내는 타입
1) If Let Binding
- 옵셔널 값이 존재하면 해당 값을 안전하게 추출.
if let age = user.age {
print("User's age is \(age)")
} else {
print("User did not enter an age")
}
장점: 안전하게 값을 처리.
단점: 중첩 구조가 발생할 경우 코드가 복잡해질 수 있음(Pyramid of Doom).
2) Guard Let
- 함수나 메서드에서 초기에 조건을 검사하고, 조건이 만족되지 않을 경우 빠른 종료(early exit).
func checkAge(_ age: Int?) {
guard let age = age else {
print("Age is nil")
return
}
print("User's age is \(age)")
}
장점: 조건이 실패하면 즉시 종료하여 코드 가독성을 높임.
단점: 함수 내부에서만 사용 가능.
3) Nil Coalescing Operator
- 옵셔널 값이 nil일 경우 기본값을 제공.
let age = user.age ?? 0
print("User's age is \(age)")
- 장점: 간단하게 기본값을 설정 가능.
- 단점: 기본값 설정이 적합하지 않은 경우 잘못된 데이터 처리 가능성.
> 사용자 이름과 같은 기본값 제공이 적절한 경우 사용(예: "Not Given")
4) Force Unwrapping
- 옵셔널 값이 nil이 아님을 확신하는 경우 강제로 값을 추출
let age = user.age!
print("User's age is \(age)")
- 장점: 간단하고 직관적.
- 단점: 값이 nil일 경우 런타임 오류 발생(앱 크래시).
주의: 일반적으로 Force Unwrapping은 피하는 것이 좋으며, 특정 상황에서만 신중히 사용.
> nil일 가능성이 절대 없는 시스템 함수 또는 외부 라이브러리 호출 시 사용 가능. ex) DateFormatter와 같은 Apple의 시스템 함수 결과, 혹은 하드코딩된 유효한 URL 문자열을 사용한 경우let url = URL(string: "https://example.com")!
print(url) // URL 생성이 실패할 가능성이 없음
> URL(string:)은 옵셔널을 반환하지만, 하드코딩된 유효한 URL 문자열을 사용했으므로 nil이 될 가능성이 없음
5) Optional Chaining
- 옵셔널 객체의 속성이나 메서드를 체인 형태로 호출
let userName = user?.name
장점: 옵셔널 객체와 관련된 속성을 간결하게 처리 가능.
단점: 여러 단계 체인이 중첩되면 코드 가독성이 떨어질 수 있음.
[ Unit Testing ]
이어서 작성 필요
'iOS > iOS개념정리' 카테고리의 다른 글
[개념정리] MVVM, CleanArchitecture (0) 2025.01.10 [개념정리] RxSwift, Combine (0) 2025.01.10 네트워크 비동기와 reloadData의 중요성 (0) 2023.02.05 Completion Handler / Closure (0) 2022.05.15 Timer class vs. GCD DispatchSourceTimer (0) 2022.05.08