본문 바로가기
개린이 이야기

Swifty한 Swift 코드에 관하여

by iOS 개린이 2023. 5. 30.

소개

Swift다운 코드란 무엇일까요?

 

Swift 언어를 배우고 사용하면서, Swift의 기본 문법에 대해 이해하고, 어떻게 사용하는지 알아가며 경험을 쌓아왔습니다.

하지만 문득 이런 생각이 들었습니다.

"내가 작성하는 코드는 좋은 코드인가?", "내가 Swift를 정확히, 효율적으로 사용하고 있는 것일까?" 

 

좋은 코드라는 것은 여러 방면에서 광범위한 의미를 가질 수 있습니다.

하지만 우리가 사용하는 언어는 Swift이고, Swift는 Apple이 특정한 설계 원칙과 의도를 가지고 만든 언어입니다.

그러므로, 그 의도에 맞게 언어를 사용하는 것이 좋은 코드를 작성하는 가장 기본적인 목표가 될 것이라 생각합니다.

 

또한 어떤 강의에서 감명 깊게들은 말이 있습니다.

"개발자의 기능 구현은 당연한 것이고, 이 이상의 확장성에 대해 치열하게 고민해야 한다."

이 말은 단순히 동작하는 앱을 만드는 것을 넘어, 효율적이고 확장성 있는 앱을 만들기 위해 노력하는 개발자가 되야 함을 의미하는 것 같습니다. 

그리고 Swift다운 코드를 작성하는 것은 이를 위한 첫 걸음이 될 것이라고 생각합니다.

 

따라서 이 글에서는 Swift다운 코드를 작성하는 방법에 대해 탐구해보려고 합니다.

아직 완성된 글이 아니고, iOS 개발자로서 성장 과정 중에 알게되는 지식들을 계속 추가하고 수정해 나갈 예정입니다.

 

 

Swift의 존재 이유

우리는 왜 Swift다운 Swift 코드를 작성해야 할까요?

Swift 라는 언어의 존재 이유에 대해서 먼저 알아봐야겠죠?

Swift의 탄생 배경을 이해하기 위해서 Objective-C 언어의 한계와 문제점을 이해해야 합니다.

Objective-C는 1980년대에 개발된 언어로, C 언어 위에 객체지향 기능을 추가한 것이 특징입니다. 때문에

C 언어의 복잡성을 그대로 가지고 있었으며, 그에 따라 코드의 가독성이 떨어졌습니다.

또한, Objective-C의 메모리 관리(MRC)는 개발자에게 많은 부담을 주었고, 자료형 안전성이 떨어져 런타임 에러를 일으키는 경우가 많았습니다.

이런 문제를 해결하기 위해, Swift가 탄생했습니다.

Swift는 C와 호환성을 포기하고(직접적인 호환을 말함), 대신 안전성, 속도, 간결한 문법을 지향했습니다. 

또한 함수형 프로그래밍 패러다임과 프로토콜 지향 프로그래밍을 도입하여 코드를 더욱 간결하고 유연하게 작성할 수 있도록 했습니다.

배경을 보면, 안전성, 속도 그리고 함수형 및 프로토콜 프로그래밍의 도입 등 Swift의 특징을 잘 알 수 있습니다.

우리는 이 언어의 특징을 살릴 수 있도록 코드를 작성해야 문제가 발생하지 않습니다. 대표적인 예로 강제언래핑이 있습니다. 강제 언래핑은 Swift의 안전성에 어긋나며, 사용하면 런타임 오류가 증가합니다.

즉, 코드의 퀄리티, 프로젝트의 안정성 등의 이유로 Swift 언어를 이해하고, Swift다운 코드를 작성해야 합니다.

 

 

Swift다운 Swift 코드를 작성하는 방법

 

1. 안전한 코드 작성에 대한 이해

Swift는 안전성을 우선시하는 언어로서 옵셔널, 에러 처리 등을 통해 안전한 코드를 작성할 수 있습니다.

이러한 메커니즘들을 이해하고 활용하는 것은 Swift의 핵심 원칙 중 하나입니다.

이를 통해 예상치 못한 상황을 미리 대비하고, 코드의 안정성과 신뢰성을 향상시킬 수 있습니다.

 

2. 함수형 프로그래밍에 대한 이해 

Swift는 함수형 프로그래밍의 요소를 포함하고 있습니다.

고차함수, 클로저 등의 함수형 프로그래밍 요소를 이해하고, 어떻게 활용하는지 배워야 합니다.

이를 통해 더 간결하고, 가독성 높은 코드를 작성할 수 있으며, 변경에 따른 부작용을 최소화할 수 있습니다.

 

3. 프로토콜 지향 프로그래밍에 대한 이해

Swift는 프로토콜 지향 프로그래밍을 강조합니다. 

프로토콜은 특정 역할을 수행하기 위한 메서드, 속성 등의 청사진을 제공합니다.

이를 이해하고, 어떻게 사용되는지, 프로토콜을 통해 어떻게 코드를 유연하게 만드는지 배워야 합니다.

프로토콜을 통해 다양한 타입 간의 상호작용을 추상화하고, 의존성을 관리할 수 있습니다.

 

 

안전한 코드 작성에 대한 이해

1. 옵셔널, 옵셔널 바인딩, 가드문 등을 활용하기.

2. 에러 처리구문(throw, catch 등)을 통해 런타임 에러를 줄이기.

 

3. 값 타입(Value Types 사용)

-Swift에서는 일반적으로 데이터를 공유하는 것보다 복사본을 만들어 전달하는 방식이 권장됩니다.

이는 참조 타입과는 다르게,  원본 데이터의 예상치 못한 변경이나 부작용을 방지할 수 있기 때문입니다.

 

"왜 값 타입은 참조 타입보다 부작용을 방지하나요?"

값 타입은 스택 영역에 할당되며, 반면 참조 타입은 힙 영역에 할당됩니다. 

스택 영역에 저장되는 데이터는 함수의 수명주기에 종속되어 자동으로 해제되므로 외부에서 해당 데이터에 접근할 수 없습니다. 이는 런타임 중 데이터가 동적으로 변경될 수 있는 힙 영역에 비해 메모리 관리에 안정성을 제공합니다.

"그럼 항상 값 타입을 사용하는 것이 최선일까요?"

Swift에서 값 타입과 참조 타입을 선택하는 것은 상황에 따라 달라집니다.

물론, Swift는 안정성을 중요시하는 언어이므로 일반적으로는 값 타입의 사용을 권장합니다.

그러나 참조 타입이 필요한 경우도 있습니다.

1) 데이터 공유

참조 타입은 단일 인스턴스를 여러 곳에서 참조하여 데이터를 공유할 수 있습니다.

이것은 여러 객체에서 동일한 데이터를 공유해야 하는 경우에 적합합니다.

예를 들어, 사용자의 프로필 정보를 여러 화면에서 동시에 업데이트해야 하는 경우, 참조 타입을 사용하는 것이 효과적입니다.

2) 성능

값 타입은 데이터가 필요할 때마다 전체 데이터를 복사하는 특징이 있습니다.

따라서 큰 데이터 구조를 다룰 때, 값 타입의 이런 특징은 메모리 성능 상 문제를 가져올 수 있습니다.

반면에 참조 타입은 데이터의 복사를 피하고, 참조만을 생성하기 때문에 성능 상의 이점을 가질 수 있습니다.


물론 값 타입이 항상 전체 데이터를 복사하는 것은 아닙니다.

Copy-on-Write라는 지연 복사 기능 덕분에, 데이터에 직접적인 수정이 이루어지지 않는 한,

새로운 복사본을 만들지 않고 데이터를 공유합니다. 이는 값 타입의 성능을 최적화합니다.

그러나 Copy-on-Write가 적용되지 않거나, 실제로 큰 데이터를 복사해야 하는 경우, 참조 타입의 사용이 이상적일 수 있습니다.
이러한 방식으로, 값 타입과 참조 타입의 각 특징에 대해 이해하고, 적절한 상황에서 사용하는 것이 중요합니다.

 

 

4. 순환 참조 피하기

https://iosjiho.tistory.com/59 ARC에 관한 내용.

https://iosjiho.tistory.com/60 강한 순환 참조에 관한 내용.

https://iosjiho.tistory.com/125 WWDC-ARC 세션 정리

 

ARC는 어떻게 메모리를 관리하는 지 이해하고 계신가요?

'weak', 'unowned' 만 사용하면 모든 문제가 해결될까요?

우리는 Swift의 메모리 동작방식에 대해 깊게 이해하며

더 나은 메모리 안전성을 위한 코드를 작성할 수 있어야 합니다.

 

 

함수형 프로그래밍에 대한 이해

-https://iosjiho.tistory.com/67 

 

해당 글은 Swift의 함수형 프로그래밍 패러다임에 대해서 정리한 글입니다.

함수형 프로그래밍이 무엇인지, 왜 배워야 하는지, 어떤 개념들이 있는지 등에 대한 내용으로 구성되어 있습니다.

이를 학습하면서 다음과 같은 과정을 거쳤습니다.

 

1. Swift에서 사용되는 클로저, 고차함수 등 함수의 개념에 대해서 이해한다.

 

2. 학습한 개념들이 Swift에서 어떻게 사용되고 있는지, 그리고 이런 개념들을 사용함으로써 어떤 이점이 있는지를 학습한다.

예를 들어, 고차함수의 정의를 살펴보고, 실제로 사용되는 구현부의 코드도 뜯어보면서 어떻게 사용되는지 이해한다.

 

3. 이러한 이해를 바탕으로 함수형 프로그래밍의 특징, 함수형 프로그래밍을 사용해야 하는 이유, 그리고 한계점 등을 학습한다. 

 

이런 방식의 학습은 Swift의 함수형 프로그래밍을 이해하는데 많은 도움이 되었습니다.

그저 함수형 프로그래밍에 대해서 학습하는 것보다는,

우리가 사용하는 Swift의 입장에서 바라보는 함수형 프로그래밍을 목표로 학습하는 것이 중요하다고 생각합니다.

 

 

프로토콜 지향 프로그래밍에 대한 이해

-https://iosjiho.tistory.com/130 

 

해당 글은 Swift의 프로토콜 지향 프로그래밍에 대해서 정리한 글입니다.

프로토콜 지향 프로그래밍이 무엇인지, 이점, 어떻게 사용할지 등의 내용으로 구성되어 있습니다.

 

Swift에서 프로토콜 지향 프로그래밍의 이해는 필수적인 부분입니다.

프로토콜은 코드의 추상화를 높여 유연성과 재사용성을 향상시킬 수 있습니다.

 

이 주제를 학습하면서 함수형 프로그래밍을 학습했던 방식과 동일하게 접근했습니다.

먼저 관련 개념들을 이해하고, Swift 표준 라이브러리에서 어떻게 적용되는지 찾아보는 것입니다.

또한 Swift에서 프로토콜 지향 프로그래밍을 왜 중요하게 생각하는지, 어떤 상황에서 프로토콜을 사용해야 하는지를 이해하기 위해서 WWDC 세션을 찾아 정리해보았습니다.

 

 

Swift API Design Guidelines 이해

-https://iosjiho.tistory.com/132

 

Swift에도 Swift만의 코드 컨벤션이 존재합니다. 그것은 바로 Swift API Design Guidelines입니다.

이 가이드라인은 코드의 작성 방법, 규칙 등에 대해서 예제와 함께 자세하게 알려주고 있습니다.

이를 숙지함으로써 가독성 및 일관성있는 코드를 작성할 수 있습니다.

또한 Swift 표준 라이브러리가 이 가이드라인을 준수하도록 작성되어 있기 때문에 Swift 코드를 보다 쉽게 이해할 수 있습니다.