iOS개발자 앨런입니다.
https://www.youtube.com/@allen_ios
제가 공부하면서 겪었던 시행착오를 쉽게 풀어내어
지식을 공유할 수있는 개발자가 되고싶습니다.
쉬운 주제로 빠른 시간 안에 겉핥기 식으로 쉽게만 가르치는 강의를 만드는 것에는 관심이 없습니다.
그런 강의는 얼마든지 빠르게 찍어내듯 만들 수 있겠지만, 결국 "좋은 개발자로 성장"하는 것은 그만큼 이론적인 기반의 밑거름이 탄탄해야 한다고 믿고 있기 때문입니다.
쉬운 강의보다는, 좋은 개발자(끝임없이 성장할 수 있는 개발자)가 되기 위해
반드시 알아야 하는 어려운 내용까지를 최대한 쉽게, 그리고 직관적으로 알려드리는 것.
그래서 제가 아닌 여러분 스스로 고민/생각할 수 있는 밑거름을 만들어 드리는 것을 저의 강의 목표로 삼고 있습니다.
저 스스로도 내일은 더 좋은 개발자가 되자는 모토를 가지고 있는 만큼
제가 고민 했던 내용들을 깊이있게 전달 드리고 싶습니다.
👇🏻문의는 아래의 이메일로 주시면 됩니다.
we.love.code.allen@gmail.com
언어: Swift(스위프트), Python, Java, C#
강의
수강평
- 앨런 Swift Concurrency for Swift 6 (Part-1)
- 앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
- 앨런 Swift문법 마스터 스쿨 (온라인 BootCamp - 2개월과정)
- 앨런 Swift문법 마스터 스쿨 (온라인 BootCamp - 2개월과정)
- 앨런 Swift문법 마스터 스쿨 (온라인 BootCamp - 2개월과정)
게시글
질문&답변
Task를 함수 내부에서 사용했을 때 값의 변화를 예상하는 법
네 안녕하세요 영균 님! 일단 제가 보기엔 지금 2가지 포인트를 잘 못 짚고 계시는 것 같은데요,(1) Task.yield()의 의미를 정확하게 이해하기 위해 다시 생각해 보시면 좋을 것 같습니다. (8강 22분 전후의 내용 다시 보시는 것도 추천을 드리고요.)원칙적으로 async/await 의 비동기(async) 함수는.. 함수 자체가 운영체제에 오래 걸리는 일처리 동안.. 자기가 사용하는 쓰레드를 양보하게 됩니다. 따라서, 기본적으로 yield( )를 사용하지 않아도 비동기 함수는 양보하게 되어 있습니다.(따라서 보통은 yield( ) 메서드를 사용 하실 필요가 없지만) 어떤 오래 걸리는 일처리 전후로 쓰레드를 양보하고 싶다면.. 선택적으로 사용할 수도 있는 것입니다. 예를 들어..func 비동기로오래걸리는함수() async -> Data { await 비동기함수실행() // 비동기적으로 1초 걸린다고 가정 실제오래걸리는함수1실행() // 동기적으로 10초 걸린다고 가정 실제오래걸리는함수2실행() // 동기적으로 10초 걸린다고 가정 실제오래걸리는함수3실행() // 동기적으로 10초 걸린다고 가정 await 비동기함수실행() // 비동기적으로 1초 걸린다고 가정 }위의 비동기 함수는 대략 32초걸리는 비동기작업이라고 가정해보겠습니다. (설명을 드리기 위해 일부러 함수1,2,3은 동기작업으로 가정한거예요.) 위의 작업은 최소한 32초 이상이 걸릴 수 밖에 없습니다. 동기작업은 30초가 무조건 걸리고.. 비동기는 최소 2초가 걸릴텐데.. 비동기작업에서는 쓰레드를 양보했다가.. 나중에 재개가 될 수 있으니 (쓰레드 사용에 의해서 내부적으로 멈췄다가.. 재개될 수 있으니) 2초보다 더 걸릴 수 있겠죠.(그래도 중간의 동기작업은 한번 일을 시작하면 쓰레드를 양보하는 일이 없을테니, 무조건 30초가.. 스트레이트로 일어날 수 밖에 없습니다. 중간에 양보 시점이 아예 없습니다.) 그러면... 위와 같은 상황에서 30초가 스트레이트로 걸리는 일은.. 너무 오래 걸리는 일이니까..func 비동기로오래걸리는함수() async -> Data { await 비동기함수실행() // 비동기적으로 1초 걸린다고 가정 실제오래걸리는함수1실행() // 동기적으로 10초 걸린다고 가정 try await Task.yield() 실제오래걸리는함수2실행() // 동기적으로 10초 걸린다고 가정 try await Task.yield() 실제오래걸리는함수3실행() // 동기적으로 10초 걸린다고 가정 await 비동기함수실행() // 비동기적으로 1초 걸린다고 가정 }중간에 쓰레드를 양보하면.. 10초씩마다.. 혹시나 다른 일처리가 있다면.. 쓰레드를 양보하는 코드를 넣어주면.. 스트레이트로 30초가 일어나는 일처리를 막을 수 있다는 뜻입니다.(위의 예제를 잘 생각해보시고 다시 질문주세요. 지금 yield메서드의 사용 예시가 잘못 되었습니다.) (2) 아래 Task 함수를 잘 못 설계하셨어요.func dispatch(_ event: Event) { // 2번쓰레드에서 시작 Task { // 3번 쓰레드에서 작업 생성 switch event { case .buttonTapped: count += await fetch() } } }위와 같이 하시면, 예를 들어 dispatch 동기함수가 2번쓰레드에서 작업을 시작해도, 작업을 생성하면서 3번 쓰레드에서 일을 시키고 기다리지 않습니다. Task는 작업을 생성하는 것이기도 하지만.. DispatchQueue.global().async { } 와 비슷하게 일을 시작 시키고 (작업을 생성하고) Task { } 내부의 일이 끝날때까지 기다리지 않는 코드 입니다.따라서 제가 봤을때.. 원하시는 코드가.. dispatch함수가.. 함수 내부의 작업(Task)이 끝날때까지 기다리길 원하시는 것 같은데.. 예를 들어 아래 처럼 작성 하셔야 합니다.func dispatch(_ event: Event) async { // 2번쓰레드에서 시작 let task = Task { switch event { case .buttonTapped: count += await fetch() } } await task.value // 일이 끝날때까지 기다렸다가.. dispatch함수 종료 가능 }위의 코드 내용이 이해가 안가시면, 작업(Task)의 종료 부분의 내용을 강의에서 천천히 코드를 다시 보셨으면 좋겠습니다. (이런 실수들을 하실까지봐.. 제가 처음부터 작업(Task)에 대해서 설명드릴 때.. task.value에서 작업을 기다리는 방법들도 다 설명드린 것입니다.) 위의 내용들을 천천히 다시 생각 해보시고.. 이해가 안되시는 부분이 있으시면 다시 질문 주세요 ! 고맙습니다. :)
- 0
- 2
- 47
질문&답변
playground에서 상단 실행?아이콘 회전 관련하여...
네 안녕하세요 산마로 님. 플레이그라운드의 경우.. 워낙 오류가 많은 프로그램이라.. 너무 신경쓰시지 않아도 됩니다. 특히나 엑스코드 버전이 업데이트 되는 경우, 더 많은 오류들이 발생되기도 합니다. 저도 잘 안되는 경우(저도 가끔씩 원 아이콘이 돌아갈 때) 엑스코드를 껐다키거나, 맥북을 껐다키기도 합니다. 정확한 원인을 저도 모르겠어요 ^^;그리고 현재는 또 Swift 5 / 6 버전이 과도기 적인 상황이라 아마, 플레이그라운드에 더 오류가 많은 것으로 알고 있어요. 가급적이면, 플레이그라운드에서 안정적인 Swift 5를 사용하시는 것도 방법이겠죠.(사진) 오류가 워낙 많아서.. 집착하지 않으셔도 됩니다..! 고맙습니다 :)
- 0
- 1
- 27
질문&답변
활용앱53강에서 질문있습니다.
네 산마로 님.우리가 프로젝트를 생성할때 처음부터 존재하는 ViewController 파일은.. 그냥 애플이 편하게 만들라고 기본 템플릿 같은 것을 제공해주는 개념이라고 생각하시면 됩니다.따라서, ViewController이름을 LoginViewController라고 바꾸시고, (다만 스토리보드가 기존의 ViewController로 연결이 되어있기 때문에) 이것만 우측의 Identifier Inspector 화면에서 LoginViewController로 다시 선택하시면 돼요!그리고 기본적으로.. 코드 Base로 프로젝트를 만드는 경우, 스토리 보드를 아예 삭제해서 사용하실 수도 있는데.. 그런건..https://storing.tistory.com/43이런 링크를 참고해 보시거나 "xcode 스토리보드 삭제"로 구글링 해보시면 또 많은 자료들을 참고하실 수 있습니다 🙂 고맙습니다 !
- 0
- 2
- 56
질문&답변
Project 명칭 변경방법이 궁금합니다.
네 산마로 님그런건, 구글링을 잘 활용해보시면 좋을 것 같아요 :) https://velog.io/@afg0212/Xcode-Project-Name-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0이런 블로그글을 참고 부탁드립니다.고맙습니다 !
- 0
- 1
- 28
질문&답변
override 에 대해서 궁금한 것이 있습니다.
네 안녕하세요 산마로 님!클래스의 메서드의 재정의에 대해 질문을 주셨는데, 더 본질적인 답변을 드려보자면.. 하위 클래스에서 재정의를 하면서 상위 클래스의 메서드를 호출하는 경우는.. 일반적으로 어떤 동작 과정이 상위에서 반드시 일어나야 하기 때문입니다. (어떤 숨어 있는 동작과정을 반드시 할 필요가 없는 경우는 당연히 호출할 필요가 없는 것이고요. )그런데, 일반적으로 애플이 만들어놓은 스토리보드라던지.. 뷰를 호출하는 과정 내부에는 우리 눈에 보이지 않는 내부적인 메커니즘들이 많이 숨겨져 있습니다. 따라서, 우리가 처음부터 모든 것을 알 수 없고(외울 수 없고) 애플의 공식문서(결국 UIKit 설명서)에서 그때 그때마다 확인을 하는 것이 정답이긴 합니다.그런데 애플 공식문서 viewDidLoad에서..https://developer.apple.com/documentation/uikit/uiviewcontroller/viewdidload()정확하게, 현재는 super.viewDidLoad를 호출해줘야 한다는 말이 실제 공식문서에서 없어지긴 했는데.. 예전 공식문서에서는.. DiscussionTypically, your override would perform one-time instantiation and initialization of the contents of the view controller’s view. If you override this method, call this method on super at some point in your implementation in case a superclass also overrides this method.실제 위와 같이 쓰여져 있었습니다. (위의 내용은 현재 공식 문서에서 사라졌지만.. 블로그 글 등을 찾아보시면 나오는 내용입니다.)위의 내용이 실제 공식 문서에서 사라졌기(바뀌었기) 때문에.. super.viewDidLoad를 호출해주지 않아도 크게 문제가 생기진 않을 것 같지만 (제 뇌피셜), 일반적으로 뷰를 생성하는 과정 등은 복잡한 과정이 얽혀있고, UIKit의 내부 구현 같은 것들이 조금씩 바뀌고 있기 때문에.. 어떤 향후 또 바뀔지도 모르는 안전성을 보장하기 위해서는 호출해 주는게 맞다고 보이긴 합니다. (예전에는 호출하라고 공식문서에 쓰여져 있었는데, 없어진게 저도 의문이긴 하네요.)(예를 들어, UIViewController에는 @MainActor 이런게 안 붙어 있었는데, Swift Concurrency 때문에 붙기도 했죠. 여러가지로 프레임워크는 OS의 업데이트나 새로운 기술이 생기면 내부 구현들이 조금씩 바뀌고 업데이트 되고 있습니다.)그래서, 결론적으로는일반적으로 모든 UIKit 메서드의 경우 재정의를 할때는.. 애플 공식 문서를 확인해보는 것이 정답입니다. 그래서 또 추가적으로 질문주신 seque의 prepare메서드로 공식문서에서 확인해보시면https://developer.apple.com/documentation/uikit/uiviewcontroller/prepare(for:sender:)재정의할때 상위 메서드를 호출하라는 말이 없습니다. (그래서 안 붙여줘도 되는 것이고요.)원칙적으로는, 처음 공부하실 때는 정확성 확인 차원에서 일일이 공식문서를 확인해보시는 것이 정답이고, 나중에 익숙해지시면.. 당연히 여러번 사용해 보았으니까 외워서 사용하게 되는 것이겠지요. 다만, 어느정도 익숙해지시면.. 약간 직관적(또는 감각적..)으로 알게 되시는 것이.. 메서드의 구현 성질을 보시면.. 상위 메서드에서 어떤 일을 반드시 해야할지 / 안 해도 될지 어느정도 감각적으로 알 수는 있습니다. viewDidLoad와 같이.. 뭔가 초기화나 생성과정에 관여하고, 뷰에 관련된 성질은.. 일반적으로 "내부적인 메커니즘이 숨겨져 있는 경우가 많기 때문에" 상위(super) 메서드를 호출하는 경우가 많습니다.(상위에서 어떤 중요한 일들이 일어나야 하는 경우가 많습니다.)그리고 질문주신 prepare 같은 메서드의 성질을 보시면.. 실제 구현 내용이.. 내가 구현하는 prepare메서드 안에서 직접적인 일처리를 위한 구현에만 관여되어 있다는 것이 보이기 때문에.. super에서 할일이 없겠구나.. 라고 직관적으로 조금 예상은 되는 것이지요.추가적으로 아래와 같은 글들도 참고해보셔도 될 것 같습니다. :) https://ittingz.tistory.com/260https://nlestory.tistory.com/214고맙습니다 :)
- 0
- 2
- 41
질문&답변
섹션8] 코드 리팩토링 문의
crimsonpinus 님네 학습자료(PDF)가 아닌 코드는 얼마든지 올리셔도 됩니다 ^^좋은 하루 마무리 잘 하셔요 :)
- 0
- 1
- 30
질문&답변
xcode 에서 ios 버전 선택 및 시뮬레이터 관련 질문
네 안녕하세요 산마로 님엑스코드 16.2버전을 사용하고 계시면, 1) 원래 iOS 지원 최소 버전 자체가 15.6입니다.2) 그리고 시뮬레이터의 경우도 iPhone 16을 그냥 사용하시면 됩니다. (강의 촬영 당시에는 출시버전을 iOS 13.0 이런게 의미가 있었지만, 현재는 일반적인 사용자 버전이 iOS 18로 올라갔기 때문에.. 최소 지원 버전도 16 ~ 17에 맞추셔도 전혀 상관이 없습니다. (사용자의 80%는 iOS 18 사용자일꺼예요.) 또한 시뮬레이터도 그 이후 iPhone 출시가 많이 되었기 때문에 iPhone 16 사용하셔도 전혀 상관이 없습니다.)중요한건 내부 설정에서 언어만 Swift 5 로 (Swift 6가 아닌) 선택되어 있으시면 전혀 문제가 없으세요.그리고 강의 내용을 이해하시는게 중요하지, 저런 버전 자체는 사실.. 중요하지는 않다고 생각하시면 될 것 같아요. (그리고 강의의 핵심적인 내용들을 이해하는데 전혀 영향을 미치는 부분도 아니고요.)그럼에도 불구하고, 강의내용과 비슷하게 진행해보고 싶으시면https://www.xcodes.app/여기서 Xcode 버전을 15.3 ~ 15.4로 추가로 설치하셔서 진행하시는 방법은 있긴 합니다.고맙습니다. :)
- 0
- 2
- 96
질문&답변
파트1 PDF 강의 자료 다운로드
섹션 2에서..주의 부분에 들어가시면, 위쪽에 자료 다운로드 버튼이 있습니다. :)(사진) 수업 수강을 결정해주셔서 고맙습니다.
- 0
- 2
- 88
질문&답변
수강 기간 연장 부탁드려도 될까요?
네네 ch님수강기간 3개월 연장 처리해드렸습니다. :) 화이팅!!!
- 0
- 2
- 47
질문&답변
뷰모델의 상태변화 와 didSet
안녕하세요 밀라이 님.아 네, 현업에서는 거의 안쓰긴 하죠!왜냐면.. 말씀하신 것처럼.. 보통 이런 종류의 데이터 바인딩은 Combine이나 RxSwift를 쓰니까요.따라서 Combine /RxSwift의 반응형 프로그래밍 개념을.. 더 직관적으로 이해하기 위해서.. 어떤 개념들에서 시작하게 되었는지를 명확하게 아시는 것이 중요하니.. 개념 이해 측면에서 설명드린 것이라고 보시면 될 것 같아요! 고맙습니다. :)
- 0
- 1
- 42