Skip to content

Latest commit

Β 

History

History
84 lines (59 loc) Β· 5.83 KB

File metadata and controls

84 lines (59 loc) Β· 5.83 KB

동기(Synchronous) vs 비동기(Asynchronous) μž‘μ—…

image1

Swiftμ—μ„œ 동기 μž‘μ—…κ³Ό 비동기 μž‘μ—…μ˜ 차이점을 μ„€λͺ…ν•˜μ„Έμš”. 각각은 μ–Έμ œ μ‚¬μš©ν•˜λ‚˜μš”?

동기식 μž‘μ—…κ³Ό 비동기식 μž‘μ—…μ€ 각각 κ³ μœ ν•œ νŠΉμ„±κ³Ό μ‚¬μš© 사둀λ₯Ό κ°€μ§„ μ„œλ‘œ λ‹€λ₯Έ μ½”λ“œ μ‹€ν–‰ 방식을 μ˜λ―Έν•©λ‹ˆλ‹€.

메인 μŠ€λ ˆλ“œκ°€ μ°¨λ‹¨λ˜λ©΄ 앱이 μ‘λ‹΅ν•˜μ§€ μ•Šκ±°λ‚˜ λ©ˆμΆ”λŠ” λ“± μ‚¬μš©μž ν™˜κ²½μ΄ μ €ν•˜λ  수 μžˆμœΌλ―€λ‘œ 메인 μŠ€λ ˆλ“œμ˜ 응닡성을 μœ μ§€ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. λ”°λΌμ„œ λ‹€μ†Œ μ‹œκ°„μ΄ 걸릴 수 μžˆλŠ” μž‘μ—…μ€ λΉ„λ™κΈ°μ μœΌλ‘œ μˆ˜ν–‰ν•˜μ—¬ 메인 μŠ€λ ˆλ“œκ°€ μ‚¬μš©μž μƒν˜Έ μž‘μš©μ„ 계속 μ²˜λ¦¬ν•˜κ³  μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ›ν™œν•˜κ²Œ μ—…λ°μ΄νŠΈν•  수 μžˆλ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

동기 μž‘μ—…( Synchronous )

동기식 μž‘μ—…μ—μ„œλŠ” ν”„λ‘œκ·Έλž¨μ΄ λ‹€μŒ μ½”λ“œ μ€„λ‘œ λ„˜μ–΄κ°€κΈ° 전에 μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦½λ‹ˆλ‹€. μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ μ‹€ν–‰ 흐름이 μ°¨λ‹¨λ©λ‹ˆλ‹€. 동기식 μž‘μ—…μ€ 순차적으둜 μ°¨λ‘€λ‘œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— μΆ”λ‘ ν•˜κΈ°κ°€ κ°„λ‹¨ν•©λ‹ˆλ‹€.

일반적으둜 λΉ λ₯΄κ³ , μ°¨λ‹¨λ˜μ§€ μ•ŠμœΌλ©°, λ„€νŠΈμ›Œν¬ μš”μ²­κ³Ό 같이 잠재적으둜 μ‹œκ°„μ΄ 많이 κ±Έλ¦¬λŠ” μž‘μ—…μ΄ ν¬ν•¨λ˜μ§€ μ•ŠλŠ” μž‘μ—…μ— 동기 μž‘μ—…μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. 동기식 μž‘μ—…μ€ κ°„λ‹¨ν•œ 계산, 인메λͺ¨λ¦¬ 데이터 μ‘°μž‘ λ˜λŠ” λˆˆμ— λ„λŠ” μ§€μ—°μ΄λ‚˜ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€μ˜ μ •μ§€ 없이 λΉ λ₯΄κ²Œ μ™„λ£Œν•  수 μžˆλŠ” 기타 μž‘μ—…μ— μ ν•©ν•©λ‹ˆλ‹€.

예)

func synchronousTask() {  
	print("Swiftable")  
	print("iOS")  
	print("Community")  
}  
  
synchronousTask()

// Swiftable  
// iOS  
// Community

각 μ½”λ“œ 쀄이 μ‹€ν–‰λ˜κΈ° 전에 이전 μ½”λ“œ 쀄이 μ™„λ£Œλ  λ•ŒκΉŒμ§€ 기닀리기 λ•Œλ¬Έμ— λͺ¨λ“  인쇄 ν•¨μˆ˜κ°€ μ°¨λ‘€λ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.

λ‹€λ₯Έ μ˜ˆμ‹œλ₯Ό 톡해 이해해 λ΄…μ‹œλ‹€. sort() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ˜ 배열을 μ œμžλ¦¬μ—μ„œ μ •λ ¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. sort() λ©”μ„œλ“œλŠ” λ¬Έμžμ—΄μ˜ κΈ°λ³Έ μ •λ ¬ κΈ°μ€€(μ•ŒνŒŒλ²³ μˆœμ„œ)에 따라 λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μž¬μ •λ ¬ν•˜λŠ” 동기식 μ—°μ‚°μž…λ‹ˆλ‹€.

예)

var words = ["swiftable", "developer", "community"]  
func sortWords() {  
	words.sort() // synchronous in-memory sorting  
}  
  
sortWords()  
print("words: \(words)")  
// words: ["community", "developer", "swiftable"]

sortWords() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ ν˜„μž¬ μŠ€λ ˆλ“œμ—μ„œ words.sort() 쀄을 λ™κΈ°μ μœΌλ‘œ μ‹€ν–‰ν•©λ‹ˆλ‹€. 즉, ν˜„μž¬ μŠ€λ ˆλ“œ(이 경우 메인 μŠ€λ ˆλ“œ)λŠ” λ‹€μŒ μ½”λ“œ μ€„λ‘œ μ΄λ™ν•˜κΈ° 전에 μ •λ ¬ μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ μ°¨λ‹¨ν•˜κ³  λŒ€κΈ°ν•©λ‹ˆλ‹€.

이 경우 인메λͺ¨λ¦¬ 배열을 μ •λ ¬ν•˜λŠ” 데 동기식 연산을 μ‚¬μš©ν•˜λ©΄ μž‘μ—…μ΄ λΉ λ₯Ό κ°€λŠ₯성이 λ†’κ³  μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€κ°€ λˆˆμ— λ„κ²Œ μ§€μ—°λ˜κ±°λ‚˜ λ©ˆμΆ”μ§€ μ•ŠμœΌλ―€λ‘œ ν—ˆμš©λ©λ‹ˆλ‹€.

비동기 μž‘μ—…( Asynchronous )

비동기 μž‘μ—…μ—μ„œλŠ” ν”„λ‘œκ·Έλž¨μ΄ μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ 기닀리지 μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹  비동기 μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬λŠ” λ™μ•ˆ λ‹€λ₯Έ μž‘μ—…μ„ 계속 μ‹€ν–‰ν•©λ‹ˆλ‹€. 비동기 μž‘μ—…μ€ 일반적으둜 λ„€νŠΈμ›Œν¬ μš”μ²­, 파일 I/O λ˜λŠ” μ• λ‹ˆλ©”μ΄μ…˜κ³Ό 같이 μ™„λ£Œν•˜λŠ” 데 λ‹€μ†Œ μ‹œκ°„μ΄ 걸릴 수 μžˆλŠ” μž‘μ—…μ— μ‚¬μš©λ©λ‹ˆλ‹€.

예)

let imageURL = URL(string: "https://example.com/image.jpg")!  
  
let task = URLSession.shared.dataTask(with: imageURL) { data, response, error in 
	if let data = data, let image = UIImage(data: data) {  
		DispatchQueue.main.async {  
		// update downloaded image to UI on the main queue  
		}  
	}  
}  
  
task.resume() // asynchronous image download

μœ„μ˜ μ˜ˆμ—μ„œ 이미지 λ‹€μš΄λ‘œλ“œ μž‘μ—…μ€ λ°±κ·ΈλΌμš΄λ“œ λŒ€κΈ°μ—΄μ—μ„œ λΉ„λ™κΈ°μ μœΌλ‘œ μˆ˜ν–‰λ˜λŠ” 반면, 메인 λŒ€κΈ°μ—΄μ€ 응닡성을 μœ μ§€ν•˜λ©° μ‚¬μš©μž μƒν˜Έμž‘μš©μ΄λ‚˜ λ‹€λ₯Έ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이미지 데이터가 λ‹€μš΄λ‘œλ“œλ˜λ©΄ μ™„λ£Œ ν•Έλ“€λŸ¬κ°€ 호좜되고 메인 λŒ€κΈ°μ—΄μ— 이미지λ₯Ό ν• λ‹Ήν•˜μ—¬ μ›ν™œν•œ UI μ—…λ°μ΄νŠΈλ₯Ό 보μž₯ν•©λ‹ˆλ‹€.

비동기 이미지 λ‘œλ”©μ„ μ‚¬μš©ν•˜λ©΄ μ‹œκ°„μ΄ 였래 걸릴 수 μžˆλŠ” λ‹€μš΄λ‘œλ“œ ν”„λ‘œμ„ΈμŠ€ 쀑에 메인 μŠ€λ ˆλ“œκ°€ μ°¨λ‹¨λ˜μ–΄ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€κ°€ μ‘λ‹΅ν•˜μ§€ μ•Šκ±°λ‚˜ μ •μ§€λ˜λŠ” 것을 λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 μ ‘κ·Ό 방식은 λ„€νŠΈμ›Œν¬ μš΄μ˜μ΄λ‚˜ 기타 μž₯κΈ° μ‹€ν–‰ μž‘μ—…μ„ μ²˜λ¦¬ν•  λ•Œμ—λ„ μ›ν™œν•˜κ³  λ°˜μ‘μ΄ λΉ λ₯Έ μ‚¬μš©μž κ²½ν—˜μ„ 보μž₯ν•©λ‹ˆλ‹€

각각의 μ‚¬μš© μ‹œκΈ°:
동기 μž‘μ—…: νŠΉμ • μž‘μ—…μ΄ 순차적으둜 μ™„λ£Œλ˜λ„λ‘ ν•΄μ•Ό ν•˜κ³  λ‹€μŒ μ½”λ“œ 쀄이 이전 μž‘μ—…μ˜ 결과에 따라 λ‹¬λΌμ§€λŠ” 경우 동기화 μž‘μ—…μ„ μ‚¬μš©ν•˜μ„Έμš”. 동기식 μž‘μ—…μ€ μ‹€ν–‰ 흐름을 μ°¨λ‹¨ν•˜λŠ” 것이 ν—ˆμš©λ˜λŠ” λ‹¨μˆœν•˜κ³  수λͺ…이 짧은 μž‘μ—…μ— μ ν•©ν•©λ‹ˆλ‹€.

비동기 μž‘μ—…: μ‚¬μš©μž μž…λ ₯을 κΈ°λ‹€λ¦¬λŠ” λ„€νŠΈμ›Œν¬ μš”μ²­ μž‘μ—…κ³Ό 같이 μ‹€ν–‰ 흐름을 μ°¨λ‹¨ν•΄μ„œλŠ” μ•ˆ λ˜λŠ” μž₯κΈ° μ‹€ν–‰ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” 경우 비동기 μž‘μ—…μ„ μ‚¬μš©ν•˜μ„Έμš”. 비동기 μž‘μ—…μ€ UI의 λ°˜μ‘μ„±μ„ μœ μ§€ν•˜κ³  μž‘μ—…μ„ λ™μ‹œμ— μ‹€ν–‰ν•˜μ—¬ μ „λ°˜μ μΈ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” 데 ν•„μˆ˜μ μž…λ‹ˆλ‹€.

SwiftλŠ” Grand Central Dispatch(GCD), Operations, μ΅œμ‹  async/await ꡬ문 λ“± 비동기 μž‘μ—… μž‘μ—…μ„ μœ„ν•œ μ—¬λŸ¬ λ©”μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•˜λ©΄ λ°±κ·ΈλΌμš΄λ“œ λŒ€κΈ°μ—΄μ΄λ‚˜ μ»¨ν…μŠ€νŠΈμ— μž‘μ—…μ„ λ””μŠ€νŒ¨μΉ˜ν•˜κ³  ν•΄λ‹Ή μž‘μ—…μ˜ κ²°κ³Ό λ˜λŠ” μ™„λ£Œλ₯Ό λΉ„λ™κΈ°μ μœΌλ‘œ μ²˜λ¦¬ν•˜μ—¬ 메인 μŠ€λ ˆλ“œκ°€ 계속 응닡할 수 μžˆλ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.