iOS Study/Swift Study

Swift์—์„œ์˜ Call By Value vs Call By Reference

youngjaeLee1026 2022. 3. 12. 16:35

1. Call By Value

  • Call By Value๋ž€, ๊ฐ’์— ์˜ํ•œ ํ˜ธ์ถœ๋กœ ํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž๋กœ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ „๋‹ฌ๋  ๋•Œ ๋ณต์‚ฌ๋ผ์„œ ์ „๋‹ฌ๋˜๋Š” ๋ฐฉ๋ฒ•
  • ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณต์‚ฌ๋ผ์„œ ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜์—์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ์›๋ณธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ

2. Call By Reference

  • Call By Reference๋ž€, ์ฐธ์กฐ์— ์˜ํ•œ ํ˜ธ์ถœ๋กœ ํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž๋กœ ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์ด ์ „๋‹ฌ๋˜๋Š” ๋ฐฉ๋ฒ•
  • ์ฃผ์†Œ๊ฐ€ ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•จ์ˆ˜์—์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์›๋ณธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ
//
//  main.swift
//  CallByValueCallByReference
//
//  Created by ์ด์˜์žฌ on 2022/03/12.
//

//MARK: - Framework
import Foundation

//MARK: - Type
struct ValueType {
    //MARK: - Property
    var number: Int

    //MARK: - Initializer
    init(_ number: Int) {
        self.number = number
    }
}

class ReferenceType {
    //MARK: - Property
    var number: Int

    //MARK: - Initializer
    init(_ number: Int) {
        self.number = number
    }
}

//MARK: - Function
func callByValue(_ valueType: ValueType) -> Void {
    var newValueType: ValueType = valueType
    newValueType.number = 10
}

func callByReference(_ referenceType: ReferenceType) -> Void {
    var newReferenceType: ReferenceType = referenceType
    newReferenceType.number = 10
}

func solution() -> Void {
    var valueType: ValueType = ValueType(5)
    var referenceType: ReferenceType = ReferenceType(5)


    print("Before Call By Value : \(valueType.number)")
    print("Before Call By Reference : \(referenceType.number)")

    callByValue(valueType)
    callByReference(referenceType)

    print("Call By Value : \(valueType.number)")
    print("Call By Reference : \(referenceType.number)")
}
solution()

3. Swift์—์„œ์˜ Array

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-03-12 16 16 04

  • Swift์—์„œ Array๋Š” ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด struct ์ฆ‰, ๊ฐ’ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•˜๋Š” Java์™€ ๋‹ฌ๋ฆฌ Call By Value์˜ ๋ฐฉ์‹์„ ๋”ฐ๋ฆ„
  • Call By Value๋ฅผ Call By Reference ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋‚˜, ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ž„
  • ๋‹จ, ๋ชฉ์ ์ด ๋ช…ํ™•ํ•˜๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ
//array์˜ 0๋ฒˆ ์›์†Œ์™€ 1๋ฒˆ ์›์†Œ๋ฅผ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜
func swap(_ array: inout [Int]) -> Void {
	let temp: Int = array[0]
	array[0] = array[1]
	array[1] = temp
}

func solution() -> Void {
	var array: [Int] = [2, 1, 3, 4, 5]
	swap(&array)
	print(array)	// [1, 2, 3, 4, 5]
}
solution()