WWDC

WWDC22) Design protocol interfaces in Swift

hyun99999 2022. 6. 21. 21:25
728x90
λ°˜μ‘ν˜•

Learn how you can use Swift 5.7 to design advanced abstractions using protocols. We'll show you how to use existential types, explore how you can separate implementation from interface with opaque result types, and share the same-type requirements that can help you identify and guarantee relationships between concrete types. To get the most out of this session, we recommend first watching β€œEmbrace Swift generics" from WWDC22.

*λ³Έ 글은 WWDC λ₯Ό 보고, λ²ˆμ—­ 및 μš”μ•½ 그리고 μ‹€ν–‰ν•΄λ³΄λŠ” μŠ€ν„°λ”” ν”„λ‘œμ νŠΈμ˜ μΌν™˜μž…λ‹ˆλ‹€.

ν•΄λ‹Ή μ„Έμ…˜μ—λŠ” μ„Έ 가지 μ£Όμš” μ£Όμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

1
  • μ–΄λ–»κ²Œ result type erasure κ°€ μž‘λ™ν•˜λŠ”μ§€ μ„€λͺ…ν•˜μ—¬ associated type 이 μžˆλŠ” ν”„λ‘œν† μ½œμ΄ μ–΄λ–»κ²Œ existential any type κ³Ό μƒν˜Έμž‘μš©ν•˜λŠ” 방법을 λ³΄μ—¬λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.
  • κ΅¬ν˜„κ³Ό μΈν„°νŽ˜μ΄μŠ€λ₯Ό λΆ„λ¦¬ν•˜μ—¬ μΊ‘μˆ ν™”λ₯Ό κ°œμ„ ν•˜κΈ° μœ„ν•΄ opaque result types λ₯Ό μ‚¬μš©ν•˜λŠ” 방법을 μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.
  • ν”„λ‘œν† μ½œμ˜ same-type requirements κ°€ μ—¬λŸ¬ λ‹€λ₯Έ concrete types 의 μ§‘ν•©κ°„μ˜ 관계λ₯Ό λͺ¨λΈλ§ν•  수 μžˆλŠ” 방법을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

Undestand type erasure


2

Embrace swift generics μ„Έμ…˜μ—μ„œ Cow 와 Chicken μ—μ„œ μ„œλ‘œ λ‹€λ₯Έ return type 의 produce() λ₯Ό μΆ”μƒν™”ν•˜λŠ” κ°€μž₯ 쒋은 방법은 associated type 을 μ‚¬μš©ν•˜λŠ” 것이 μ—ˆμŠ΅λ‹ˆλ‹€.

associated type 을 μ‚¬μš©ν•˜λ©΄ νŠΉμ • νƒ€μž…μ˜ Animal 의 경우 produce() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ νŠΉμ • Animal 에 λŒ€ν•œ νŠΉμ • Food κ°€ λ°˜ν™˜λ©λ‹ˆλ‹€.(λ‹€μ΄μ–΄κ·Έλž¨ μ°Έκ³ )

Self 은 ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” μ‹€μ œ concrete type μž…λ‹ˆλ‹€. Self νƒ€μž…μ—λŠ” Food λ₯Ό μ€€μˆ˜ν•˜λŠ” associated type Commodity κ°€ μžˆμŠ΅λ‹ˆλ‹€. concrete Chicken κ³Ό Cow νƒ€μž…κ°„μ˜ 관계와 assocated type λ‹€μ΄μ–΄κ·Έλž¨μ— λŒ€ν•΄μ„œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

Chicken, Cow νƒ€μž…μ€ CommodityType(각각 Egg 와 Milk) 을 가진 Animal ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

3

이제 any Animal array κ°€ μ €μž₯λ˜μ–΄μžˆλŠ” Farm 을 μ‚΄νŽ΄λ΄…μ‹œλ‹€.

4

Embrace Swift generics μ—μ„œ μ•Œμ•„λ³΄μ•˜λ“―μ΄ λ‹€λ₯Έ concrete types 에 λŒ€ν•΄ λ™μΌν•œ ν‘œν˜„μ„ μ‚¬μš©ν•˜λŠ” μ΄λŸ¬ν•œ μ „λž΅μ„ type erasure 라고 ν–ˆμŠ΅λ‹ˆλ‹€. produceCommodities() λ©”μ„œλ“œλŠ” κ°„λ‹¨ν•΄λ³΄μ΄μ§€λ§Œ type erasure κ°€ underlying type 에 λŒ€ν•œ static type relationships λ₯Ό μ œκ±°ν•˜λŠ” 것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.

5

existential type μ—μ„œ associated type 을 λ¦¬ν„΄ν•˜λŠ” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ(produce() 호좜) μ•„λž˜μ™€ 같이 μ»΄νŒŒμΌλŸ¬λŠ” type erasure λ₯Ό μ‚¬μš©ν•˜μ—¬ 호좜의 result type 을 κ²°μ •ν•©λ‹ˆλ‹€.

6

concret Animal νƒ€μž…κ³Ό associated CommodityType 을 any Animal κ³Ό any Food 둜 λŒ€μ²΄ν•˜μ—¬ 관계λ₯Ό μ§€μ› μŠ΅λ‹ˆλ‹€. any Food νƒ€μž…μ€ associated CommodityType 의 upper bound 라고 λΆ€λ¦…λ‹ˆλ‹€. any Animal 에 λŒ€ν•΄μ„œ produce() λ©”μ„œλ“œκ°€ 호좜되기 λ•Œλ¬Έμ— λ°˜ν™˜κ°’μ΄ type erase λ˜μ–΄μ„œ any Food νƒ€μž… 값을 μ œκ³΅ν•©λ‹ˆλ‹€.

Swift 5.7 의 μƒˆλ‘œμš΄ κΈ°λŠ₯인 associated-type erasure κ°€ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

7

ν”„λ‘œν† μ½œ λ©”μ„œλ“œμ˜ result type 에 λ‚˜νƒ€λ‚˜λŠ” associated type 은 producing position 에 μžˆλ‹€κ³  ν•©λ‹ˆλ‹€. λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ 이 νƒ€μž…μ˜ 값이 μƒμ„±λ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

8

produce() λ©”μ„œλ“œλ₯Ό any Animal μ—μ„œ ν˜ΈμΆœν•  λ•Œ μš°λ¦¬λŠ” 컴파일 νƒ€μž„μ—λŠ” concrete result type 을 μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ, upper bound 의 subtype 은 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.(즉, any Food 인 것은 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.)

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” λŸ°νƒ€μž„μ—μ„œλŠ” any Animal 이 Cow 인 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. produce() λ©”μ„œλ“œλŠ” Milk λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. Milk λŠ” associated CommodityType 의 upper bound 인 any Food 에 μ €μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€.(μ•„κΉŒ produceCommodities() λ©”μ„œλ“œμ˜ 리턴 값이 any Food μ˜€λ‹€.)

이것은 Animal ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” λͺ¨λ“  concrete types μ—κ²Œ 항상 μ•ˆμ „ν•˜κ²Œ μ μš©λ©λ‹ˆλ‹€.

λ‹€λ₯Έμͺ½μœΌλ‘œ associated type 이 λ©”μ„œλ“œλ‚˜ μƒμ„±μžμ˜ νŒŒλΌλ―Έν„°μ— λ“±μž₯ν•˜λŠ” 것을 μƒκ°ν•΄λ΄…μ‹œλ‹€.

9

eat() λ©”μ„œλ“œλŠ” associated FeedType 을 consuming postion 에 가지고 μžˆμŠ΅λ‹ˆλ‹€.

10

eat λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ €λ©΄ 값을 νŒŒλΌλ―Έν„°λ‘œ λ„˜κ²¨μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€. λ³€ν™˜μ΄ λ°˜λŒ€λ°©ν–₯으둜 μ§„ν–‰λ˜κΈ° λ•Œλ¬Έμ— type erasure λ₯Ό μˆ˜ν–‰ν•  수 μ—†μŠ΅λ‹ˆλ‹€. associated type 의 upper bound λŠ” concrete type 을 μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— μ•ˆμ „ν•˜κ²Œ λ³€ν™˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

Animal ν”„λ‘œν† μ½œκ³Ό κ΄€λ ¨λœ FeedType 의 upper bound λŠ” any AnimalFeed μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μœ„μ˜ μƒν™©μ²˜λŸΌ any AnimalFeed κ°€ 주어지면 Hay concrete type 을 μ •μ μœΌλ‘œ μ €μž₯ν•œλ‹€λŠ” 것을 보μž₯ν•  방법이 μ—†μŠ΅λ‹ˆλ‹€. λ‹€μŒ μ²˜λŸΌμš”!

11

type erasure λŠ” consuming position 에 μžˆλŠ” associated types 으둜 μž‘μ—…ν•˜λŠ” 것을 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹  opaque some type 을 μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜μ— μ „λ‹¬ν•΄μ„œ existential any type 을 μ–Έλ°•μ‹±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

associated types 의 type erasure λ™μž‘μ€ μ‹€μ œλ‘œ Swift 5.6 μ—μ„œ λ³Ό 수 μžˆλŠ” κΈ°μ‘΄ κΈ°λŠ₯κ³Ό μœ μ‚¬ν•©λ‹ˆλ‹€. cloning reference type 을 μœ„ν•œ ν”„λ‘œν† μ½œμ„ κ³ λ €ν•΄λ³΄μž.

μ•„λž˜μ˜ ν”„λ‘œν† μ½œμ€ Self λ₯Ό λ°˜ν™˜ν•˜λŠ” clone() λ©”μ„œλ“œλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. any Cloneable νƒ€μž…μ˜ 값에 λŒ€ν•΄ clone() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ 리턴 νƒ€μž… Self κ°€ upper bound κΉŒμ§€ type erase λ©λ‹ˆλ‹€. Self 의 upper bound λŠ” 항상 ν”„λ‘œν† μ½œ μžμ²΄μ΄λ―€λ‘œ any Cloneable νƒ€μž…μ˜ μƒˆ νƒ€μž…μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.

12

μš”μ•½ν•˜μžλ©΄ any λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°’ νƒ€μž…μ΄ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” concrete type 을 μ €μž₯ν•˜λŠ” existential type 을 μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

13

이것은 associated types κ°€ μžˆλŠ” ν”„λ‘œν† μ½œμ—μ„œλ„ λ™μž‘ν•©λ‹ˆλ‹€. producing postion μ—μ„œ associated type 이 μžˆλŠ” ν”„λ‘œν† μ½œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ associated type 은 upper bound κΉŒμ§€ type erase λ©λ‹ˆλ‹€.

Hide implementation details


concrete types 에 λŒ€ν•œ μΆ”μƒν™”λŠ” ν•¨μˆ˜ input 뿐만 μ•„λ‹ˆλΌ oupt μ—μ„œλ„ μœ μš©ν•˜λ―€λ‘œ concrete types λŠ” κ΅¬ν˜„μ—μ„œλ§Œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

concrete result types λ₯Ό μΆ”μƒν™”ν•˜μ—¬ κ΅¬ν˜„ μ„ΈλΆ€ μ •λ³΄μ—μ„œ μ½”λ“œμ˜ ν•„μˆ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λΆ„λ¦¬ν•˜μ—¬ 더 λͺ¨λ“ˆν™” 되고, κ°•λ ₯ν•˜κ²Œ λ§Œλ“œλŠ” 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ™λ¬Όμ—κ²Œ 먹이λ₯Ό 쀄 수 μžˆλ„λ‘ Animal ν”„λ‘œν† μ½œμ„ μΌλ°˜ν™”ν•΄λ³΄κ²ŸμŠ΅λ‹ˆλ‹€. 동물은 λ°°κ³ ν”„λ©΄ λ¨Ήμ–΄μ•Ό ν•©λ‹ˆλ‹€.

14

hungryAnimals 의 λ°˜λ³΅μ„ ν†΅ν•΄μ„œ 먹이λ₯Ό 쀄 것 μž…λ‹ˆλ‹€. μ΄λ•Œ feedAnimals() λ©”μ„œλ“œκ°€ ν•œλ²ˆλ§Œ λ°˜λ³΅ν•˜κΈ° λ•Œλ¬Έμ— hungryAnimals 의 μˆ˜κ°€ λ§Žμ€ 경우 λΉ„νš¨μœ¨μ μž…λ‹ˆλ‹€. κ·Έλž˜μ„œ lazy.filter 둜 λŒ€μ²΄ν•¨μœΌλ‘œμ¨ μš°λ¦¬λŠ” μž„μ‹œ 할당을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

이제, hungryAnimals νƒ€μž…μ˜ ν”„λ‘œνΌν‹°λŠ” concrete type 보닀 λ³΅μž‘ν•œ LazyFilterSequence of Array of any Animal 둜 μ„ μ–Έλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

15

이것은 λΆˆν•„μš”ν•œ κ΅¬ν˜„ 세뢀사항을 λ…ΈμΆœν•©λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈμΈ feedAnimals() λŠ” hungryAnimals 의 κ΅¬ν˜„μ—μ„œ lazy.filter λ₯Ό μ‚¬μš©ν•œ 것을 μ‹ κ²½ 쓰지 μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λ•Œ opaque result type 을 μ‚¬μš©ν•΄μ„œ 좔상적인 μΈν„°νŽ˜μ΄μŠ€ 뒀에 concrete type 을 숨길 수 μžˆμŠ΅λ‹ˆλ‹€.

16

이제 ν΄λΌμ΄μ–ΈνŠΈλŠ” collection ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” ꡬ체적인 μœ ν˜•μ„ μ–»κ³  μžˆλ‹€λŠ” κ²ƒλ§Œ μ•Œμ§€ concrete type 을 μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€.

17

κ·ΈλŸ¬λ‚˜ μž‘μ„±λœ λŒ€λ‘œ 이것은 μ‹€μ œλ‘œ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ„ˆλ¬΄ λ§Žμ€ 정적인 정보λ₯Ό μˆ¨κΉλ‹ˆλ‹€. hungryAnimals κ°€ collection 을 μ€€μˆ˜ν•˜λŠ” concrete type 을 좜λ ₯ν•œλ‹€κ³  μ„ μ–Έν•˜κ³  μžˆμ§€λ§Œ, 이 collection 의 element νƒ€μž…μ— λŒ€ν•΄μ„œλŠ” 아무 것도 λͺ¨λ¦…λ‹ˆλ‹€. element type 이 any Animal μ΄λΌλŠ” 지식 μ—†μ΄λŠ” ν•  수 μžˆλŠ” 것은 μ „λ‹¬ν•˜λŠ” 것 λΏμž…λ‹ˆλ‹€. 즉, Animal ν”„λ‘œν† μ½œ 의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μ—†μŠ΅λ‹ˆλ‹€.

opaque result type some Collection 에 집쀑해 λ³΄κ² μŠ΅λ‹ˆλ‹€. κ΅¬ν˜„ μ„ΈλΆ€ 정보λ₯Ό μˆ¨κΈ°λŠ” 것과 ν’λΆ€ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ…ΈμΆœν•˜λŠ” 것 μ‚¬μ΄μ—μ„œ μ˜¬λ°”λ₯Έ κ· ν˜•μ„ μž‘μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

constrained opaqeue result types λŠ” Swift 5.7 λΆ€ν„° μ μš©λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

18

이것은 ν”„λ‘œν† μ½œ 이름 뒀에 κΊΎμ‡  κ΄„ν˜Έ μ•ˆμ— type arguments λ₯Ό μ μš©ν•˜μ—¬ μž‘μ„±ν•˜λ©΄ λ©λ‹ˆλ‹€. Collection ν”„λ‘œν† μ½œμ—λŠ” 단일 type argument 인 Element type 이 μžˆμŠ΅λ‹ˆλ‹€. 이제 hungryAnimals κ°€ constrained opaque result type 으둜 μ„ μ–Έλ˜λ©΄ LazyFilterSequence of Array of any Animal λΌλŠ” 사싀이 ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μˆ¨κ²¨μ§‘λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν΄λΌμ΄μ–ΈνŠΈλŠ” μ—¬μ „νžˆ any Animal κ³Ό 같은 Element associated type 을 가진 Collection ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” concrete type μ΄λΌλŠ” 것을 μ—¬μ „νžˆ μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.

이것이 μš°λ¦¬κ°€ μ›ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€.

19

feedAnimals() 의 for λ£¨ν”„μ—μ„œ animal λ³€μˆ˜λŠ” any Animal νƒ€μž…μ„ κ°€μ§€λ―€λ‘œ Animal ν”„λ‘œν† μ½œμ˜ λ©”μ„œλ“œλ₯Ό 각 λ°°κ³ ν”ˆ 동물듀에 λŒ€ν•΄ ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

20

Collection<Element> 둜 μ •μ˜λ˜κ³ , associated type 으둜 Element 이 primary associated type 라고 μ„ μ–Έν•˜κΈ° λ•Œλ¬Έμ— μž‘λ™μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

21

hungryAnimals 을 lazily λ˜λŠ” eagerly ν•˜κ²Œ 계산할지 μ˜΅μ…˜μ„ κ°–κΈ°λ₯Ό μ›ν•˜λŠ” 경우 opaque Collection 을 μ‚¬μš©ν•˜λ©΄ 두 가지 λ‹€λ₯Έ underlying types λ₯Ό λ°˜ν™˜ν•œλ‹€λŠ” 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

λŒ€μ‹  any Collection of any Animal 을 λ°˜ν™˜ν•˜μ—¬ API κ°€ ν˜ΈμΆœκ°„μ— λ‹€λ₯Έ νƒ€μž…μ„ λ°˜ν™˜ν•  수 μžˆμŒμ„ μ•Œλ €μ€ŒμœΌλ‘œμ¨ 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

opaque types λ₯Ό μ‚¬μš©ν•˜μ—¬ 일반적인 code λ₯Ό μž‘μ„±ν•˜λ €λ©΄ abstract type relationships 에 μ˜μ‘΄ν•΄μ•Ό ν•©λ‹ˆλ‹€. κ΄€λ ¨ ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ abstract types 간에 ν•„μš”ν•œ νƒ€μž… 관계λ₯Ό μ‹λ³„ν•˜κ³  보μž₯ν•˜λŠ” 방법에 λŒ€ν•΄ λ…Όμ˜ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

Identify type relationships


μ•žμ„œ λ§Œλ“  Animal ν”„λ‘œν† μ½œμ— AniamlFeed νƒ€μž…μ˜ μƒˆλ‘œμš΄ associatedtype κ³Ό λ™λ¬Όμ—κ²Œ FeedType 을 먹도둝 μ§€μ‹œν•˜λŠ” eat() λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•  κ²ƒμž…λ‹ˆλ‹€. ν₯미둭게 ν•˜κΈ° μœ„ν•΄μ„œ λ™λ¬Όμ—κ²Œ 먹이λ₯Ό μ£ΌκΈ° 전에 μ μ ˆν•œ νƒ€μž…μ˜ μž‘λ¬Όμ„ μž¬λ°°ν•˜κ³  μˆ˜ν™•ν•˜μ—¬ μ‚¬λ£Œλ₯Ό μƒμ‚°ν•˜λŠ” λ³΅μž‘μ„±μ„ μΆ”κ°€ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

22

λ‹€μŒμ€ 두 가지 concrete type μž…λ‹ˆλ‹€.

23

μœ„μ˜ 두가지 concrete types 에 λŒ€ν•΄ μΆ”μƒν™”ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 feedAnimal() λ©”μ„œλ“œλ₯Ό ν•œ 번만 κ΅¬ν˜„ν•˜λ©΄ cow, chicken 및 λ‹€λ₯Έ μƒˆλ‘œμš΄ νƒ€μž…μ˜ 동물을 먹일 수 μžˆμŠ΅λ‹ˆλ‹€.

24

feedAnimal() λ©”μ„œλ“œλŠ” Animal ν”„λ‘œν† μ½œμ˜ associated type 이 consuming postion 에 μžˆλŠ” eat() λ©”μ„œλ“œμ™€ ν•¨κ»˜ μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ— νŒŒλΌλ―Έν„° νƒ€μž…μœΌλ‘œ some Animal 을 가지도둝 μ„ μ–Έν•΄μ„œ μ–Έλ°•μ‹±ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ‹œμž‘ν•˜κΈ° μœ„ν•΄μ„œ AnimalFeed 와 Crop ν”„λ‘œν† μ½œμ„ μ„ μ–Έν•˜κ² μŠ΅λ‹ˆλ‹€.

25

λ‹€μ΄μ–΄κ·Έλž¨μ„ 톡해 보듯이 AnimalFeed 와 Crop μ‚¬μ΄μ—μ„œ λ¬΄ν•œ 쀑첩과 ν•¨κ»˜ μ˜μ›νžˆ 계속 λ©λ‹ˆλ‹€.

26

AnimalFeed ν”„λ‘œν† μ½œμ—μ„œ μ‹œμž‘ν–ˆμ§€λ§Œ, Crop ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•΄λ„ λΉ„μŠ·ν•œ 상황이 λ°œμƒν•©λ‹ˆλ‹€. 단지 ν•˜λ‚˜λ§Œ μ΄λ™ν–ˆμ„ λΏμž…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ ν”„λ‘œν† μ½œμ΄ concrete types κ°„μ˜ 관계λ₯Ό μ˜¬λ°”λ₯΄κ²Œ λͺ¨λ”œλ§ν•˜λŠ”지 μ‚΄νŽ΄λ΄…μ‹œλ‹€.

λ™λ¬Όμ—κ²Œ 먹이λ₯Ό μ£ΌκΈ°(eat)μ „ μž‘λ¬Ό(crop)을 재배(harvest)ν•΄μ•Ό μ‚¬λ£Œ(animal feed)둜 가곡할 수 μžˆμŠ΅λ‹ˆλ‹€.

27

Animal 을 μ€€μˆ˜ν•˜λŠ” νƒ€μž…μ„ 얻을 수 있고, Animal 은 associated type 으둜 AnimalFeed λ₯Ό μ€€μˆ˜ν•˜λŠ” FeedType 을 가지고 μžˆμŠ΅λ‹ˆλ‹€.

28

이 νƒ€μž…μ€ λ©”μ„œλ“œ grow() λ₯Ό ν˜ΈμΆœν•˜λŠ” 기반으둜 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. grow() λ©”μ„œλ“œλŠ” AnimalFeed 의 CropType 을 λ¦¬ν„΄ν•©λ‹ˆλ‹€.

CropType 은 Crop 을 μ€€μˆ˜ν•œλ‹€λŠ” 것을 μ•Œκ³  μžˆμœΌλ―€λ‘œ harvest() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό 톡해 μš°λ¦¬λŠ” 무엇을 λŒλ €λ°›μ„ 수 μžˆμ„κΉŒμš”? λ°”λ‘œ FeedType μž…λ‹ˆλ‹€.

29

λΆˆν–‰ν•˜κ²Œλ„ 이것은 잘λͺ»λœ νƒ€μž…μž…λ‹ˆλ‹€.

eat() λ©”μ„œλ“œλŠ” (some Animal).FeedType μ˜ˆμƒν•˜μ§€ (some Animal).FeedType.CropType.FeedType μ˜ˆμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

30

concrete types κ°„μ˜ 관계λ₯Ό μ •μ˜ν•˜κΈ°μ— ν”„λ‘œν† μ½œμ˜ 선언이 λ„ˆλ¬΄ μΌλ°˜μ μ΄μ—ˆμŠ΅λ‹ˆλ‹€. 즉, μ›ν•˜λŠ” 관계λ₯Ό μ •ν™•ν•˜κ²Œ λͺ¨λΈλ§ν•˜μ§€ λͺ»ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

31

κ·Έ 이유λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œ Hay 와 Alfalfa νƒ€μž…μ„ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. hay λ₯Ό κΈ°λ₯΄λ©΄ alfalfa λ₯Ό, alfalfa λ₯Ό μˆ˜ν™•ν•˜λ©΄ hay λ₯Ό μ–»λŠ” μ‹μž…λ‹ˆλ‹€. μ½”λ“œλ₯Ό λ¦¬νŽ™ν† λ§ν•˜κ³  μžˆλŠ”λ° μ‹€μˆ˜λ‘œ Alfalfa μ—μ„œ harvest() λ©”μ„œλ“œμ˜ 리턴값을 λ³€κ²½ν•˜μ—¬ hay λŒ€μ‹  Scratch λ₯Ό λ°˜ν™˜ν•œλ‹€κ³  상상해 λ³ΌκΉŒμš”?

이런 μœ μ—°ν•œ λ³€κ²½ 후에도 concrete type 은 μ—¬μ „νžˆ AnimalFeed 및 Crop ν”„λ‘œν† μ½œμ˜ μš”κ΅¬μ‚¬ν•­μ„ μΆ©μ‘±ν•©λ‹ˆλ‹€. μž‘λ¬Όμ„ μž¬λ°°ν•˜κ³ , μˆ˜ν™•ν•˜λ©΄ μš°λ¦¬κ°€ μ‹œμž‘ν•œ 것과 λ™μΌν•œ animal feed κ°€ μƒμƒλœλ‹€λŠ” μš°λ¦¬κ°€ μ›ν•˜λŠ” κ·œμΉ™μ„ μœ„λ°˜ν•˜λ”λΌλ„ λ§μž…λ‹ˆλ‹€.

32

AnimalFeed ν”„λ‘œν† μ½œμ„ λ‹€μ‹œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ§„μ§œ λ¬Έμ œλŠ” λ„ˆλ¬΄ λ§Žμ€ λ³„κ°œμ˜ associated type κ°€ μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ associated Types 쀑 두 κ°œκ°€ μ‹€μ œλ‘œ λ™μΌν•œ concrete type μ΄λΌλŠ” 것을 기둝해야 ν•©λ‹ˆλ‹€.(즉, crop 을 μž¬λ°°ν•˜κ³ , μˆ˜ν™•ν•΄μ„œ feed κ°€ λ˜λŠ”λ° crop κ³Ό feed λŠ” κ²°κ΅­ κ°™λ‹€. 이것을 λ³„κ°œμ˜ associated type 둜 가지고 μžˆλ‹€.)

where


where 절둜 μž‘μ„±λœ same-type requirement λ₯Ό μ‚¬μš©ν•˜μ—¬ μ΄λŸ¬ν•œ associated type κ°„μ˜ 관계λ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

33

same-type requirement 은 쀑첩될 수 μžˆλŠ” associated types 이 μ‹€μ œλ‘œ λ™μΌν•œ concrete type 이어야 ν•œλ‹€λŠ” 정적 보μž₯을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. Self.CropType.FeedType 이 Self 와 λ™μΌν•œ νƒ€μž…μž„μ„ μ„ μ–Έν•©λ‹ˆλ‹€. 이것을 λ‹€μ΄μ–΄κ·Έλž¨μœΌλ‘œ 보게되면 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

34

AnimalFeed λ₯Ό μ€€μˆ˜ν•˜λŠ” concrete type 에 CropType 이 있고, μ΄κ²ƒμ˜ FeedType 은 original AnimalFeed νƒ€μž…μ˜ concrete type μž…λ‹ˆλ‹€. μ€‘μ²©λœ ꡬ쑰 λŒ€μ‹  단일 쌍으둜 μΆ•μ†Œν–ˆμŠ΅λ‹ˆλ‹€. Crop ν”„λ‘œν† μ½œμ€ μ–΄λ–¨κΉŒμš”?

35

(μœ„μ™€ 같이 where μ ˆμ„ μ‚¬μš©ν•΄μ„œ μ•„κΉŒ μš°λ €λ˜μ—ˆλ˜ harvest λ₯Ό ν†΅ν•΄μ„œ κΈ°λ₯΄λŠ” μž‘λ¬Όκ³Ό 먹이가 λ™μΌν•˜μ§€ μ•Šμ€ 경우λ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.)

이 두 ν”„λ‘œν† μ½œμ΄ same-type requirements λ₯Ό κ°–μΆ”μ—ˆμœΌλ―€λ‘œ feedAnimal() λ©”μ„œλ“œλ₯Ό λ‹€μ‹œ μ‚΄νŽ΄λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

36

μ΄μ œλŠ” 또 λ‹€λ₯Έ associated type 을 μ–»λŠ” λŒ€μ‹  animal 이 κΈ°λŒ€ν•˜λŠ” μ •ν™•ν•œ animal feed νƒ€μž…μ„ eat() ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ, μ§€κΈˆκΉŒμ§€ λ³Έ λͺ¨λ“  것을 ν•˜λ‚˜λ‘œ λ¬ΆλŠ” Animal ν”„λ‘œν† μ½œμ˜ associated type λ‹€μ΄μ–΄κ·Έλž¨μ„ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

37

Cow 와 chicken 이 μžˆμŠ΅λ‹ˆλ‹€. 각 관계λ₯Ό μ–΄λ–»κ²Œ λͺ¨λΈλ§ν•˜λŠ”지 μ£Όλͺ©ν•΄μ„œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

38

λ‹€λ₯Έ μ€‘μ²©λœ associated types 의 동등성을 μ •μ˜ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 그러면 일반 μ½”λ“œλŠ” ν”„λ‘œν† μ½œ μš”κ΅¬μ‚¬ν•­μ— λŒ€ν•΄ μ—¬λŸ¬ ν˜ΈμΆœμ„ ν•¨κ»˜ μ—°κ²°ν•  λ•Œ μ΄λŸ¬ν•œ κ΄€κ²Œμ— μ˜μ‘΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

39

이번 μ„Έμ…˜μ—μ„œ μš°λ¦¬λŠ” type erasure κ°€ μ–Έμ œ μ•ˆμ „ν•œμ§€, type relationships κ°€ 보μž₯λ˜λŠ” context κ°€ μžˆμ–΄μ•Ό ν•  λ•Œλ₯Ό νƒκ΅¬ν–ˆμŠ΅λ‹ˆλ‹€.

그런 λ‹€μŒ opaque result types 와 existential types λͺ¨λ‘μ— μ‚¬μš©ν•  수 μžˆλŠ” primary associated types λ₯Ό μ‚¬μš©ν•΄μ„œ ν’λΆ€ν•œ νƒ€μž…μ˜ 정보λ₯Ό 보쑴과 κ΅¬ν˜„ 상세 정보λ₯Ό μˆ¨κΈ°λŠ” 것 μ‚¬μ΄μ˜ κ· ν˜•μ„ μœ μ§€ν•˜λŠ” 방법에 λŒ€ν•΄ λ…Όμ˜ν–ˆμŠ΅λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ κ΄€λ ¨ νƒ€μž…μ˜ 집합을 λ‚˜νƒ€λ‚΄λŠ” ν”„λ‘œν† μ½œ μ „μ²΄μ—μ„œ same-type relationships λ₯Ό μ‚¬μš©ν•˜μ—¬ concrete types κ°„μ˜ 관계λ₯Ό μ‹λ³„ν•˜κ³  보μž₯ν•˜λŠ” 방법을 λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

40
728x90
λ°˜μ‘ν˜•