IMCAT.DEV
로그인 가입
Dart 고급 문법

Dart 코드 리팩토링 기법

Dart 코드 리팩토링 기법 — 고급

코드 리팩토링 기법

1. 도입 (왜 배워야 하는가)

코드 리팩토링은 기존 코드를 개선하여 가독성을 높이고 유지 보수를 용이하게 만드는 과정입니다. 실무에서는 프로젝트가 커질수록 코드의 복잡성이 증가하게 되며, 이로 인해 기능 추가나 버그 수정이 어려워질 수 있습니다. 리팩토링을 통해 코드의 구조를 명확히 하고, 중복을 제거하며, 효율성을 높일 수 있습니다.

리팩토링을 하지 않으면 다음과 같은 문제가 발생할 수 있습니다:

  • 코드의 가독성이 떨어져 팀원 간의 협업이 어려워진다.
  • 버그 발생 가능성이 높아져 품질이 저하된다.
  • 새로운 기능을 추가하는 데 많은 시간이 소요된다.
  • 2. 핵심 개념 설명

    리팩토링의 주요 개념은 다음과 같습니다:

    용어정의
    중복 제거동일한 코드가 여러 곳에 존재하는 것을 없애는 것
    함수 추출긴 함수를 더 작은 함수로 나누는 것
    변수 이름 변경의미 있는 이름으로 변수의 이름을 바꾸는 것

    비유하자면, 리팩토링은 집을 리모델링하는 것과 같습니다. 원래의 집(코드)은 사용할 수 있지만, 더 나은 디자인과 기능성을 위해 공간을 재배치하거나 불필요한 구조물을 제거합니다.

    3. 기본 코드 예제

    아래는 리팩토링 전후의 코드 예제입니다.

    리팩토링 전:

    void printUserInfo(String name, int age) {
      print('Name: $name');
      print('Age: $age');
    }

    리팩토링 후:

    void printUserInfo(String name, int age) {
      _printName(name);
      _printAge(age);
    }
    
    void _printName(String name) {
      print('Name: $name');
    }
    
    void _printAge(int age) {
      print('Age: $age');
    }

    실행 결과:

    Name: John
    Age: 30
  • 첫 번째 줄: printUserInfo 함수가 사용자의 이름과 나이를 출력하는 역할을 한다.
  • 두 번째 줄: 이름을 출력하는 _printName 함수를 호출한다.
  • 세 번째 줄: 나이를 출력하는 _printAge 함수를 호출한다.
  • 리팩토링을 통해 코드가 분리되어 가독성이 향상되었다.
  • 4. 실전 활용 예제

    예제 1: 쇼핑몰에서 장바구니를 구현할 때

    class Cart {
      List<String> items = [];
    
      void addItem(String item) {
        items.add(item);
        print('Item added: $item');
      }
    
      void checkout() {
        _processPayment();
        _generateReceipt();
      }
    
      void _processPayment() {
        print('Payment processed.');
      }
    
      void _generateReceipt() {
        print('Receipt generated.');
      }
    }

    이 예제에서는 장바구니에 아이템을 추가하고 결제를 처리하는 기능을 명확하게 나누어 코드의 가독성을 높였습니다.

    예제 2: 사용자 정보 업데이트

    class User {
      String name;
      int age;
    
      User(this.name, this.age);
    
      void updateUser(String newName, int newAge) {
        _updateName(newName);
        _updateAge(newAge);
      }
    
      void _updateName(String newName) {
        name = newName;
      }
    
      void _updateAge(int newAge) {
        age = newAge;
      }
    }

    이 예제는 사용자 정보를 업데이트하는 기능을 리팩토링하여 각 업데이트 기능을 분리했습니다.

    5. 흔한 실수와 주의사항

    1. 중복 코드 제거를 소홀히 하기
    2. - 잘못된 코드:

         void doSomething() {
           print('Action 1');
           print('Action 2');
         }
         void doSomethingElse() {
           print('Action 1');
           print('Action 2');
         }

      - 올바른 코드:

         void performAction() {
           print('Action 1');
           print('Action 2');
         }
         void doSomething() {
           performAction();
         }
         void doSomethingElse() {
           performAction();
         }
    3. 함수의 책임을 과도하게 부여하기
    4. - 잘못된 코드:

         void complexFunction() {
           // 많은 작업 수행
         }

      - 올바른 코드:

         void complexFunction() {
           taskOne();
           taskTwo();
         }

      6. 정리

    5. 리팩토링은 코드의 가독성을 높이고 유지 보수를 용이하게 한다.
    6. 중복 제거, 함수 추출, 변수 이름 변경과 같은 기법을 활용할 수 있다.
    7. 실전에서는 장바구니 관리나 사용자 정보 업데이트와 같은 상황에서 유용하다.
    8. 다음에 학습하면 좋은 주제: 테스트 주도 개발(TDD), 디자인 패턴.