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


예제 코드


참고 자료


데이터 소스

  • 일반적으로 테이블 뷰를 이용하여 화면에 콘텐츠를 표현하는 방법에는 두 가지가 있다.

    • 1), 정적인 방법 (Storyboard)

    • 2), 동적인 방법 (Programmatically)

  • 정적인 방법은 테이블 뷰 셀 각각을 프로그래밍적으로 구성하지 않고 스토리보드에서 직접 구성한 것을 말한다.

    • 실제로 테이블이 표현할 콘텐츠가 정적인 내용을 담고 있다면 정적 방법을 사용하여 테이블 뷰를 구성하는 경우도 있다.

iOSsettingImage-1

  • 정적인 방법의 예를 들어 보면 iOS 설정 화면을 들어볼 수 있다.

    • 설정 화면은 각 항목이 프로그래밍적으로 늘어나거나 줄어들 일이 없기 때문에 정적인 형태로 구성하기에 알맞은 조건을 갖추고 있다.
  • 테이블 뷰 컨트롤러를 처음 생성하면 테이블 뷰의 속성은 동적 타입으로 지정되어 있다.

    • 테이블 뷰 컨트롤러의 'Content'속성에서 기본으로 설정되어 있는 Dynamic Prototype을 Static Cells로 바꾸면 정적 타입의 테이블 뷰 속성이 된다.
  • 테이블 뷰를 정적 타입으로 바꾸면 기존의 프로토타입 셀은 사라지고 그 자리를 정적인 형식의 셀이 채우게 된다.

    • 이 셀들은 프로토타입 셀과 달리 화면에 직접 표현되므로 필요한 콘텐츠를 직접 올려서 구현할 수 있다.
  • 반면 고정되지 않고 매번 갱신되는 내용을 표현하려면 테이블 뷰 셀을 프로그래밍적(Programmatically)으로 구성해주어야 하는데, 이를 위해 데이터 소스가 필요하다.

  • 데이터 소스는 테이블 뷰의 각 행마다 대응할 수 있도록 '배열 형태'이기만 하면 된다.

  • 이렇게 만들어진 데이터 소스를 테이블 뷰 각 행에 연결하는 과정을 'Data Binding (데이터 바인딩)'이라고 한다.


데이터 소스 만들기

  • 영화 콘텐츠를 담을 데이터 소스.

dataSourceImage-1

  • 위의 그림의 클래스는 영화 정보를 담기 위한 객체이다.

  • 위의 그림에 나와있는 클래스에는 몇 개의 프로퍼티가 정의되어 있다.

    • 이들 변수 각각에 값을 저장하지만, 전달할 때는 MovieVO 클래스의 인스턴스 자체를 전달하게 된다.

    • 값을 주고받을 때 개별 변수가 아니라 클래스 인스턴스 자체가 전달되므로 각 변수에 저장된 값들의 관련성이 유지될 수 있음은 물론, 여러 개의 변수가 필요하지도 않다.

    • 이렇게 만들어진 클래스 인스턴스는 테이블 뷰의 셀 하나하나를 구성하는 데이터 소스로 사용된다.

    • 각각의 프로퍼티는 비어있을 수도 있으므로 옵셔널 타입으로 선언된다.


Value Object 패턴

  • 데이터 저장을 전담하는 클래스를 별도로 분리하는 설계 방식을 Value Object 패턴이라고 부르고, 줄여서 VO라고 한다.

    • 객체 지향 설계에서는 매우 자주 활용되는 방식이다.
  • Value Object 패턴은 보통 데이터 저장을 위한 클래스임을 쉽게 식별할 수 있게 하려고 클래스의 마지막에 VO라는 접미사를 붙인다.

  • VO 패턴을 쉽게 생각하자면 일종의 식판이라고 할 수 있다.

    • 밥그릇, 국그릇 등을 올려놓는 식판.

    • 식판 위에 올라가는 밥그릇, 국그릇 반찬 그릇 등에는 밥이나 국 그리고 반찬이 담기듯이 VO패턴의 클래스에 올려지는 각종 변수들은 해당하는 데이터를 담는 역활을 한다.

    • 밥그릇에 밥을 담고 국그릇에 국을 담고 반찬 그릇에 반찬을 담아 식판 위에 올려놓은 다음 식탁으로 갈 때에는 각각의 그릇들을 들고 가는 것이 아니라 식판 하나만 들고 가면 된다.

    • 식판을 들고 가면 자연스레 밥과 국, 반찬은 함께 이등하게 된다. VO패턴도 마찬가지 이다.

    • 클래스 인스턴스 내부의 속성에 각각의 데이터들을 담은 다음, 전달할 때에는 클래스 인스턴스 전체를 전달하기 때문에 자연스레 클래스 내부의 변수에 저장된 값도 함께 전달된다.


영화 데이터 넣어주기

dataSourceImage-2

  • viewDidLoad()는 뷰 컨트롤러가 초기화되면서 뷰가 메모리에 로딩될 때 호출되는 메소드이다. 이곳에 코드를 작성해 두면 처음 한 번만 실행되는 로직을 구현할 수 있다.

  • 위의 그림에서보면 MovieVO 클래스를 인스턴스로 만든 다음, 인스턴스의 속성에 적절한 값을 임의로 넣어주고 있다.

  • 값이 입력되고 나면 list 프로퍼티에 추가한다.

    • list 프로퍼티는 배열 타입으로, 순서대로 생성된 데이터를 저장하고 있다가 테이블 뷰를 구성할 때 각 행에 맞는 MovieVO 타입의 아이템을 하나씩 꺼내서 전달하게 된다.

dataSourceImage-3

  • 맨 처음 생성된 mvo 인스턴스를 list 배열에 넣어주고 난 후의 구문에 주의할 필요가 있다.

    • 두 번째 데이터를 작정하기 위해 다시 mvo 인스턴스를 새로 생성하는 구문 말이다. 위의 그림에서 빨간색 네모 참조.

      • mvo = MovieVO()
  • 지금까지 인스턴스를 생성할 때 대부분은 새로 변수나 상수를 정의하여 대입하였다.

    • 그러나 지금은 기존의 변수 mvo를 재사용하고 있다.

    • 보통 이와 같이 입력에 한 차례 사용하고 난 변수를 재사용할 때에는 기존 값을 지우고 다시 새로운 값으로 덮어쓴 다음 사용하면 된다.

    • 그런데 여기서 사용하는 MovieVO는 클래스이다. 이는 래퍼런스 타입이므로, 일단 list 배열에 값을 넣은 후에도 여전히 mvo 변수와 서로 연결되어있다.

    • 이 상황에서 그냥 mvo 변수의 속성에 새로운 값을 덮어쓴다면 이미 list 배열에 저장된 모든 값들도 함께 변경되어 버린다. -> Reference Type과 Value Type를 읽고 다시 보면 훨씬 이해하기 쉽다.

    • 따라서 새로운 값을 대입하기 위해서는 기존의 MovieVO 인스턴스의 연결을 끊고 새 연결을 만들어 줄 필요가 있다.

    • 이를 위한 방법이 새로운 인스턴스를 생성하여 대입하는 위 그림의 빨간 네모안에 있는 구문이다.

      • 이렇게 mvo 변수에 저장된 래퍼런스를 끊고 새 인스턴스를 넣어주면 mvo 변수에서 발생하는 값의 변화가 기존 list 배열에 영향을 미치지 않는다.
    • 이로써 서로 다른 데이터를 생성하여 넣어줄 수 있다.