[인터뷰질문 018] Swift 함수에서 return 키워드가 필요없는 상황은 어느때 인가요?

이미지
return 키워드 return 키워드는 함수의 반환값을 표시할 때 쓰입니다. 이 함수에서 이 값이 반환됩니다 라는 의미지요. 함수가 무엇인지 반환값이 무엇인지 모른다면 먼저 공부하고 읽으시는 것을 추천 드립니다. return값이 없을 때 함수에 반환값이 필요 없는경우 당연히 return 키워드가 필요하지 않습니다. func sayHello () -> Void { print ( "Hello" ) } sayHello() // Hello Error 상황 함수가 실행되다가 정상적인 종료가 아닌 예외처리 하는 부분에서는 return 키워드가 필요 없습니다. func devidedValue (numerator : Double, denominator: Double) -> Double { if denominator == 0 { fatalError ( "can not devided by zero" ) //print("can not devided by zero") } else { return numerator / denominator } } print (devidedValue(numerator: 3 , denominator: 6 )) print (devidedValue(numerator: 3 , denominator: 0 )) 함수에서 반환타입이 있다면 반환값을 지정해주어야 합니다. 하지만 fatalError() 구문이 있으면, return 하지 않아도 됩니다. 왜냐하면 fatalError() 을 만나는 순간 함수가 종료되기 때문입니다. 한줄로 작성된 함수의 반 func devidedValue ( numerator : Double, denominator : Double) - > Double { numerator / denominator } print (devidedValue( n

swift 에서 dictionary와 NScache의 차이와 thread safe 하다는 뜻

이미지
공부를 하다보니 NScache를 알게 되었습니다. 사실 무엇인지 잘 모르고 사용하고 있었는데, 이 걸 모르는 사람들은 Dictionary를 쓴 경험이 있다고 합니다. 그래서 무엇이 비슷했길래 사용했는지, 그리고 무엇이 다르기에 용도에 맞게 사용해야 하는지 정리를 해보겠습니다. 또한 공부하다 알게 된 thread safe 하다는 것에 대해서도 정리하겠습니다. dictionary와 NScache의 비슷한 점 var dictionaryInstance: Dictionary = Dictionary () var cacheInstance: NSCache = NSCache () 생성을 해보면 정말 비슷해서 아무 생각없이 사용한다면 쓸 수 있겠다라는 생각을 했습니다. 결국 string을 키값으로 데이터를 저장하고 탐색하는데 사용할 수 있기 때문입니다. 그러면 이렇게 비슷한데 그냥 사용하면 무엇이 안 좋은지 한 번 알아보도록 하겠습니다 dictionary와 NScache의 다른 점 크게 두가지 다른점이 있다고 생각합니다. NSCache는 디바이스의 메모리가 부족해지면 캐시된 데이터를 삭제하기도 합니다. 가장 큰 차이점 입니다 NScache는 Thread safe 합니다. 값의 입력과 출력하는 방법이 조금 다릅니다.(키값으로 접근하는 것은 같습니다.) 그렇다면 가장 큰 차이점인 Thread safe 하다 그렇지 못하다는 것은 어떤 의미일까요? Thread safe 하다는 것 해석해보면 thread에 안전하다는 뜻 입니다. 그러면 thread가 무엇인지 우리가 어떤 환경에서 개발하는지 알아야 합니다. thread란 쉽게 말해 작업의 단위라고 보면 쉽습니다. 우리는 multi-threaded 환경에서 개발을 하고 있습니다. 그러면 어려개의 작업은 각각의 thread를 만들고 공유 자원을 이용할 수 있겠죠? 좀 더 쉽게 예를 들어보겠습니다. 냉장고가 하나 있고, A와 B가 물건을 넣기도 빼기도 한다고 해봅시다. 현실에서의 냉장고는 동시에 물건을 넣거

2021 첫 iOS 멘토링을 마치며

이미지
우연히 좋은 기회가 생겨 다른 주니어 개발자들을 멘토링 할 기회가 생겼습니다. 저도 주니어라서 누가 누구에게 멘토링을 하겠냐 라는 생각도 했지만 반대로 내가 맨 처음에 랜딩하면서 걲었던 어려움과 어떻게 극복했는지를 전달 해 주어야 겠다라는 생각으로 시작하게 되었습니다. 멘토링 순서 1주차 : 로드맵 확인 / 개발 성장 과정 조언(HIG, 학습방법 등) 2주차 : TableView(1) - facebookMe / 함수명, nib, MVC,MVVM, Life Cycle이해하기 3주차 : TableView(2) - MVC, MVVM 활용해서 만들어오기 4주차 : 공식문서에 대해서 ( 함수명 짓는 법, 뜯어보는 개발팁 ), swift를 문법의 실질적인 중요성을 github들을 뜯어보면서 확인 ( 접근제어자,enum,옵셔널) / enum 의 중요성 다시 한 번! 5주차 : 코딩쇼! ㅎㅎ (아이폰 알람앱 벤치마킹) / 앱 스토어 살펴보면서 어플 출시까지 맛보기 6주차 : ScrollView / 이 날은 다들 백신으로 아프셔서 쉬어가는 타임! 7주차 : CollectionView / 디버깅 방법 (break활용, 뷰 레이어 구조 보기 활용하면서) 8주차 : 네트워크에 대해 이해하기 / URLSession이해하기 & 클로저 이해하기 9주차 : Api활용 / debugDescription / 모델의 중요성, 목데이터 등 10주차 : 애니메이션(1) 11주차 : 애니메이션(2) 뜯어보면서 현호님의 공부 방법 공유 / 라이브러리 활용해보기 12주차 : 다른 사람들의 소스코드 뜯어보기 / 앞으로 어디로 가야하는가 기본적인 철학 어차피 내가 할 줄 아는 것을 알려줘 봤자 새로운 것이 나오면 또 문제를 해결하지 못할 것 이다. 그러므로 스스로 문제를 푸는 방법을 알려주자 였습니다. 그래서 우리가 마주한 문제가 무엇인지, 이 문제를 스스로 해결하는 방법이 어떤 것인지 멘토링을 진행했습니다. 진행 기본적으로는 과제를 내주고, 그 과제를

ARC와 weak, strong, memory leak의 관계에 대한 정리

이미지
면접 질문에도 자주 등장하고, 스스로도 코딩을 하면서 자주 놓치게되는 부분이기에 실제 어떻게 사용해야하는지 되새길 겸 정리하려고 합니다. 먼저 단어들에대서 설명하고, 어떤 문제가 생길 수 있기 때문에 알고있어야 하는지 그리고 어떻게 해결할 수 있는지에 대해 순서대로 정리하도록 하겠습니다. ARC(Automatic Reference Counting) 이름에서 알 수 있듯이 자동으로 참조하고있는 숫자를 세어주는 녀석입니다. 그렇다면 참조숫자는 왜 필요할까요? 메모리1 - [객체1| 객체2 | 객체3 | 객체1을바라봄 | 객체1을바라봄 | 객체2를바라봄 | 객체3을바라봄 ||| 빈공간들 || ] 위와 같이 메모리를 사용하고 있는데 객체1이 메모리에서 사라지면 어떻게 될까요? 참조하러 갔는데 비어있으면 크래시가 나겠죠? 아니면 예상하지 못한 동작을 할 것 입니다. 그러므로 지금 메모리에 올라가 있는 이 녀석을 지워도 되는지 말아야 하는지에 대한 기준을 바로 ARC로 잡는 것입니다. ARC가 0이라면? 아무도 참조하고 있지 않으니 메모리에서 해제해도 아무런 이상이 없을 것 입니다. 반대로 0이 아니라면 어디선가, 누군가인지는 모르지만 사용하고 있으니 해제하면 안된다는 뜻으로 알고 메모리에 남겨둡니다. 개인적으로는 지하주차장 천장에 있는 녹색등과 초록등으로 이 아래에 차가 있는지 없는지 알려주는 장치와 비슷하다고 생각했습니다. 이 장치가 완벽하게 동작한다면 주차가 되어있다고 빨간불이 들어와있는 구역에 주차하러 왔다가 낭패를 보는 일은 없을테니까요. ㅎ ㅎ 메모리에서 해제해도 돼, 안돼! 그러면 ARC를 증가시키는 방법을 간단하게 살펴보겠습니다. import Foundation class Student { let name: String let grade: Int init (name: String , grade: Int ) { self .name = name self .grade = grade

정의된 프로콜을 보고도 감이 잘 안오는 분들을 위한 글

이미지
디자인 패턴을 공부하다 보니 protocol까지 흘러들어갔습니다. 문법책에있는 내용은 정말 빌드 시 에러가 나지 않을 만큼만 이라서 이 프로토콜을 정리 할 필요가 있다고 생각되었습니다. protocol 정의 protocol Student { var name: String { get } var grade: Int ? { get } } struct Leeo : Student { let name: String let grade: Int ? } let leeo = Leeo (name: "hyunho" , grade: nil ) print (leeo) 위와 같이 protocol이라는 키워드를 사용해서 프로토콜을 정의 해줍니다. 그리고 정의한 프로토콜을 채택해서 구현 해주어야 합니다. 프로토콜에는 크게 프로퍼티와 메소드를 정의 해줄 수 있습니다. 그러면 하나씩 어떻게 정의할 수 있는지 살펴보겠습니다. 프로퍼티 정의 프로토콜로 프로퍼티를 정의할 때는 크게 두가지가 신경 쓰입니다. let, var 의 정의 get set의 정의 먼저 let, var를 짚고 넘어가겠습니다. 프로토콜에는 let으로 정의할 수 없습니다. var로 정의해 놓은 변수를 let으로 구현할지 var로 구현할지는 구현하는 사람에게 달렸습니다. protocol Student { var name: String { get } var grade: Int ? { get } } struct Leeo : Student { let name: String let grade: Int ? } struct Vabat : Student { var name: String var grade: Int ? } let leeo = Leeo (name: "hyunho" , grade: nil ) let vabat = Vabat (name: "

adiOS 앱을 만들었습니다!

클로져(closures)에서 좌절한 사람을 위한 글

이미지
함수라고 알고 있던 클로져를 공부하면서 기록합니다. 어느 순간 이해가 안되는 코드들이 클로져로 이루어져있다는 것을 알게된다음 정리와 적용과정이 필요하다는 것을 알고 정리해 놓습니다. 클로저란? 클로저 는 코드에 전달되어 사용할 수있는 독립적인 기능 블록입니다. Swift의 클로저는 C 및 Objective-C의 블록 및 다른 프로그래밍 언어의 람다와 유사합니다. 라는 정의가 공식문서에 적혀있습니다. 하지만 이 개념은 이해가 가지 않았고, 개인적으로는 이름이 없는 함수이고 축약을 위한 다른 규칙들이 있다라고 이해하고 있습니다. 실제 저는 아래의 단계에 따라서 클로져를 공부하고 있더라구요. 비슷하거나 아니면 이에 해당하시는 분들은 미래를 예측 해 보시기 바랍니다. swift 문법을 공부합니다. 그리고 한 단원은 클로져입니다. 그래서 공부했습니다. 나는 클로져를 알고 있는데, 고차 함수인, map, fitler, reduce를 잘 몰라서 공부하다 보니까 클로져까지 왔습니다. 위에까지 다 공부해서 클로져를 알고 있다고 생각했는데 @escaping completeHandler: (() -> ())? 를 만나서 공부하다 보니 클로져까지 다시 오게 되었습니다. 이 전 단계를 다 공부하고 왔는데 아래와 같은 request { (result) in completed(.success( data )) } 코드를 보고 막혔다가 공부하러 왔습니다. 한 2개월에 한 단계씩 올라간 것 같습니다. 물론 순서대로는 아니지만 생각보다 한번의 예제나 하나의 실습으로 익혀지지 않는 것은 확실한 것 같네요. 클로저의 문법 간단한 함수의 생김새와 사용방법 let name = "Leeo" func printName () { print (name) } printName() // Leeo 간단한 클로져의 생김새 let name = "Leeo" let print Name = { print (name) }