ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] Tuples
    Swift 2022. 2. 15. 08:32

    (๋ชจ๋“  ์ฝ”๋“œ๋Š” Playground์—์„œ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

     

    Swift์—๋Š” ์‚ฌ์‹ค 2๊ฐ€์ง€์˜ ํƒ€์ž…์ด ์กด์žฌํ•œ๋‹ค.

     

    ๋ฐ”๋กœ Named Type๊ณผ Compound Type์ธ๋ฐ,

    Named Type์€ ํƒ€์ž…์ด ์ •์˜๋  ๋•Œ ํŠน์ • ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š”, ๋ง ๊ทธ๋Œ€๋กœ ์ด๋ฆ„์ด ์žˆ๋Š” ํƒ€์ž…์„ ๋งํ•œ๋‹ค.

     

    ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋‚ด๊ฐ€ MyClass๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด "MyClass" ๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ–๋Š” ํƒ€์ž…์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด๋‹ค.

     

    Named Type์—๋Š” Class (ํด๋ž˜์Šค), Structure (๊ตฌ์กฐ์ฒด), Enumeration (์—ด๊ฑฐํ˜•), Protocol (ํ”„๋กœํ† ์ฝœ)์ด ํฌํ•จ๋œ๋‹ค.

    ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•„๋Š” Int, Double, String, Character ๊ณผ ๊ฐ™์€ ์ž๋ฃŒํ˜•๋“ค๋„ ๊ตฌ์กฐ์ฒด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Named Type์ด๋‹ค.

     

     

    Compound Type์€ Swift ์ž์ฒด์—์„œ ์ •์˜๋˜๋Š” ๊ฒƒ์œผ๋กœ, ์ด๋ฆ„์ด ์—†๋Š” ํƒ€์ž…์„ ๋งํ•œ๋‹ค. 

    Compound Type์—๋Š” 2๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ Function Type๊ณผ Tuple Type์ด๋‹ค.

     

    ์ •์ˆ˜ 2๊ฐœ๋ฅผ ๋ฐ›์•„์„œ ๋‘ ๊ฐ’์„ ๋”ํ•œ ํ›„์— ๊ฒฐ๊ณผ ๊ฐ’์„ ์ •์ˆ˜๋กœ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•˜์ž.

    ๊ทธ๋Ÿฌ๋ฉด ์ด ํ•จ์ˆ˜์˜ ํƒ€์ž…์€ ๋ฌด์—‡์ผ๊นŒ?

     

    ๋ฐ”๋กœ (Int, Int) -> Int ํƒ€์ž…์ด๋‹ค. 

     

    ์ด๋ ‡๊ฒŒ Function๊ณผ Tuple์€ Compound Type์ธ๋ฐ, ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” Tuple์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

     

     

     

    ํŠœํ”Œ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ( ) ์•ˆ์— ,๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ๋‚˜์—ดํ•˜์—ฌ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.

    (expression1, expression2, ..)

     

     

    ํŠœํ”Œ ๋‚ด์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด Compound Type์ด๋‹ค.

    ํŠœํ”Œ ๋‚ด์—์„œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ˜•์‹์˜ ๊ฐ’์„ ๋™์‹œ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

    let phoneInfo = ("iPhoneX", 14.5, 3)
    type(of: phoneInfo) // (String, Double, Int).Type

    ์ƒ์ˆ˜ phoneInfo์— ์„œ๋กœ ๋‹ค๋ฅธ ํ˜•์‹์„ ๊ฐ€์ง„ 3๊ฐœ์˜ ๊ฐ’์„ ํŠœํ”Œ๋กœ ์ €์žฅํ–ˆ๋‹ค. 

    phoneInfo์˜ ํƒ€์ž…์€ (String, Double, Int)์„ ์ €์žฅํ•˜๋Š” ํŠœํ”Œ์ด๋‹ค. 

     

    ์ด๋ ‡๊ฒŒ ํŠœํ”Œ ๋‚ด์— ์žˆ๋Š” ๊ฐ’๋“ค์„ ๋ฉค๋ฒ„๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ,

    ํŠœํ”Œ์ด ํ•œ๋ฒˆ ์ƒ์„ฑ๋˜๊ณ  ๋‚˜๋ฉด ํŠœํ”Œ ๋‚ด์— ์ƒˆ๋กœ ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋‹ค. 

    ๋Œ€์‹ ์—, ๋ฉค๋ฒ„์— ์ €์žฅ๋œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค.

     

     

    ํ•˜์ง€๋งŒ ์œ„์˜ phoneInfo ํŠœํ”Œ์€ ์ƒ์ˆ˜๋กœ ์ €์žฅ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

    ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ํŠœํ”Œ์„ ์ €์žฅํ•ด๋ณด์ž.

    var newPhoneInfo = phoneInfo

    ์ด๋ ‡๊ฒŒ newPhoneInfo๋ผ๋Š” ๋ณ€์ˆ˜์— phoneInfo๋ฅผ ์ €์žฅํ–ˆ๋‹ค. 

    ํŠœํ”Œ์€ ๊ฐ’ ํ˜•์‹์ด๊ธฐ ๋•Œ๋ฌธ์— newPhoneInfo์— ๊ธฐ์กด์˜ ๊ฐ’์ด ๋ณต์‚ฌ๋œ๋‹ค. 

     

     

    ํŠœํ”Œ ๋‚ด์˜ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ๋•Œ์—๋Š” ํŠœํ”Œ ์ด๋ฆ„๊ณผ .์„ ์“ฐ๊ณ  ๋’ค์— ์ธ๋ฑ์Šค (์ˆซ์ž)๋ฅผ ์จ์ฃผ๋ฉด ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ด๋ฅผ ์  ๋ฌธ๋ฒ•์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, Swift์—์„œ๋Š” Explicit Member Expression์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

    0-based Index์ด๋ฏ€๋กœ ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ , 0์„ ์“ฐ๋ฉด 0๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ์ €์žฅ๋œ ๋ฉค๋ฒ„์—, 1์„ ์“ฐ๋ฉด 1๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ์ €์žฅ๋œ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

    tupleName.index

     

    ์ด์ œ ์ ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด์„œ newPhoneInfo.1์— ์ €์žฅ๋œ ๊ฐ’์„ 15๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์ž.

     

     

    ๊ทธ๋ ‡๋‹ค๋ฉด phoneInfo์˜ 1๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ์ €์žฅ๋œ ๊ฐ’๋„ 15๋กœ ๋ฐ”๋€Œ์—ˆ์„๊นŒ?

     

    ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋‹ค. ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด ํŠœํ”Œ์€ ๊ฐ’ ํ˜•์‹์ด๊ธฐ ๋•Œ๋ฌธ์— phoneInfo์˜ ๊ฐ’์ด newPhoneInfo์— ๋ณต์‚ฌ๋˜์–ด ์ €์žฅ๋˜์—ˆ๋‹ค.

    ๊ฐ’ ํ˜•์‹์— ๋Œ€ํ•ด์„œ๋Š” ๋‚˜์ค‘์— ๋” ์ž์„ธํžˆ ๊ณต๋ถ€ํ•˜๋„๋ก ํ•˜์ž.

     

     

    ์ด๋ ‡๊ฒŒ ํŠœํ”Œ ๋‚ด์˜ ๋ฉค๋ฒ„์— ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์ ‘๊ทผํ•ด๋ณด์•˜๋‹ค. 

    ์œ„์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ํŠœํ”Œ๋“ค์€ ๋ชจ๋‘ Unnamed Tuple์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋‹ค๋ณด๋‹ˆ ์•„๋ฌด๋ž˜๋„ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

     

     

    ์ด๋ฒˆ์—๋Š” ํŠœํ”Œ ๋‚ด์˜ ๋ฉค๋ฒ„์— ์ด๋ฆ„์„ ๋ถ™์—ฌ์„œ ์ ‘๊ทผํ•ด๋ณด๋„๋ก ํ•˜์ž.

    ๋ฉค๋ฒ„์— ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค.

    ํ•จ์ˆ˜์—์„œ Argument Label์„ ์จ์ฃผ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์•ž์— ์ด๋ฆ„์„ ๋ถ™์—ฌ์„œ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.

    let namedTuple = (model: "iPhoneX", os: 14.5, year: 3)

     

    ์ด์ œ ๋ฉค๋ฒ„ ์ด๋ฆ„์„ ํ†ตํ•ด์„œ ํŠœํ”Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ํŠœํ”Œ์„ Named Tuple์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋” ๋†’์•„์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

    tupleName.memberName

     

     

     

    ๊ทธ๋ ‡๋‹ค๋ฉด ํŠœํ”Œ์˜ ๋ฉค๋ฒ„๋ฅผ ๋”ฐ๋กœ ์ƒ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•  ์ˆ˜๋Š” ์—†์„๊นŒ?

    Tuple Decomposition (ํŠœํ”Œ ๋ถ„ํ•ด) ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค.

     

    Tuple Decomposition์€ ํŠœํ”Œ์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ๋ฉค๋ฒ„๋ฅผ ๊ฐœ๋ณ„ ์ƒ์ˆ˜๋‚˜ ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

    Tuple Decomposition์˜ ๋ฌธ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    let (name1, name2, ...) = tupleName
    var (name1, name2, ...) = tupleName

    ํŠœํ”Œ์ด ๋ถ„ํ•ด๋˜์–ด name1, name2์— ์ฐจ๋ก€๋Œ€๋กœ ํŠœํ”Œ์˜ ๋ฉค๋ฒ„๊ฐ€ ์ €์žฅ๋œ๋‹ค.

     

    ์ด ๋•Œ, ์ด๋ฆ„์˜ ๊ฐฏ์ˆ˜๋Š” ํŠœํ”Œ์— ์ €์žฅ๋œ ๋ฉค๋ฒ„์˜ ์ˆ˜์™€ ๋ฐ˜๋“œ์‹œ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ์ˆ˜๊ฐ€ ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

     

     

    ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

    a, b, c๋ผ๋Š” ์ด๋ฆ„์— ๊ฐ๊ฐ phoneInfo์˜ 0๋ฒˆ์งธ ์ธ๋ฑ์Šค๊ฐ’, 1๋ฒˆ์งธ ์ธ๋ฑ์Šค๊ฐ’, 2๋ฒˆ์งธ ์ธ๋ฑ์Šค๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

     

     

    ๋งŒ์•ฝ ํŠœํ”Œ์˜ ๋ฉค๋ฒ„ ์ค‘ ํŠน์ • ๋ฉค๋ฒ„๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ด๋ฆ„์„ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ, ์™€์ผ๋“œ์นด๋“œ ํŒจํ„ด์„ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

     

     

     

    ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

    let point = (5, 5)
    
    if point.0 > 0 && point.1 > 0 {
        print("์ œ 1์‚ฌ๋ถ„๋ฉด")
    }

    point.0๊ณผ point.1์˜ ๊ฐ’์ด ๋ชจ๋‘ 0๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— "์ œ 1์‚ฌ๋ถ„๋ฉด"์„ ์ถœ๋ ฅํ•œ๋‹ค.

    ๋งŒ์•ฝ ์—ฌ๊ธฐ์„œ ์กฐ๊ฑด์„ ๋” ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด, ์ฝ”๋“œ๋Š” ๋” ๋ณต์žกํ•ด์งˆ ๊ฒƒ์ด๋‹ค. 

     

    switch๋ฌธ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด Tuple Matching์„ ์ด์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋” ๊น”๋”ํ•˜๊ฒŒ ์งค ์ˆ˜ ์žˆ๊ณ , ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

    switch point {
    case (0..., 0...) :
        print("์ œ 1์‚ฌ๋ถ„๋ฉด")
    default:
        break
    }

     

     

    ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Interval Matching, ์™€์ผ๋“œ์นด๋“œ ํŒจํ„ด, Value Binding์„ ์ด์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

    switch point {
    case (0..., 0...) : // Interval Matching
        print("์ œ 1์‚ฌ๋ถ„๋ฉด")
    case (_, 5): // Wildcard pattern
        print("y์ขŒํ‘œ๋Š” 5์ด๋‹ค.")
    case let (x, y) where x > 0: // Value Binding
        print("x์ขŒํ‘œ๋Š” 0๋ณด๋‹ค ํฌ๋‹ค.")
    default:
        break
    }

     

    ๋Œ“๊ธ€

Designed by Tistory.