ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] ๋‹จ๋ฝ ํ‰๊ฐ€ (Short-circuit Evaluation), Side Effect
    Swift 2022. 1. 20. 14:21

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

     

    ์ด๋ฒˆ์—” ๋‹จ๋ฝ ํ‰๊ฐ€ (Short-circuit Evaluation) ์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

     

    ๋‹จ๋ฝ ํ‰๊ฐ€ (Short-circuit Evaluation) ๋ž€?

    ๋‹จ๋ฝ ํ‰๊ฐ€๋ž€, ๋…ผ๋ฆฌ์‹์—์„œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋งŒ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

     

    ์˜ˆ๋ฅผ ๋“ค๋ฉด,

    Logical AND (&&) ์—ฐ์‚ฐ์—์„œ ์ฒซ๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ false์ธ ๊ฒฝ์šฐ, ๋‘๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๋ณผ ํ•„์š”๋„ ์—†์ด ๋ฌด์กฐ๊ฑด false์ด๋‹ค.

    Logical OR (||) ์—ฐ์‚ฐ์—์„œ ์ฒซ๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ true์ธ ๊ฒฝ์šฐ, ๋‘๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๋ณผ ํ•„์š”๋„ ์—†์ด ๋ฌด์กฐ๊ฑด true์ด๋‹ค.

     

    ํ•˜์ง€๋งŒ!

    ๋งŒ์•ฝ Logical AND (&&) ์—ฐ์‚ฐ์—์„œ ์ฒซ๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ true๋ผ๋ฉด, ๋‘๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž์˜ ๊ฐ’์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋‘๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž๋„ ์‹คํ–‰ํ•ด๋ณด์•„์•ผํ•œ๋‹ค.

    ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Logical OR (||) ์—ฐ์‚ฐ์—์„œ ์ฒซ๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ false๋ผ๋ฉด, ๋‘๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž์˜ ๊ฐ’์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋‘๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž๋„ ์‹คํ–‰ํ•ด์•ผํ•œ๋‹ค.

     

    ์ด๋ ‡๊ฒŒ ๋…ผ๋ฆฌ์‹์—์„œ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋งŒ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋‹จ๋ฝ ํ‰๊ฐ€๋ผ๊ณ  ํ•œ๋‹ค!

     

    ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

    var a = 1
    var b = 1
    
    func updateA() -> Bool {
        a += 1
        return false
    }
    
    func updateB() -> Bool {
        b += 1
        return true
    }
    
    if updateA() && updateB() {
        // a๊ฐ€ false์ด๋ฏ€๋กœ, updateB()๋Š” ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.
        // ์ฆ‰, updateA()์˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ์„œ updateB()๊ฐ€ ํ˜ธ์ถœ๋  ์ˆ˜๋„, ํ˜ธ์ถœ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.
    }
    
    a // 2
    b // 1

     

    updateA, updateB์˜ 2๊ฐ€์ง€ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค.

    updateA๋Š” a๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚ค๋Š” ํ•จ์ˆ˜์ด๊ณ , updateB๋Š” b๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚ค๋Š” ํ•จ์ˆ˜์ด๋‹ค.

    if ๊ตฌ๋ฌธ์—๋Š” Logical AND ์—ฐ์‚ฐ์ž๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, updateA๋Š” ํ•ญ์ƒ false๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

    ๋”ฐ๋ผ์„œ updateA๋Š” ํ˜ธ์ถœ๋˜๊ณ , updateB๋Š” ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค. 

     

    ์‹ค์ œ๋กœ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด, a๋Š” ์›๋ž˜ ๊ฐ’์—์„œ 1์ด ์ฆ๊ฐ€๋œ 2๊ฐ€, b๋Š” ์›๋ž˜ ๊ฐ’์ธ 1์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ์—ฌ๊ธฐ์„œ ์ž ๊น!

    ํ‘œํ˜„์‹์„ ํ‰๊ฐ€ํ–ˆ์„ ๋•Œ, ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ Side Effect๋ผ๊ณ  ํ•œ๋‹ค.

     

    ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ด๋ƒ๋ฉด,

    a
    b

     

    ์œ„์˜ ์ฝ”๋“œ์—์„œ a, b๋Š” ๋‹จ์ˆœํžˆ ์ €์žฅ๋œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ๋‹ค. ์ €์žฅ๋œ ๊ฐ’์„ ๋‹จ์ˆœํžˆ ์ถœ๋ ฅํ•˜๊ณ , ๊ฐ’์˜ ๋ณ€๊ฒฝ์€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Side Effect๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋‹ค.

     

     

    ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์ฝ”๋“œ์—์„œ๋Š” Side Effect๊ฐ€ ๋ช‡ ๋ฒˆ ๋ฐœ์ƒํ–ˆ์„๊นŒ?

    a = 3
    b

     

    ์ด ๊ฒฝ์šฐ, a์˜ ๊ฐ’์ด 1์—์„œ 3์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋‹ˆ 1๋ฒˆ์˜ Side Effect๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค!

     

    Side Effect๋Š” ํ•ญ์ƒ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„ ๋‚ด์— ์žˆ์–ด์•ผํ•˜๊ณ , ์˜๋„ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•ด์•ผํ•œ๋‹ค.

    ์ฆ‰, ์œ„์˜ ์ฝ”๋“œ์˜ if ๊ตฌ๋ฌธ์—์„œ updateA()๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , ์ด๋Š” a ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ Side Effect๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค.

     

     

    ํ•˜์ง€๋งŒ ๋…ผ๋ฆฌ์‹์— Side Effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์—, 

    ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋…ผ๋ฆฌ์‹์„ ์ž‘์„ฑํ•  ๋•Œ์—๋Š” Side Effect๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ฝ”๋“œ๋Š” ์“ฐ์ง€ ์•Š๊ฑฐ๋‚˜, ์•„๋ž˜์™€ ๊ฐ™์ด ์กฐ๊ฑด ํ‰๊ฐ€ ์ „์— ๋ฏธ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•ด๋†“๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

    var a = 1
    var b = 1
    
    func updateA() -> Bool {
        a += 1
        return false
    }
    
    func updateB() -> Bool {
        b += 1
        return true
    }
    
    // ๋…ผ๋ฆฌ ํ‘œํ˜„์‹์— ๊ด€๊ณ„์—†์ด updateA(), updateB()๊ฐ€ ๋ชจ๋‘ ํ˜ธ์ถœ๋œ๋‹ค.
    let resultA = updateA() // 2
    let resultB = updateB() // 1
    
    if resultA && resultB {
        // ๋‹จ์ˆœํžˆ ์ƒ์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์„ ์ฝ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, Side Effect๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
    }
    
    a // 2
    b // 1

     

    ๋Œ“๊ธ€

Designed by Tistory.