swift TableView & CollectionView

👩🏻‍🏫 오늘의 학습목표 👨🏻‍🏫

  1. Protocol의 개념을 이해한다.
  2. Datasource와 Delegate의 개념을 이해한다.
  3. TableView와 CollectionView가 무엇이며, 언제 활용되는지 이해한다.

🔅KEYWORD🔅

1️⃣ 프로토콜 지향 언어

애플은 이제 더이상 객체지향프로그래밍이 아니었네...

  • 애플은 2015년 9월, 스위프트 버전 2.0을 발표하면서 지난 수십년간 사용했던 객체지향 프로그래밍(OPP)이 아닌 프로토콜 지향프로그래밍(POP)이라고 발표했다.
    -> 쉽게 말하면 class를 통한 OPP가 struct와 protocol을 통한 POP으로 바뀌고 있다! 라고 할 수 있다.

그럼 왜 갑자기 프로토콜 지향 프로그래밍으로 바꿨는데?

  1. 프로토콜 지향 프로그래밍은 상속이 필요한 프로그램을 짤 때도 clss가 아닌 struct, enum을 사용할 수 있게 해주니깐!

-> 클래스는 참조 타입이므로 참조 추적에 비용이 많이 발생한다. 비교적 비용이 적은 값 타입을 활용하고 싶어도, 상속을 할 수 없기 때문에 때마다 기능을 다시 구현해 줘야했다.

  1. 기능의 모듈화가 더욱 명확해 진니깐!

-> 클래스가 상속을 할 수 있도록 설계 되어있어도 다중상속을 지원하는 언어는 많지 않다. 다중상속은 하나의 상속체계에서 다른 상속체계에 속해있는 기능을 끌어다 쓸 수 있다는 뜻.
프로토콜 지향 프로그래밍은 기능을 프로토콜이라는 단위로 묶에 표현하고 초기에 구현을 해 둘 수 있으니 상속이라는 한계점을 탈피했다고 볼 수 있다. 제약없이 필요한 기능을 가져와 쓸 수 있다!

더나아가서 class는 모든 api에 접근이 가능한 반면 Protocol은 정의한 api만 가져오게 된다. 이는 곧 더 가볍고 보안성 높게 코드를 짤 수 있음을 의미한다.

그럼 protocol은 뭔데?

특정 역할을 수행하기 위한 메서드, 프로퍼티, 이니셜라이저 등의 요구사항을 정의하는 것!

  • 구조체, 클래스, 열거형은 프로토콜를 채택(adopted)하여 프로토콜의 요구사항을 실제로 구현 가능하다.
    어떤 프로토콜의 요구사항을 모두 따르는 타입은 그 프로토콜을 준수한다(Conform)고 표현한다.
    프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는 기능을 모두 구현해야 한다.
protocol 프로토콜 이름 {
	정의부
}
protocol Talkable {
  // 프로퍼티 요구 >> 항상 var 키워드를 사용한다.
  var topic: String { get set }  // 읽기 쓰기 모두 가능한 프로퍼티
  var language: String { get }  // 읽기만 가능한 프로퍼티

  // 메서드 요구
  func talk()

 // 이니셜라이저 요구
  init(topic: String, language: String)
}
  • 프로토콜은 다중상속이 가능하다.
protocol 프로토콜 이름: 부모 프로토콜 이름 목록 {
  정의부
}
  • 원래 프로토콜에는 기능을 수행하는 코드는 작성할 수 없었는데 swift2 protocol extension에는 실제 값을 계산하고, 기능을 하는 메서드를 구현할 수 있게 되었다. 즉, extension을 통해 protocol의 기능을 추가하는 것이 가능해지게 된 것이다.
protocol Talkable {
    var topic: String { get set }
    func talk(to: Self)
}

struct Person: Talkable {
    var topic: String
    var name: String

    func talk(to: Person) {
        print("\(topic)에 대해 \(to.name)에게 이야기합니다")
    }
}

-> 위 코드를 아래와 같이 한꺼번에 구현한다면 중복 코드를 줄일 수 있다.

protocol Talkable {
    var topic: String { get set }
    func talk(to: Self)
}

// 익스텐션을 사용한 프로토콜 초기 구현
extension Talkable {
    func talk(to: Self) {
        print("\(to)! \(topic)")
    }
}

2️⃣ ArrayList

Array는 swift의 컬렉션 타입 중 하나이다.

컬렉션 타입에는 array, set, dictionary 세 가지가 있다.

  • array: 순서가 있는 리스트 컬렉션
  • dictionary: 키와 값의 쌍으로 이루어진 컬렉션
  • set: 순서가 없고, 멤버가 유일한 컬렉션
//빈배열의 생성
var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
// someInts is of type [Int] with 0 items.

//array는 표현방법이 다양하다.
//아래가 다 같은 표현이다.
//var someInts: Array<Int> = Array<Int>()
// var someInts: Array<Int> = [Int]()
// var someInts: Array<Int> = []
// var someInts: [Int] = Array<Int>()
// var someInts: [Int] = [Int]()
// var someInts: [Int] = []
// var someInts = [Int]()
//array의 활용
someInts.append(1)
someInts.append(100)

// Int 타입이 아니므로 Array에 추가할 수 없습니다
//someInts.append(101.1)

print(someInts)	// [1, 100]

// 멤버 포함 여부 확인
print(someInts.contains(100)) // true
print(someInts.contains(99)) // false

// 멤버 교체
someInts[0] = 99

// 멤버 삭제
someInts.remove(at: 0)
someInts.removeLast()
someInts.removeAll()

// 멤버 수 확인
print(someInts.count)

// 인덱스를 벗어나 접근하려면 익셉션 런타임 오류발생
//someInts[0]
  • let을 사용하여 array를 선언하면 불변이 된다.
let immutableArray = [1, 2, 3]

// 수정이 불가능한 Array이므로 멤버를 추가하거나 삭제할 수 없습니다
//immutableArray.append(4)
//immutableArray.removeAll()

3️⃣ DataSource & Delegate

Table view에서 중요한 프로토콜이 되는 DataSource & Delegate

  1. Table view란?
    -> 단일 열의 행을 사용하여 데이터를 표시하는 view
  • 하나의 열에 수직으로 스크롤되는 내용의 행을 표시하는 view로 표의 각 행에는 앱 컨텐츠가 하나씩 포함. 예를 들어 연락처 앱은 각 연락처의 이름을 별도의 행에 표시하고 설정 앱의 기본 페이지에는 사용 가능한 설정 그룹이 표시됩니다. 하나의 긴 행 목록을 표시하도록 테이블을 구성하거나 관련 행을 섹션으로 그룹화하여 내용을 쉽게 탐색할 수 있습니다. devloper page

  1. Delegate
  • Delegate는 객체 지향 프로그래밍에서 하나의 객체가 모든 일을 처리하는 것이 아니라 처리 해야 할 일 중 일부를 다른 객체에 넘기는 것을 뜻 합니다. 쉽게 말해서 우리가 해야할 일을 대신해서 해주는 느낌입니다.

  • TableView의 시각적인 부분 수정, 행의 선택 관리, 액세서리뷰 지원 그리고 테이블뷰의 개별 행 편집을 도와줍니다.

  • 예를들면 1행에 높이는 얼마인지, 3행을 선택하면 무엇을 하는지, 3행은 얼마나 들여쓰면 되는지 같은 모양과 동작을 관리한다.

  1. Datasource
  • Datasource는 데이터 모델의 Delegate로, 테이블뷰의 시각적 모양에 대한 최소한의 정보를 제공합니다. Delegate와 비슷하게 처리 해야 할 일 중 일부를 다른 객체에 넘겨서 작업을 대신해주는 역할을 합니다.

  • TableView 객체에 섹션의 수와 행의 수를 알려주며, 행의 삽입, 삭제 및 재정렬하는 기능을 선택적으로 구현할 수 있습니다.

  • 예를들면 총 섹션이 몇개인지, 4행에 어떤 정보를 보여주고 싶은지, 1섹션 타이틀은 무엇인지와 같은 것은 관리한다.

실습 체크리스트✅

  • Protocol에 대한 실습을 진행하고, 개념에 대해 이해했나요?
  • Delegate에 대한 실습을 진행하고, 개념에 대해 이해했나요?
  • IBAction을 통해 뷰에 액션을 연결할 수 있나요?

💭생각해 볼까요?💭

❔ 다시 한번 묻겠습니다. 카카오톡의 친구 뷰는 어떤 것으로 이루어져 있을까요? 그 이유는요?

🅰️ table view로 이루어져 있을 것! 이유는 테이블뷰의 섹션과 데이터의 형태를 가지고 있기 때문.

❔ 실습과 같이 A View에서 B View에 관여하는 방법은 Protocol뿐이 아닙니다! “Notification”이라는 키워드로 한번 찾아보고 공부해보세요!

🅰️ NotificationCenter를 통해 정보를 저장하기 위한 구조체다. 옵저버들에게 전달되는 구조체로 정보가 담겨있고, 해당 알림을 등록한 옵저버에게만 전달된다. 구조체는 아래와 같이 구성되어 있다.

var name: Notification.Name
var object: Any?
userInfo: [AnyHashable : Any]?
  • name
    전달하고자 하는 notification의 이름 (이걸 통해 알림을 식별한다)
  • object
    발송자가 옵저버에게 보내려고 하는 객체. 주로 발송자 객체를 전달하는 데 쓰임
  • userInfo
    notification과 관련된 값 또는 객체의 저장소. Extra data를 보내는데 사용 가능

❔ 여러분들이 생각하시기에 Notification과 Protocol 중 어떤 것이 더 효율적인 것 같나요? 그 이유는요?

🅰️ NotificationCenter는 언제 사용해야할까?

  • 앱 내에서 공식적인 연결이 없는 두 개 이상의 컴포넌트들이 상호작용이 필요할 때
  • 상호작용이 반복적으로 그리고 지속적으로 이루어져야 할 때
  • 일대다 또는 다대다 통신을 사용하는 경우

좋은 웹페이지 즐겨찾기