의도한 결과 외에 예상치 못하게 따라오는 부수적인 효과를 말한다.
알러지 때문에 항히스타민제를 복용해서 알러지는 가라앉혔지만 졸음같은 부작용이 따라올 수 있는 것처럼 말이다.
함수형 프로그래밍
동기와 비동기 프로그래밍
상태 관리
동기 프로그래밍에서 발생할 수 있는 Side Effect
func readFile() {
// 큰 파일을 읽는 작업 (동기적으로 실행)
let fileContent = try! String(contentsOfFile: "largeLargeFile.txt")
print("File content read")
}
func processFile() {
readFile() // 이 작업이 끝나기 전까지 다른 작업은 대기
print("File processing done")
}
processFile()
readFile 함수에서 읽는 largeLargeFile.txt가 정말 너무 큰 파일이라면? 읽는 동안 processFile 함수의 다음 줄이 실행되지 않고 프로그램이 멈춘 것처럼 보일 수 있다
비동기 프로그래밍에서 발생할 수 있는 Side Effect
경쟁 조건 (race condition)
여러 비동기 작업이 동시에 실행될 때 작업 순서에 따라 결과가 달라질 수 있다. 두 개의 비동기 함수가 동시에 데이터를 업데이트하게 될 시 데이터가 이상해질 수 있다.
상태 불일치 (iconsistent state)
비동기 작업이 완료되기 전에 다른 작업이 시작되게되면 상태가 불안정해질 수 있다. 서버에서 데이터로드가 완료되지 않았는데 데이터를 사용하는 부분이 동시에 실행되면 에러가 발생하는 것이다
import Foundation
func fetchData(completion: @escaping (String) -> Void) {
DispatchQueue.global().async {
// 서버에서 데이터 가져오는 작업 (비동기적으로 실행)
let data = "Fetched Data"
completion(data)
}
}
var globalData = ""
fetchData { data in
globalData = data
print("Data fetched: \(globalData)")
}
print("End of function")
경쟁 조건
: globalData가 설정되기 전에 print("End of function")부분이 먼저 출력될 수 있다.
상태 불일치
: globalData가 설정되기 전에 다른 코드가 globalData를 사용하려고 하면 잘못된 데이터를 참조할 수 있다.
에러 처리 복잡성 (complex error handling)
비동기 코드에서 에러가 발생할 수 있는 지점이 많아 에러 처리가 복잡해진다. 콜백 함수 내에서 발생한 에러가 적절히 처리되지 않을 경우 비정상 종료될 수 있다.
메모리 누수 (memory leak)
비동기 작업이 완료되지 않고 자원 해제가 되지 않아서 메모리 누수가 발생할 수 있다.
오늘은 심란하다