안녕하세요:)
이번 글은 제가 이번에 이직으로 인해 면접을 보면서 받았던 질문들과
과제를 하면서 느꼈던 부족한 점을 간단하게 정리해보려 합니다!
1. 익스텐션과 프로토콜의 차이점?
SWIFT 개발을 하다보면 익스텐션과 프로토콜을 많이 사용하는데
어떤 차이점과 실제 개발 시 두가지의 차이점을 알고 사용해본 경험이 있었는지에 대한 질문이였습니다. 😊
1) 익스텐션(Extensions) : 익스텐션을 이용하면 클래스, 구조체, 열거형 혹은 프로토콜 타입에 기능을 추가할 수 있습니다.
원본 코드를 몰라도 그 타입에 대한 기능을 확장할 수 있습니다. 저는 확장이라는 개념을 조금 강조해서 말했던거 같습니다.
익스텐션 문법으로는 익스텐션은 extension 키워드를 사용해 선업합니다.
extension ViewController : UITableViewDelegate, UITableViewDataSource{
...
}
전 글에 썼던 것처럼 UITableView의 Delegate, DataSource부분을 확장해서 원본코드를 몰라도 기능을 추가할 수 있습니다.
2) 프로토콜(Protocols) : 프로토콜은 특정 기능 수행에 필수적인 요수를 청의한 청사진(BluePrint)입니다.
프로토콜은 정의를 하고 제시를 할 뿐 스스로 기능을 구현하지는 않습니다.
하나의 타입으로 사용되기 때문에 타입 사용이 허용되는 모든 곳에 프로토콜을 사용할 수 있습니다.
프로토콜 문법으로는 프로토콜의 정의는 클래스, 구조체, 열거형 등과 유사합니다.
protocol BlogProtocol {
...
}
class BlogClass : BlogClass, BlogProtocol {
...
}
서브 클래스에 적용할 경우 슈퍼클래스를 프로토콜 앞에 정의해줍니다!
정리하자면 프로토콜에서는 클래스 , 구조체 등과 같이 정의가 가능하고 익스텐션은 프로토콜과 같이 정의된 내용에 기능을
추가할 수 있는 기능으로 정리가 될 것 같습니다.
2. ARC(Auto Reference Counting)와 가장 큰 문제점?
사실 ARC는 내용이 엄청 길어질수 있을꺼 같아 간단하게 정리 후
나중에 추가적으로 다뤄볼 생각입니다.
ARC란 reference count를 통해 자동으로 메모리 관리를 해주는 것으로
객체에 대한 참조 카운트를 관리하고 0이 되면 자동으로 메모리를 해제해주는 것으로
2011WWDC에서 등장한 개념입니다.
(쉽게 생각해서 ARC는 더 이상 필요하지 않은 클래스 인스턴스를 자동으로 메모리에서 해제해주는것입니다!)
그럼 ARC의 가장 큰 문제점은 뭘까요?
- 순환 참조가 발생 시 영구적으로 메모리가 해제되지 않을 수 있습니다.
여기서 순환 참조란?
- 두 객체의 인스턴스의 프로퍼티가 서로 참조하고 있는 형태를 순환 참조라고 합니다.
그로 인해 발생될 수 있는 문제점으로는 strong으로 선언된 변수가 순환참조 됐을 때
RC(Reference Count)가 0이 되지 않아 메모리에서 해제가 되지 않아 발생하는 문제점이 생길 수 있습니다.
이 해결책으로 우리가 개발하면서 많이 볼 수 있는 weak와 unowned를 사용하게 되겠습니다!
이중에 weak(약한 참조)는 인스턴스를 참조할 때 RC를 증가시키지 않아 메모리에서 해제될때 자동으로
nil을 할당 시키면서 메모리가 해제하게 됩니다!
3. 옵셔널(Optional)이란?
ios 개발하면서 많이 볼 수 있는 옵셔널에 관한 질문을 받았는데
어떤 경우에 사용하는지 또 어떻게 사용하는지는 알고 있었지만, 개념을 쉽게 대답할 수 없었던 경험으로
정리해보기로 했습니다.
먼저 https://developer.apple.com/documentation/swift/optional/ 옵셔널 공식문서를 보시면 좋겠습니다.
첫 줄부터 옵셔널은 래핑된 값 또는 갑 nil의 부재를 나타내는 형식이라고 합니다.
쉽게 말해서 변수의 값이 nil일 수 있다는것을 말하는대요.
반대로 옵셔널이 아니면 nil값이 들어갈 수 없는것으로 표현 할때는
var sampleNum : Int? = 10
var sampleStr : String? = "String"
이런식으로 변수를 지정해 주면서 nil값이 들어갈 수 있도록 ? 표시로 옵셔널 표시를 해줍니다.
옵셔널을 해제 해줄때는 if let을 사용하여 변수의 값이 nil이 아닌 경우 !를 사용해서 해제할 수 있습니다.
자! 이번 글은 이렇게 세개의 주제를 가지고 작성해봤는데요.
이직을 준비하면서 아직 많이 부족한 점도 깨닫고 앞으로의 공부방향도 세울 수 있어
좋은 경험이 많이 된 것 같습니다! 😍
또 생각나는 질문이 있으면 추가로 작성하도록 하겠습니다!
완벽하지 않은 수 있어 질문과 지적해주시면 감사하겠습니다.
그럼 다음글에서 뵙겠습니다! 🥰
'[IOS][SWIFT]' 카테고리의 다른 글
[IOS][SWIFT] Mock Data를 이용한 UITableView 생성하기! (0) | 2022.02.11 |
---|---|
[IOS][SWIFT] FaceID, TouchID 구현해보기! (0) | 2022.01.13 |
[IOS][SWIFT] 소셜로그인(Kakao Login) 구현해보기! (0) | 2022.01.12 |
[IOS][SWIFT] 카카오맵(Kakao Map) 커스텀하기!(현재위치, 마커 메소드화) (3) | 2021.12.14 |
[IOS][SWIFT] 카카오 맵(Kakao map) 사용해서 지도 띄우고 마커 찍어보기! (1) | 2021.12.13 |