[내일배움캠프 10일차] 2주차 과제 및 알고리즘

NH·2025년 3월 14일

내일배움캠프

목록 보기
10/62
post-thumbnail

📌 Week I Learned (WIL) - 2주차

이번 주에는 다양한 개념을 배우고 적용해 보았다.
특히, 계산기 과제를 통해 코드 리팩토링, 추상화, 의존성 역전 원칙(DIP)을 경험할 수 있었다.
또한 Swift 마크업에 대해 알게 되었고, 기본 알고리즘 문제 풀이도 진행했다.


🚀 1. 2주차 계산기 과제 해결

✅ Lv 단계별 리팩토링

  • 처음에는 단순한 사칙연산을 수행하는 클래스를 구현
  • 점점 코드를 개선(리팩토링)하면서 유지보수성을 높이는 방향으로 발전

✅ 고민과 해결 과정

1) return 없이 print만 해도 될까?

  • 처음엔 계산 결과를 print하는 방식으로 구현했지만, 값을 반환하는 것이 더 유용하다는 걸 깨달음
  • 이렇게 하면 다른 메서드에서 결과를 활용할 수도 있고, 테스트하기도 쉬워짐

2) guard vs if-else, 예외처리는 어떻게 할까?

  • 나눗셈에서 0으로 나눌 때 예외처리를 해야 했음
  • guard를 사용하면 초기 조건을 확인하고 빠르게 탈출할 수 있어 코드가 더 깔끔해짐
  • if-else보다 guard가 더 적절한 경우를 체감함

3) 클래스에서 프로토콜을 프로퍼티로 사용해도 될까?

  • Calculator 클래스에서 AbstractOperation을 프로퍼티로 선언하려고 고민
  • 그런데 연산이 실행될 때마다 다른 연산을 사용할 수도 있어야 했음
  • 그래서 프로퍼티가 아니라 메서드의 매개변수로 전달하는 방식으로 변경
  • 이렇게 하면 유연성이 증가하고, 객체 간 결합도를 낮출 수 있음

✅ 추상화 및 의존성 역전 원칙(DIP)

🔹 처음에는 Calculator 클래스가 직접 사칙연산을 수행했음

class Calculator {
    func add(_ a: Int, _ b: Int) -> Int { return a + b }
    func subtract(_ a: Int, _ b: Int) -> Int { return a - b }
}
  • 이 방식의 문제점?
    • Calculator각 연산에 강하게 의존하고 있음
    • 새로운 연산을 추가하려면 Calculator 내부를 수정해야 함 → 확장성이 낮음

🔹 프로토콜(AbstractOperation)을 활용해 추상화 적용

protocol AbstractOperation {
    func calculation(_ num1: Double, _ num2: Double) -> Double?
}

class AddOperation: AbstractOperation {
    func calculation(_ num1: Double, _ num2: Double) -> Double? {
        return num1 + num2
    }
}
  • 이제 연산이 필요할 때마다 다른 클래스에서 가져다 쓰기만 하면 됨
  • Calculator가 특정 연산 클래스에 의존하지 않음 → 의존성 역전 원칙(DIP) 적용

🔹 Calculator 클래스가 프로토콜을 활용하도록 변경

class Calculator {
    func calculate(_ operation: AbstractOperation, _ num1: Double, _ num2: Double) -> Double {
        return operation.calculation(num1, num2) ?? 0.0  // 기본값 0.0 반환
    }
}

💡 이제 Calculator는 특정 연산에 의존하지 않음
새로운 연산을 추가해도 Calculator 코드를 수정할 필요가 없음 → OCP(개방-폐쇄 원칙)도 적용됨


📝 2. Swift 마크업 문법 학습

  • 마크업(Markup)을 활용하여 코드에 주석을 체계적으로 정리하는 방법을 배움
  • ///을 이용하여 Xcode Quick Help에 정보를 제공하는 법 학습
/// 두 수를 더하는 함수
/// - Parameters:
///   - num1: 첫 번째 숫자
///   - num2: 두 번째 숫자
/// - Returns: 두 수의 합
func add(_ num1: Int, _ num2: Int) -> Int {
    return num1 + num2
}

💡 Xcode Quick Help(⌥ Option + 클릭)에서 위와 같은 정보를 확인할 수 있음


🤖 3. 알고리즘 문제 풀이

이번 주에는 기초 알고리즘 문제들을 해결했다.

  • 두 수의 합
    • a + b 간단한 연산을 활용
  • 몫 구하기
    • a / b 연산을 활용하여 몫만 반환
  • 짝수의 합
    • for-in 문과 if 조건문을 이용하여 짝수만 더하기
  • 문자 반복 출력하기
    • 2중 for 문을 사용하여 특정 문자를 특정 횟수만큼 반복 저장
  • 중복된 문자 제거
    • Arrary()String() 활용하여 타입 변형
    • contains 를 사용하여 중복 문자 제거

🏁 이번 주를 돌아보며

배웠던 것

  • 계산기 과제를 하면서 객체지향 프로그래밍에서 중요한 개념들을 배웠다.
  • 마크업 주석을 사용하여 내가 만든 코드에 설명을 추가하는 방법을 배웠다.
  • 알고리즘 문제 풀이를 하면서 간략하게 순서도를 구상해보면서 어떻게 문제를 처리해야는지,
    자료구조에 대한 짧은 지식과 Swift 문법의 사용 능력을 높혔다.

느꼈던 것

  • 객체지향 프로그래밍(OOP)의 핵심 개념추상화와 DIP를 처음 적용해보면서 왜 중요한지 체감했다.
  • Swift 마크업 주석을 이용하면 내 코드가 더 명확해지고, 협업할 때 큰 도움이 될 것이라는 점을 깨달았다.
  • 기본 알고리즘 문제들을 풀면서 Swift 문법을 더 익숙하게 다룰 수 있게 되었다.

앞으로 개선하고 싶은 것

  • 계산기 과제
    • 객체지향 프로그래밍에서 지향하는 방식으로 코드를 작성하는 법
  • 알고리즘
    • 자료구조에 대해서 지식이 부족한 점
    • Swift 문법 활용 능력
    • Swift 에서 기본적으로 지원하는 메소드에대해서 더 많이 알고싶다.

---
profile
iOS 개발 블로그

0개의 댓글