본문 바로가기

전체 글43

[Swift] 인터페이스 설계: 클래스 기반과 컴포지션 패턴의 비교 소프트웨어 설계에서 인터페이스와 클래스 구조를 어떻게 구성하느냐에 따라코드의 유지보수성, 확장성, 재사용성이 크게 달라집니다.이번 포스팅에서는 자동차 인터페이스를 설계하는 두 가지 접근 방식단일 클래스 기반 설계와 컴포지션 패턴을 비교해보고,이를 높은 응집력(High Cohesion)과 단일 책임 원칙(SRP) 관점에서 해석해 보겠습니다.1️⃣ 첫 번째 예제: 단일 클래스 기반 설계첫 번째 방법은 자동차의 각 기능을 구체적인 클래스에서 직접 구현하는 방식입니다.예를 들어 현대소나타, 현대아이오닉, 현대코나하이브리드와 같은 클래스는 각각 달리기, 멈추기그리고 각 자동차 유형에 맞는 경고 기능을 구현합니다.💡 인터페이스 정의protocol 달리기능력 { func 달리기()}protocol 멈춤능력 { fu.. 2024. 8. 13.
[iOS] 파이브 라인즈 오브 코드: 4장 요약 및 정리 (효율적인 코드 작성을 위한 리팩터링 기법 효율적인 코드 작성을 위한 리팩터링 기법들어가기 전에여러분, 코드 작성하면서 “이렇게 하면 유지보수가 쉬울까?” 고민해본 적 있으시죠?"파이브 라인즈 오브 코드"의 4장은 이런 고민을 해결할 수 있는 팁들을 가득 담고 있어요.제가 경험했던 코드 문제들과 함께 책에서 제시한 해결책을 나눠볼게요.4.1 간단한 if 문 리팩터링if 문에서 else를 사용하지 말 것여러분도 if-else 문을 작성하다가 코드가 너무 중첩되어서 복잡해진 경험 있으신가요?저도 그런 경험이 많아요. 예를 들어 나이 검사를 할 때: if age >= 18 { print("Welcome!")} else { print("You are not allowed.")} 이런 코드가 많아지면 가독성이 떨어지고 버그가 발생할 가능성이 높.. 2024. 7. 24.
[iOS] 파이브 라인즈 오브 코드: 1~3장 요약 및 정리 (리팩터링: 왜 필요하고 어떻게 할까?) 리팩터링: 왜 필요하고 어떻게 할까? 안녕하세요, 여러분!최근에 제가 개발하면서 느꼈던 불편함과 이를 해결하기 위해 리팩터링을 어떻게 적용했는지 공유해보려고 합니다. 요즘 iOS 개발을 하면서 코드가 점점 복잡해지는 걸 느꼈어요. 특히 유지보수가 어려워지고, 새로운 기능을 추가할 때마다 버그가 생기는 문제를 겪었죠.그래서 이번 기회에 리팩터링에 대해 진지하게 고민해보게 되었습니다. 이 책을 통해 여러분은 다음과 같은 내용을 배울 수 있습니다:  • 코드 가독성 향상: 가독성이 높은 코드를 작성하는 방법 • 효율적인 함수와 변수 사용법: 함수와 변수를 효율적으로 사용하는 방법 • 조건문과 반복문의 최적화: 조건문과 반복문을 최적화하여 성능을 높이는 방법 • 코드 분할과 리팩터링: 코드를 작은 단위로 분할하.. 2024. 7. 23.
[Swift] Task, async let, Task Group 동시 작업의 모든것 비동기 작업을 수행할 때, 여러 개의 작업을 동시에 진행해야 하는 경우가 있습니다. 이를테면, 두 개의 이미지를 다운 받고, 그 두개의 이미지를 return하는 작업이 있을 수 있습니다. 다음은 코드 예시입니다. func fetchTwoURLs() async throws -> (Data, Data) { let url1 = URL(string:"https://www.apeth.com/pep/manny.jpg")! let url2 = URL(string:"https://www.apeth.com/pep/moe.jpg")! let data1 = try await self.download(url: url1) let data2 = try await self.download(url: url2) return (data.. 2024. 3. 7.
[Swift] Actor, @MainActor, Task, Sendable의 모든것 Actor기본적으로 액터의 코드는 백그라운드 스레드에서 실행됩니다. Swift의 구조적 동시성에서 스레드는 낮은 수준에서 존재하며, 코드는 어떤 스레드에나 할당될 수 있습니다. 메인 스레드와 백그라운드 스레드의 구별은 중요하며, 이를 위해 '액터'라는 개념이 사용됩니다. 액터를 사용하면 코드가 어떤 스레드에서 실행되어야 하는지를 명시할 수 있으며, 이를 통해 복잡한 동시성 문제를 효과적으로 처리하고 코드를 깔끔하게 유지할 수 있습니다. Swift에서 Actor는 백그라운드 스레드에서 코드를 실행하는 데 도움이 되며, 멀티스레딩 코드를 안전하게 실행하는 데 중요한 역할을 합니다. 멀티스레딩 코드에서 가장 큰 문제점은 공유 상태의 문제입니다. 속성이 하나 이상의 스레드에서 변경될 수 있다면, 코드는 일관성 .. 2024. 3. 5.
[Swift] 비동기 메소드를 async/await 메소드로 변환하는 방법 (`withUnsafeContinuation`) Swift의 비동기 메소드를 async/await 메소드로 변환하기Swift 5.5는 비동기 프로그래밍을 간소화하는 새로운 기능을 도입했는데, 그 중 하나가 async/await 패턴입니다.이 패턴을 사용하면 비동기 코드를 알기 쉽고 깔끔하게 작성할 수 있습니다. 하지만 이미 작성된 비동기 메소드를 새로운 async/await 메소드로 변환해야 할 때가 있습니다.예를 들어, 아래와 같은 비동기 메서드가 있다고 가정합니다.이 코드를 수정할 수 없다면,어떻게 async/await 메서드에서 이 메서드를 호출할 수 있을까요?func download(url: URL, completionHandler: @escaping (Result) -> Void) { let task = URLSession.shared... 2024. 3. 2.