작성
·
616
답변 5
1
네 도형님 안녕하세요.^^
저도 예전에 동기/비동기 주제를 공부할때, 검색시에 다른 언어에서 블록/논블록의 개념이 자꾸나와서 헷갈렸던 경험이 있었는데 좋은 질문을 해주셔서 감사합니다.
일단 결론부터 말씀드리면 iOS프로그래밍에서는 동기는 Blocking의 개념으로, 그리고 비동기는 Non-Blocking의 개념으로만 사용하고 있습니다. 해외 등 여러가지 자료에서도 Swift나 iOS에서는 따로 Blocking/Non-Blocking의 개념에 대해서는 설명하는 자료가 없더라고요.
그래서 제 강의에서도, 실제 애플이 생각하는 개념인 iOS에만 맞추어서 따로 설명드리지 않았던 것이고요.
다만, 질문을 주셨으니 답변을 해드리자면,
위에서 정리한 것처럼 정확하게 말씀드리자면..
▶︎ Blocking / Non-Blocking은 호출되는 함수가 바로 리턴하느냐 마느냐가 중요한 개념이고,
1) Blocking - 즉시 리턴하지 않음 (일을 못하게 막음)
2) Non-Blocking - 즉시 리턴
▶︎ 동기 / 비동기는 작업완료여부를 호출한 함수가 신경쓸 것인지, callback이 신경쓸 것인지에
1) 동기 - 호출한 함수가 작업완료 신경씀
2) 비동기 - callback이 작업완료 신경씀
관한 개념입니다. 제가 위에 그림으로도 표현해봤으니 한번 보시면 좋을 것 같고. 다만 이런 개념이 합쳐서 Blocking & Async는 어차피 다른 일을 못하니 일부러 사용하는 경우는 없다고 합니다.
(위의 그림을 보시면서 한번 생각해보시면 될 것 같습니다. ^^)
네, 그리고 두번째 질문으로 언어적 특성 때문인가?에 대해서 말씀해 주셨듯이.. 제가 애플이 어떤 의도로 동기/비동기 개념으로만 설계한 것인지는 잘 모르겠습니다..(제가 깊게 공부한 언어도 Swift가 일단 유일해서요..) 일단 제가 아는 선에서 뇌피셜로 말씀드리자면, 다른 언어들은 동기/비동기/블로킹/논블로킹의 여부를 함수 자체의 호출 여부로 판단하고 있는 것 같습니다.
그런데, Swift에서는 클로저 안에서 함수의 호출을 여러개로 묶을 수 있고, 클로저 단위를 작업단위로 다루고 있기 때문에, 함수 단위로 나누었을 때 작업 완료를 지속적으로 확인할 수있는 동기적 - NonBlocking의 개념을 사용하지 않는 것이 아닐까? 추측되고 있습니다. (클로저내에 함수가 여러개 일때 그 작업이 정말 다 완료된 것인지 확인하는 방법이 비효율적일 것 같습니다. 다른 언어에서는 함수 호출 여부로 판단하니 호출한 스택프레임 하나만 확인하면 되지만, 스위프트는 클로저로 묶어서 여러개의 스택프레임을 일정하게 묶어서 확인 할 수 있는 그런게 어렵지 않을까.. 뭐 이런 추측이요..)
혹시 궁금하신 부분이 해결되시길 바라며..
https://drive.google.com/file/d/16puFZy9oM-mrjjPuQRs3NTDwhIRNy8kO/view?usp=sharing
혹시나 위의 표 정리 내용이 필요하시면 위의 링크에서 다운 받으셔서 활용하시면 될 것 같습니다.
고맙습니다. :)
그리고 혹시 다른 분이 글로 써놓으신 좋은 예가 있는 것 같아서 링크 달아드려요.. 위의 그림과 함께 보시면 좋을 것 같네요!
1
아니면 혹시 Swift에서는 블록/논블록 개념을 생략하고 동기/비동기로만 설명이 가능할 수 있는건가여
언어적인 특성상 동기/비동기로만 설명가능한 것인지 말씀 부탁드립니다.
0
0
네 그리고 실제로 애플에서도 저와 똑같은 방식으로, 그렇게 설명하고 있습니다.
https://developer.apple.com/videos/play/wwdc2016/720/
참고해보시면 좋을 것 같네요. 해당 영상은 wwdc2016에서 Concurrent Programming With GCD in Swift3 영상입니다.
감사합니다.
0