Post

Kotlin Pair와 Triple

Kotlin Pair와 Triple

πŸ₯‘ λ“€μ–΄κ°€λ©°

κ·Έλ™μ•ˆ 코틀린을 μ‚¬μš©ν•˜λ©΄μ„œ Pairλ₯Ό 많이 μ‚¬μš©ν•΄μ™”λ‹€. 졜근 또 Pairλ₯Ό μ‚¬μš©ν•˜λ €λ‹€κ°€ λ‹€λ₯Έ μ‚¬λžŒλ“€λ„ 많이 μ‚¬μš©ν•˜λŠ”μ§€ κΆκΈˆν•˜μ˜€κΈ° λ•Œλ¬Έμ΄λ‹€. 그러던 쀑 μ£Όλͺ©ν• λ§Œν•œ 글을 μ°Ύμ•˜λ‹€. Prefer Data Classes Over PairsλΌλŠ” 글인데 ν΄λ¦°μ½”λ“œ κ΄€μ μ—μ„œ μ½”ν‹€λ¦°μ˜ Pair와 Triple에 λŒ€ν•΄ μž‘μ„±ν•œ κΈ€μ΄μ—ˆλ‹€. κ½€ 쒋은 λ‚΄μš©μ΄λΌ μžŠμ§€ μ•ŠκΈ°μœ„ν•΄ 기둝해두렀 ν•œλ‹€.


🚨 지양해야될 클래슀: Pair, Triple

β€œDon’t ever, for any reason, use a Pair or Triple, for any reason, ever, no matter what, no matter where, or who you are with, or where you are going, or where you’ve been. Ever, for any reason. Whatsoever.”
β€” Michael Scott
β€” Matt Robertson

μ–΄λ–€ μ΄μœ λ‘œλ“  μ–΄λ–€ μ΄μœ λ‘œλ“ , μ–΄λ–€ μ΄μœ λ‘œλ“ , μ–΄λ””μ„œλ“ , λˆ„κ΅¬μ™€ ν•¨κ»˜ μžˆλ“ , μ–΄λ””λ‘œ κ°€λ“ , 어디에 κ°€λ“  Pairλ‚˜ Triple을 μ‚¬μš©ν•˜μ§€ λ§ˆμ„Έμš”. μ–΄λ–€ μ΄μœ λ‘œλ“  항상. μ–΄μ¨Œλ“ .

μ˜ˆμ‹œ

ν•΄λ‹Ή 글에 λ”°λ₯΄λ©΄ Pair와 Tripe은 lazy data classes라 ν•œλ‹€. lazyλŠ” 쒋은 μ’…λ₯˜κ°€ μ•„λ‹ˆλ‹€. μ•„λž˜μ˜ μ‹¬ν”Œ μ˜ˆμ‹œ μ½”λ“œλ₯Ό 보자.

1
fun getCoffee(): Pair<Roast, Size>

이런 μ½”λ“œκ°€ μžˆλ‹€κ³  κ°€μ •ν–ˆμ„ λ•Œ μ‚¬μš©λœλ‹€λ©΄ μ•„λž˜μ™€ 같이 μ‚¬μš©λ  것이닀.

1
2
val coffee = getCoffee()
print(β€œA ${coffee.second}, ${coffee.first} roast coffee.")

이 μƒν™©μ—μ„œ β€œν¬λ¦Όμ„ μœ„ν•œ 곡간을 λ‚¨κ²¨λ‘κΈ°β€λΌλŠ” μš”κ΅¬μ‚¬ν•­μ΄ 듀어왔을 λ•Œ Pairλ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œλΌλ©΄ μ•„λž˜μ™€ 같이 μˆ˜μ •λ  것이닀.

1
2
3
4
5
6
fun getCoffee(): Triple<Roast, Size, Boolean>

...

val coffee = getCoffee()
print("A ${coffee.second}, ${coffee.first} roast coffee with ${if (coffee.third) "" else "no "}room for cream.")

μ΄λŠ” μœ μ§€λ³΄μˆ˜μ˜ κ΄€μ μ—μ„œ μ΅œμ•…μ˜ 선택이닀. λ‹€λ₯Έ κ°œλ°œμžκ°€ μ € μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ•Ό ν•œλ‹€λ©΄, μ € μ½”λ“œκ°€ ν•˜λŠ” 일이 무엇인지 νŒŒμ•…ν•˜κΈ° μœ„ν•΄ getCoffee()κ°€ μžˆλŠ” νŒŒμΌκΉŒμ§€ 듀어와야 ν•œλ‹€!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
data class Coffee(
    val roast: Roast,
    val size: Size,
    val leaveRoom: Boolean
)

...

fun getCoffee(): Coffee

...

val coffee = getCoffee()
print("A ${coffee.size}, ${coffee.roast} roast coffee with ${if (coffee.leaveRoom) "" else "no "}room for cream.")

Pair와 Triple을 μ‚¬μš©ν•˜λŠ” λŒ€μ‹  data classλ₯Ό λ§Œλ“€μ–΄ μ „λ‹¬ν•˜λ©΄ μœ μ§€λ³΄μˆ˜μ™€ ν™•μž₯에 쒋은 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€. μ›λž˜μ˜ 경우라면

1
val ounces = coffee.second.ounces - if (coffee.third) 2 else 0

coffee.thirdκ°€ 무엇인지 μ•Œ 수 μ—†μ—ˆμ§€λ§Œ

1
val ounces = coffee.size.ounces - if (coffee.leaveRoom) 2 else 0

ν˜„μž¬λŠ” ν•œλˆˆμ— μ•Œμ•„λ³Ό 수 μžˆλ‹€.

클린 μ½”λ“œ

λ§ˆμ§€λ§‰μœΌλ‘œ ν•΄λ‹Ή 글에선 클린 μ½”λ“œμ— λŒ€ν•œ λ‚΄μš©μ„ 적으며 Pair와 Triple을 μ‚¬μš©ν•˜λŠ” ν–‰μœ„κ°€ μ•ˆν‹°νŒ¨ν„΄μž„μ„ κ°•μ‘°ν•˜κ³  μžˆλ‹€.

Pairs and Triples are anti-patterns that should be avoided in preference for data classes.

λ‹€λ₯Έ 이듀이 읽을 것을 μƒκ°ν•˜μ—¬ λ‚΄κ°€ μž‘κ°€λΌλŠ” λ§ˆμΈλ“œλ‘œ κ°œλ°œν•΄μ•Ό ν•œλ‹€. κΉ¨λ—ν•˜κ³ , μœ μ§€λ³΄μˆ˜μ— μš©μ΄ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Όν•˜λ©°, 쓰기에 더 μ–΄λ €μ›Œμ§€λ”λΌλ„ ν•œλˆˆμ— νŒŒμ•…λ˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜μžλŠ” λ‚΄μš©μ„ 적으며 Pairsλ₯Ό μ‚¬μš©ν•˜μ§€ 말 것을 ν•œλ²ˆ 더 κ°•μ‘°ν•œλ‹€.


이 글은 κ·Έλ™μ•ˆ λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œμ— λŒ€ν•΄ κ³ λ―Όν•΄λ³΄κ²Œ λ§Œλ“ λ‹€. λ°λ“œλΌμΈμ΄ λ‹€κ°€μ˜€λ©΄ κ΅¬ν˜„μ— κΈ‰κΈ‰ν•΄μ Έ 일단 κ΅¬ν˜„λΆ€ν„° λλ‚΄μžλŠ” μƒκ°μœΌλ‘œ κ°œλ°œμ„ ν•˜κ²Œ λ˜μ—ˆλŠ”λ°, μ΄λŠ” 맀우 μ’‹μ§€ μ•Šμ€ μŠ΅κ΄€μ΄λ‹€. μ΄λ ‡κ²Œ μž‘μ„±ν•˜λŠ” μ½”λ“œλŠ” λ¦¬νŒ©ν† λ§λ„ 쉽지 μ•Šλ‹€. κ°œλ°œμ„ ν•  λ•Œλ§ˆλ‹€ λ‚΄κ°€ 쒋은 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  μžˆλŠ”μ§€, 쒋은 섀계λ₯Ό ν•˜κ³  μžˆλŠ”μ§€ 항상 κ³ λ―Όν•˜μ§€λ§Œ 항상 λΆ€μ‘±ν•œ 것 κ°™λ‹€.

This post is licensed under CC BY 4.0 by the author.