이 포스트는 꼼꼼한 재은씨의 스위프트 기본편을 보고 스스로 공부한 내용을 정리한 포스트 입니다.


예제 코드


참고 자료


리팩토링 (Refactoring)

  • 소프트웨어 공학에서 리팩토링(Refactoring)코드의 결과나 성능에는 영향을 미치지 않고 단지 가독성과 유지 보수의 편의를 위해 더 세련되고 구조화된 코드로 변경하는 것을 말한다.

    • 전체적인 맥락에서 구조적 변화를 주어 유지보수하기 편리하도록 코드를 개선하는 것이 리팩토링 과정이다.

dataSourceImage-2

  • MyMovieChart도 마찬가지이다. 반복적인 코드를 작성했지만, 위의 그림의 코드만으로는 네 번째 데이터를 추가하기가 참 번거롭다.

  • 데이터만 추가하면 되는 것이 아니라 그에 따른 코드들도 계속 추가해 주어야 하기 때문이다.

  • 각 데이터를 추가하는 과정은 모두 거의 동일하다.

  • 데이터를 추가하는 과정을 공통으로 엮고 데이터 세트만 따로 관리하는 방식으로 리팩토링 할 수 있다.

  • 데이터 세트를 구성할 때에는 가급적 프로그래밍 로직이 포함되지 않게 하는 것이 좋다. 그래야 데이터를 넣고 빼기가 쉽다.

  • 튜플이 적절한 자료 구조로 사용되는 이유가 여기에 있다. 데이터를 단순 나열하고 묶을 때에는 튜플만큼 편리한 것이 없다.


리팩토링 - 데이터 세트 정의

refactoringImage-1

  • 클래스 전체에서 참조할 수 있도록 프로퍼티로 선언하면서 동시에 튜플을 이용해서 데이터 세트를 구성했다.

  • 데이터 세트 사이에 스위프트 코드가 추가된 것이 아니기 때문에 데이터를 추가하거나 삭제하기가 편리하다.

  • 리팩토링 이전의 코드에서 데이터를 추가하기 위해 작성해야 했던 구문들을 보면 튜플로 데이터 세트를 구성한 것이 유지 보수를 편하게 만들어 준다는 것을 알 수 있다.


리팩토링 - 데이터 세트를 이용하여 list 배열에 담기

  • 아래의 그림을 보면 알 수 있듯이 구성된 데이터 세트를 이용하여 MovieVO 타입의 인스턴스를 만든 다음 list 배열에 담아준다.

  • for ~ in 구문을 사용하여 데이터 세트를 순회하면서 값을 차례로 list 배열에 넣어준다.

  • 클로저를 이용하여 프로퍼티 초기화 구문을 활용한다.

refactoringImage-2

  • 기존 코드는 var list = [MovieVO]() 이와 같은 단순 선언 및 초기화 구문뿐이었다.

  • 이 구문에 클로저를 이용한 리턴 값을 대입하고, 초기화 한다.

  • 클로저에서는 데이터 세트에 정의된 데이터들을 for 루프 구문으로 순회하면서 차례로 인스턴스를 만들어 배열 변수 datalist에 차곡차곡 담는다.

  • 모든 순회가 끝나고 나면 datalist를 리턴한다. 이를 통해 list 프로퍼티에는 데이터 세트를 이용하여 정의한 데이터들이 차례로 대입된다.


리팩토링 - 배열 변수 lazy var list

  • 배열 변수 list에는 리팩토링 과정에서 lazy 키워드가 추가되었다.

    • 여기에는 두 가지 이우가 있다.

      • 1), 미리 생성해서 메로리를 낭비할 필요가 없기 때문이다.

        • lazy 키워드를 붙여서 변수를 정의하면 참조되는 시점에 맞추어 초기화되므로 메모리 낭비를 줄일 수 있다.
      • 2), lazy 키워드를 붙이지 않은 프로퍼티는 다른 프로퍼티를 참조할 수 없기 때문이다.

        • list 배열 변수를 초기화하는 데에는 dataset 프로퍼티가 필요하다.

        • 하지만 프로퍼티들이 초기화되는 순서는 우리가 컨트롤할 수 있는 범위를 벗어나기 때문에 list 배열 변수의 클로저가 실행되는 시점에 dataset 배열이 초기화되어 있다고 보장할 수 없다. 때문에 일반 저장 프로퍼티끼리는 서로 참조할 수 없다.

        • 하지만 lazy 키워드가 붙은 프로퍼티는 다른 일반 프로퍼티들이 초기화된 후 맨 마지막에 초기화될 뿐만 아니라, 초기화되는 시점도 우리가 통제할 수 있다.

        • 따라서 lazy 키워드가 붙은 프로퍼티의 초기화 클로저 구문 내에서는 다른 일반 프로퍼티를 참조하는 것도 가능하다.

        • dataset 프로퍼티를 참조해야 하는 list 프로퍼티에 lazy 키워드가 추가된 것은 이같은 이유 때문이다.


리팩토링 전과 후

  • viewDidLoad() 메소드에 작성된 모든 내용을 제거한다.

  • 이 메소드에서 처리했던 데이터 초기화는 데이터 세트와 프로퍼티 초기화 구문으로 나누어 구현되었다.

dataSourceImage-2

  • 위의 그림은 리팩토링 전 코드이다.

refactoringImage-1

  • 위의 그림은 리팩토링 후 코드이다.