본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.
class/struct
클래스와 구조체를 구별해서 구현하는 것은 아직까진 영원한 숙제일 것 같다.
박스오피스 프로젝트를 하면서 NetworkManager라는 타입을 구조체로 구현하였다.
이 구조체는 URLSession을 사용하여 URL이 주어졌을 때, 그에 해당하는 data를 가져오는 역할을 하는 구조체이다.
이에 대해 지성께서 struct로 구현한 이유가 있냐고 물었고 나는 다음과 같이 답했다.
class는 다음과 같을 때 사용합니다:
1. 복사보다는 참조가 필요할 때
2. 상속해주거나 상속받을 일이 필요할 때
3. mutable한 값들을 가질 때
4. object-C와 상호 운용성을 가질 때
저희는 NetworkManager가 위와 같은 항목에 해당하지 않는다고 생각하여서 구조체로 구현하였습니다.
또한 애플에서는 클래스보다 구조체를 통해 구현하는 것을 장려합니다. 구조체가 유연성은 부족하지만 다음과 같은 장점들이 있기 때문입니다:
1. 간단함
2. 더 빠름
3. memory leak이 적음
4. thread safety를 더 보장함
5. true immutability를 지원함
위와 같은 장점들이 있어 애플에서는 클래스보다 구조체를 통해 구현하는 것을 장려하며 저희는 클래스로 구현할 이유가 없다고 생각하여 구조체로 구현하였습니다.
그리고 지성의 라이브 피드백을 받게 되었다😅
결론적으로 말하자면, 이것은 struct보다는 class로 구현하는 것이 더 나았을거라는 것이다.
네트워크를 담당하는 객체가 복사될 이유가 없다.
struct로 구현하면 여러개가 생길 우려가 있는데, 그렇게 되면 비용이 증가한다.
그래서 class를 통해 구현하고 final을 붙이는 법도 괜찮을 것이다.
앞서, 복사보다는 참조가 필요할 때 class를 사용하고 나머지의 경우는 struct를 사용한다고 했는데, 이 복사와 참조의 개념을 잡는게 중요하다.
복사를 하는 기준과 참조를 하는 기준을 잘 생각해보길 바란다.
또한, 범용성이 있는 객체는 class로 구현하는 것이 좋다.
매 페이지마다 decodeManager, networkManager 둘거냐.
매번 생성할 애들은 struct로 하지만, 그렇지 않은 아이들은 class로 구현해 범용성을 잡는게 좋다.
라는 식으로 말씀하셨다.
네트워크 통신 없이 Test하는 이유
중요한 것은 Test하는 방법이 아닌, 이 Test를 왜 하느냐라고 말씀하셨다.
왜 네트워크 통신이 없이 test를 할까?
그것은 네트워크가 껴버리면 test코드를 돌렸을 때 그 네트워크 상황에 따라 누군 실패하고 누군 성공하는 상황이 발생하기 때문이라고 하셨다.
즉, 신뢰도가 떨어진다는 것이다.
결국 본 코드의 로직만을 잘 테스트 하기 위해서 네트워크 통신이 없이 test를 진행하는 거라고 하셨다.
'YAGOM CAREER STARTER' 카테고리의 다른 글
[TIL] 20230404: URLSession (0) | 2023.04.05 |
---|---|
[TIL] 20230330: Escaping closure/Defer (0) | 2023.04.04 |
[TIL] 20230321: Fetching Website Data into Memory (0) | 2023.03.25 |
[TIL] 20230317: Responder Chain / Touch Event (0) | 2023.03.18 |
[CODE STARTER 복습] 20230317: week01 (0) | 2023.03.17 |