[dreamin] Dreamin iOS Academy 지원 후기

이미지
Dreamin iOS Academy 지원 후기 Dreamin iOS Academy 지원 후기 다음 기수가 있다면, 이 글이 도움이 되길 바라며 정리해 놓습니다. SNS에서 우연히 광고를 보았고 바로 지원했습니다. 무료 강좌이며 전문가의 교육을 제공받을 수 있다. 장비를 제공 받을 수 있다. 팀 프로젝트로 결과물을 만들 수 있다. 원격 학습이다. 크게 이 세가지가 마음에 들어 지원을 했습니다. 또한 크게 손해보는 부분이 없어 보였습니다. 서류 -> 온라인 테스트 -> 온라인 면접 -> 결과 다음과 같은 순서로 진행되었습니다. 서류 다른 서류와 크게 다르지 않았습니다. 지원동기와 자기소개를 작성했습니다. 특이한 점은 만들고 싶은 앱을 적는란이 있었습니다. 이 코스는 전문가 육성과정이 아니라 쓸모있는, 사용자가 좋아할 만한 앱을 만드는 과정이라는 생각이 들어 평소에 필요해서 만들고 싶었던 앱에 대해 소개를 넣었습니다. 온라인 테스트 당연히 비전공자와 코딩경험이 없는 사람 대상이기 때문에 코딩테스트가 나오지 않을 것이라고 생각했습니다. 논리적인 사고와 코딩을 하는데 필요한, 디버깅을 하는데 필요한 컴퓨팅적인 사고를 가지고 있는지에 대한 테스트였습니다. 온라인 면접 개인적인 느낌에 이 과정을 끝까지 수료할 수 있는지에 대한 것을 묻는 느낌이었습니다. 다른 사람들과 협업을 해본적은 있는지? 어려움이 있었다면 어떻게 해결했었는가 같은 질문이었습니다. 또한 온라인 강의를 꾸준히 들을 수 있는가, 왜 이 코스를 들으려 하는가, 단순히 리워드 콜렉터인가를 체크하는 느낌이 많은 질문들이 었습니다. 결과 최종 합격했습니다. 앞으로 과정을 들으면서 배우는 내용에 대해 매주 포스팅 하겠습니다. 노트북을 지급받지 못하는 것은 안타깝지만 제가 배운 것을 나누어 드리겠습니다.

[Xcode] 내가 자주쓰는 Xcode 단축키 정리

이미지
Xcode 단축키 정리 개발을 하면서 단축키를 얼마나 쓰냐에 따라 생산성의 차이를 느끼면서, 아 모르는 단축키가 있으면 한번 시간내서 외워두어야겠다고 생각했습니다. 모르는 단축키가 있다면 이번에 배워 생산성을 올려봅시다! 네비게이터 (좌측) ⌘ + 0 - 네이게이터 보이기 / 숨기기 ⌘ + 1 ~ 9 - 번호 순서대로 네비게이터 메뉴로 이동 인스펙터(우측) ⌘ + ⌥ + 0 - 인스펙터 보이기 / 숨기기 ⌘ + ⌥ + 1 ~ 4 - 번호 순서대로 인스펙터 이동 화면 제어 ⌃ + ⌘ + F - 전체화면 진입 / 나가기 ⇧ + ⌘ + Y - 디버그 창 숨기기 / 보이기 코드 편집 ⌘ + ⬅(방향키) - 줄의 맨 끝/처음 으로 이동하기 ⌘ + ⇧ + ⬅(방향키) - 줄 선택하기 ⌥ + ⬅(방향키) - 단어 단위로 이동하기 ⌃ + i - 인덴테이션 ⌘ + / - 주석처리 ⌥ + ⌘ + / - 메소드 설명추가 ⌘ + ‘-’ - 줌아웃 ⌘ + ‘+’ - 줌인 ⌘ + ⌃ + 0 - 줌리셋 ⌘ + ⇧ + A - 액션 메뉴 보이기(⌘ + 클릭) ⌘ + ⌃ + E - 이름 한번에 바꾸기 네비게이션 ⌘ + ⇧ + J - 현재 파일의 위치 보이기 ⌘ + ⇧ + O - 퀵오픈 ⌥ + click - 퀵헬프 ⌘ + T - 새탭 빌드 / 실행 ⌘ + R - 앱 실행 ⌘ + B - 빌드 ⇧ + ⌘ + K - 프로젝트 클린 ⌘ + . - 프로젝트 종료 검색 ⇧ + ⌘ + F - 프로젝트 내 검색 ⌘ + F - 파일 내 검색 ⌘ + G - 다음 찾기 시뮬레이터 ⌘ + S - 스크린샷 ⌘ + K - 시뮬레이터 키보드 ⌘ + ⬅(방향키) - 화면돌리기 ⌘ + ⇧ + H - 홈화면이동 ⌘ + ⌃ + Z - 디바이스 쉐이크 정리 주로 사용하는 단축키 위주로 정리해 봤습니다. 모르는 단축키도 알아가게되네요. 볼드체로 강조한 것은 정말 많이쓰는 기능이라 안쓰신다면 외워서 사용해보시길 추천드리

[IOS] How to delete macOS App, tvOS App 1.0 Prepare for Submission

이미지
[IOS] How to delete macOS App, tvOS App 1.0 Prepare for Submission appstoreconnect에서 실수로 macOS App, tvOS App의 1.0 버전을 만들어 버렸습니다. 괜찮겠지 싶어서 그냥 내버려 두었더니 심사요청할 때, 관련 정보들을 채우라는 경고문이 나와서 지우는 방법에 대해 기록으로 남겨둡니다. 앱 심사요청 바로 직전 단계라면 간단합니다. 마우스를 버전에 올려보면 빨간 삭제 버튼이 나타납니다. 버튼을 눌러 삭제 해 줍시다. 하지만 문제는 이 버튼이 나타나지 않을 경우입니다. 여러가지 이유로 나오지 않을 수 있을텐데 제가 경험한 부분은 앱의 생성이나 삭제 권한이 없을 때 새로 출시 할 버젼이 없을 때 였습니다. 1번의 경우에는 관리자에게 권한을 받아 삭제하시면 됩니다. 2번의 경우, 출시 할 새로운 버젼을 추가 하시고 다시 마우스를 가져가 보시면 빨간 버튼이 생기고 삭제를 할 수 있게됩니다.

[swift] 커스텀 버튼을 만들고 커스텀 뷰를 그리기

이미지
[swift] 커스텀 버튼을 만들고 커스텀 뷰를 그리기 버튼영역 내에 그림을 그려 커스텀 버튼을 만들고, UIView에 그림을 그려주는 기능을 구현하려합니다. 삼각형 버튼, 원버튼, 정사각형 버튼을 만들고, 각각의 버튼이 눌렸을 때 뷰의 그림이 버튼의 모양과 같이 나와야 합니다. 구조 메인 뷰 컨트롤러, 도형이 그려진 뷰, 버튼 3개 스토리 보드에는 버튼 개를 올려놓고, 라벨을 그리고, 그 아래 커스텀 뷰를 그려줍니다. 도형 그리기 새 파일을 만들어서 UIButton을 만들어 줍니다. class 앞에 @IBDesignable 을 붙이면, 그린 결과가 storyBoard에 바로 적용됩니다. // // CircleButton.swift // viewTest // // Created by 이현호 on 2020/07/20. // Copyright © 2020 tempYsoup. All rights reserved. // import UIKit @IBDesignable class CircleButton: UIButton { var shape:Shape = .circle override func draw(_ rect: CGRect) { let path = UIBezierPath(ovalIn: rect) UIColor.blue.setFill() path.fill() } } 그리고, draw라는 함수를 override해 주면 커스텀 하게 그릴 수 있습니다. 위와 같이 삼각형, 정사각형도 그려줍니다. 스토리 보드에 배치 해 주었던 버튼의 클래스로 설정으 해주시면 짜잔 그림이 그려집니다. 클릭 이벤트 뷰 컨트롤러에 @IBAction 버튼 클릭을 클릭한 버튼을 인식해 label의 text를 변화시켜 줍니다. enum Shape :String { case triangle case square case circle

[IOS] 어플리케이션의 생명 주기 - Life Cycle of Application

이미지
[IOS] Application Life Cycle 앱의 생명주기는 앱의 사용과정 중 가지는 상태값 입니다. foreground, background을 오가며 앱의 상태값이 바뀝니다. 크게 5개의 상태를 가지고 개발자가 상태에 맞게 개발할 수 있도록 인터페이스를 제공합니다. 상태 Not Running(Terminated) : 앱이 시스템에 의해 완전히 종료된 상태입니다. 혹은 아직 실행되지 않았을 때도 Not Running 상태입니다. Inactive(Foreground) : 앱이 실행 중인 상태입니다. 하지만 이벤트를 받지는 않습니다. Active 상태로 넘어가기 전에 앱은 반드시 이 상태를 거칩니다. 알림 같은 특정 알림창이 화면을 덮어서 앱이 event를 받지 못하는 상태가 여기에 해당됩니다. Active(Foreground) : 앱이 실행 중이고 이벤트를 받을 수 있는 상태입니다. Foreground 상태에 있는 앱들은 보통 이 상태입니다. Background : 앱 사용중에 다른 앱을 실행하거나 홈 화면으로 나갔을 때 상태입니다. 백그라운드에서 동작하는 코드를 추가하면 suspended 상태로 넘어가지 않고 백그라운드 상태를 유지하게 됩니다. 처음부터 background 상태로 실행되는 앱은 inactive 대신 background 상태로 진입합니다. 음악을 실행하고 홈 화면으로 나가도 음악이 나오는 상태가 이 경우에 해당됩니다. Suspended : 앱이 background 상태에서 추가적인 작업을 하지 않으면 곧바로 suspended 상태로 진입합니다. 앱을 다시 실행할 경우 빠른 실행을 위해 메모리에만 올라가 있습니다. 메모리가 부족한 상황이 되면 iOS는 suspended 상태에 있는 앱들을 메모리에서 해제시켜서 메모리를 확보합니다. OverView 전체적인 그림을 놓고 봤을 때 Not Running 상태에서 Inactive 전환되기까지 거치는 단계가 있다. 그리고 Inactive에

생에 첫 번째 멘토링

이미지
생에 첫 번째 멘토링 누군가에게 조언을 해 줄 수 있으리라고 생각하지 못했는데, 기회가 생겨서 분에 넘치는 조언을 해주고 기록으로 남겨봅니다. 경력이 길지 않아 대답을 못 할 수도 있기 때문에, 미리 질문을 받아 고민을 한 후에 대답해 보았습니다. 저도 많이 했었던 고민에다가, 조언 받았던 내용도 많아서 누군가에게 도움이 되길 바라며 남겨놓습니다. 혹시 비슷한 고민이나 다른 질문이 있다면 언제나 연락주세요! 환영입니다. 메일주소 : mizzking75@gmail.com 1. 현호님의 개발 영역은? 현재는 IOS 개발을 하고 있습니다. 아이폰에서 실행되는 앱이죠. 하지만 개발 영역이라는 곳에 한계를 두면 안된다고 생각해요. 서버에서 벌어지는 일이, 웹에서 벌어지는 일이 내 개발영역이 아니라는 생각을 가지게 되는 것을 경계하고 있어요. 다른 개발영역에서 일어나는 일을 알 수 있으면 좋고 항상 나에게 들어온 질문을 내가 답하려고 노력하고 있어요. 2. 현호님의 첫 취준 일지 전 학점이 좋지 않았어요. 그래서 정말 많은 기업에 지원을 했고, 나름 판단했을 때 돈을 적당히 주면서 비전이 있어 보이는 곳을 골랐습니다. 채용이나 다른 곳에서 OO에 들어가기로 마음먹은 이유라고 답한 것들은 사실 겉 포장이죠. 첫 취직에 많은 것들을 고려하긴 현실적으로 힘든 것 같아요. 고생을 해 봐야 나랑 맞는 부분은 이런 것들이 있고 이러이러한 문화는, 조건은 나랑 맞지 않는 것이구나를 깨달을 수 있는 것 같아요. 3. 다시 25살이 되신다면 어떤 커리어로 무슨 개발을 도전하고 싶을지 지금도 쌓고 있는 커리어를 영원히 고집할 수 있을 것이라고 생각하지 않아요. 그래서 돌아가서 다시 다른 커리어를 쌓고 싶다라는 생각을 하지 않았던 것 같아요. 어차피 개발자는 평생 공부하며 다양한 것들을 배워야 하기 때문이죠. 그래도 다시 돌아간다면 학생때는 google summer code같은 것에 참가하고 싶어요. 또 git의 사용법을 익히고 오

[swift] Delegate 패턴 감잡기

이미지
[swift] Delegate 느껴보고 이해하기 delegate를 구현하다가, delegate에 대해 정리 해보는 기회를 가지면 좋을 것 같아서 좋은 예제를 보고 정리해놓는다. 정의 delegate를 사전에 검색해 보면 대리자, 위임자라고 나온다. delegate를 쓰면 무언가를 위임 받는 것 같다. 실제 사용되는 곳을 보면 프로토콜을 사용해서 무엇을 구현해야 하는지 제안한다. 간단한 예제 이름을 입력받아, 라벨에 출력해주는 앱을 제작한다. 구현방법은 다음과 같다. import UIKit class ViewController: UIViewController { @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() } @IBAction func buttonClicked(_ sender: Any) { nameLabel.text = textField.text; } } 버튼이 눌릴 때, nameLabel.text = textField.text; 하게 된다. 비슷한 기능을 delegate를 사용해서 구현해보자. UITextFieldDelegate TextField에서 일어나는 일에 대한 위임을 ViewController가 받아서 처리해보자. 일단 자 이제부터 이녀석 에게 일어나는 일은 내가 처리해줄게! 를 선언합니다. override func viewDidLoad() { super.viewDidLoad() textField.delegate = self # self는 ViewController입니다 } 간단하죠? textField의 위임자(delegate)는 self야 가 굉장히 직관적입니다. 그럼 그 다음에 textField

[WEB] css - flex

이미지
css - flex 기본적으로 css를 사용해서 element를 움직이는 방법에 대해 공부하고 정리 해본다. Horizontal div를 여러개 써 주었을 때 옆에 생기지 않는다. 바로 옆에 써 주었는데도 아래에 붙는다. 그 이유가 궁금해서 찾보았다. div는 width와 height가 있는 block의 성질을 가지고 있기 때문에 할당 공간을 제외한 나머지 여백에는 엄청나게 큰 마진이 생기기 때문에 아래에 붙는다. 그래서 div의 위치를 바꿔줄 때, 즉 한줄로 배치하려고 하면 다음과 같은 설정을 해 주어야 한다. display: inline-block inline과 inline-block은 차이가 있다. inline은 width와 height의 설정을 가지지 않기 때문에 div에는 쓸 수 없다. 예를 들면 문자열은 inline 할 수 있다. 하지만 div는 block의 성질을 가지고 있기 때문에 inline-block 을 써줘야 한다. 하지만 이 경우에는 우리가 설정하지 않은 미세한 여백이 생겨버린다. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .box { color: white; width: 100px; height: 100px; background-color: blue; display: inline-block; }

[업무 자동화] 파이썬으로 뉴스 클리핑 메일 자동 발송하기 (1)

이미지
[업무 자동화] 파이썬으로 뉴스 클리핑 메일 자동 발송하기 (1) 회사에서 회사와 관련된 최신의 뉴스를 공유하고 싶은 요구사항이 있었다. 크게 일의 진행을 3단계로 나누었다. 뉴스의 수집 뉴스의 선별 뉴스의 발송 그 중에서도 이번 글에서는 자동 발송 에 관한 이야기를 해 보려 한다. 수제맛집 메일의 발송과정을 문의해 전달 받았다. 아래와 같은 작업이 진행되고 있었다. 순서대로, 손으로 하고 있었다. 직원들에게 보내고 싶은 뉴스를 검색해서 엑셀에 나열한다. 리스팅 한 뉴스들을 가지고 메일을 작성한다. 전날 다음날 오전에 예약 발송을 설정한다. 어느 부분을 자동화 할 수 있을 지 생각해 보았다. 수집 -> 크롤링이나 RSS를 가지고 엑셀을 만들 수 있어 보였다. 메일 작성 -> 수집된 데이터가 형태만 잘 갖추고 있다면, 이메일 템플릿 화 할 수 있어보였다. 스케쥴러를 이용하면, 매일 같은 날 반복해서 보낼 수 있어 보였다. 파이썬으로 메일 보내기(smtplib) 뉴스 클리핑이 어떤 내용이던 파이썬으로 보낼 수 있어야 한다. 여기서 알게된 재밋는 사실은 당연하지만? 메일을 html로 만들어서 보내면 그대로 적용된다는 것 이었다. 파이썬으로 메일을 보내려면, gmail에서 비밀번호 설정을 해야한다. 구글 어카운트 에서 보안(Security) 에 접속한다. 앱 비밀번호(App passwords)에서 Mail, OS 선택 후 GENERATE (앱 비밀번호는 2단계 인증이 사용 설정된 계정에서만 이용할 수 있다.) 이 비밀번호는 메일을 보낼 때 마다 써야하기 때문에 (한번만)저장 해 놓는다. 아래 코드를 참고하여 메일을 발송하면 완성! import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # basic information sender = &quo

[Swift-30-Projects] 03. IOS 클론코딩 FacebookMe

이미지
[Swift-30-Projects]03. IOS 클론코딩 FacebookMe 테이블 뷰를 이용해서 화면을 구성해보자. 앱 뜯어보기 한 화면의 테이블 뷰이다. 상단에는 네비게이션 바가 있고 Facebook이라고 적혀있다. 5개의 섹션으로 이루어져 있다. 프로필셀로 이루어진 섹션, 여러 정보들을 보여주는 섹션, 즐겨찾기 섹션, 설정과 정책 섹션, 로그아웃 섹션. 페이지 이동 할 수 있는 부분에는 화살표가 있고, 로그아웃은 중앙에 정렬되어있다. 기능은 구현하지 않고 껍데기만 구현해본다. 네비게이션 바 상단 네비게이션 바를 띄운다. 이번 프로젝트는 스토리보드를 쓰지 않고 진행한다. 하나의 테이블 뷰 이기 때문에 스토리보드를 쓰는 것 보다는 테이블 뷰를 보기 좋게 짜는게 구조화 되어 이해하기 쉬울 것 같다. ** 스토리보드 없이 코딩하는 방법 **을 이용해서 화면을 하나 띄운다. 다만 주의해야 할 점은 네비게이션 바 위에 뷰를 하나 띄운다는 점이다. title을 설정해주고, navigationController?.navigationBar.barTintColor 로 네비게이션 바의 색을 지정해주면 끝! 테이블 구조 전체 섹션은 5개이다. 각 섹션별로는 1,7,1,3,1개의 로우가 있다. 몇 몇 개의 로우를 제외하면, disclosureIndicator가 있다. 테이블 셀은 눌리고 나면 선택해제가 바로 되어야 한다. 프로필 섹션 프로필의 셀 모양은 subtitle이다. 다양한 셀 모양 을 알아두자. 텍스트라벨과, 이미지, 디테일텍스트라벨을 입력해주면 완성 기능 섹션 여러가지 기능이 있는 섹션이다. 셀의 스타일을 subtitle로 만들어주고 이미지와 타이틀을 넣어준다. FAVORITE 헤더의 길이를 길게하기위해, 아무 내용도 없는 셀을 하나 추가해서 2배로 긴 헤더를 만들어 주었다. 설정 섹션 기능 섹션과 마찬가지로 이미지와, 내용을 넣어준다. 로그아웃 섹션 글의 색상을 red로 바꿔주

[swift] Xcode에서 Unit Test 연습하기

이미지
[swift] Xcode에서 Unit Test 연습하기 진행하고 있는 프로젝트를 리팩토링 하면서, 내가 한 리팩토링이 잘 되었는지는 둘째치고 이전에 기능들은 잘 되고 있는지에 대한 불안감이 생겼다. 원래 되고있던 기능이 뭐지 제대로 되었다는것이 어떤 것을 의미하지 테스트 코드의 작성을 통해 위 두 문제를 해결할 수 있다고 해서 정리하기 시작했다. 리소스 다운 원문 번역본 모든 내용을 다 정리하지도 해 보지도 않았다 앞으로 필요한 테스트를 위한 기본 몸풀기 정도만 해 보았다. 추후에 해당 아티클들의 뒷 부분이 필요한 때에 다시 해 보고 정리하기로 한다. 테스트를 위한 네비게이션이 있었다. 뭐하는데 쓰는 것일까 궁금했더 곳이다. Command(⌘)+6 으로 창을 열 수 있다. 왼쪽 아래의 + 버튼을 눌러 새로운 유닛테스트를 위해 New Unit Test Target… 을 눌러 생성한다. 처음에 만들면 4개의 메소드가 있다. setUpWithError() : 테스트를 위해 설정 tearDownWithError() : 테스트가 종료 된 후 삭제 testExample() -> 삭제 testPerformanceExample() -> 삭제 BullsEye 우리는 50으로 부터 랜덤으로 값을 생성하고, 슬라이더를 움직여 목표 값과 비슷한 값을 입력하는 게임을 테스트 하려한다. 프로젝트 설정 1 . @testable import BullsEye 를 입력해 테스트 코드 파일의 최상단에 프로젝트를 임포트 해주자. 2 . var sut: BullsEyeGame! 프로퍼티를 class BullsEyeGame 타입으로 만들어준다. setUpWithError super.setUp() sut = BullsEyeGame() sut.startNewGame() 인스턴스를 생성하고, startNewGame까지 실행한 상태로 설정한다. tearDownWithError sut = nil s

[IOS] 뷰 컨트롤러의 생명주기 - Life cycle of ViewController

이미지
[IOS] 뷰 컨트롤러의 생명주기 스토리 보드 없이 뷰 컨트롤러를 호출하면 viewDidload()에서 이런 저런 설정을 해준다. viewDidload 는 언제 호출되고, 이 다음과 이전에 호출되는 것이 또 있을까? 라는 궁금증을 가지고 검색을 했더니 viewController life-cycle이라는 키워드를 찾았다. Life Cycle 뷰 컨트롤러는 어떤 생명주기를 가지고 있을까? 1 init 2 loadView 3 viewDidLoad 4 viewWillAppear 5 viewDidAppear 6 viewWillDisappear 7 viewDidDisappear -> 4 viewWillAppear 8 viewDidUnload 이런 생명주기를 가진다. 가장 먼저 뷰 컨트롤러에 구현되어있던 viewDidLoad를 시작으로 살펴보면, 로드 -> 나타남 -> 사라짐 -> 언로드의 순서를 가진다. Did와 Will로 전후에 호출되는 함수를 구별한다. 예를 들면 viewDidLoad는 뷰가 로드 되었다. 그 다음에 viewWillAppear는 뷰가 나타날 것이다. 와 같이 이름만 보아도 언제 호출되는지 알 수 있도록 만들어놓았다. viewDidload 뷰 로드 완료 후 자동을 호출된다. 리소스의 초기화에 많이 사용된다. 뷰가 처음 만들어질 때 한 번만 실행된다. viewWillAppear 얼핏 보면 viewDidload와 같은 기능을 하는 것 처럼 보인다. 실제도 viewDidload 바로 다음에 호출된다. viewDidload 와의 차이점은 위의 생명주기의 viewDidDisappear -> viewWillAppear 에서 나타난다. 뷰1:메인페이지, 뷰2:상세페이지가 있다고 가정하자. 화면의 이동이 있을 때, 메인페이지에서 상세페이지로 갔다가 다시 메인으로 돌아오면 이미 그려진(viewDidload가 한번 호출 된) 메인페이지는 다시 viewDidload가 호출되

[swift] fatalerror에 대해 처음 알아보았다

이미지
[swift] fatalerror 코드를 리팩토링 하다 에러문구를 만났고, Fix를 누르니 다음과 같은 코드가 생겼다. 이미 init 함수는 있는데 무슨 용도일까 해서 찾아 보았다. required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override init(frame: CGRect) 은 view를 만들 때 사용된다. required init?(coder: NSCoder) 스토리 보드에 생성될 때 사용된다. fatalError는 언제 무슨 용도로 쓰는지 알아보자. 설명 은 다음과 같았다. Unconditionally prints a given message and stops execution. 무조건 출력하고 실행을 멈춘다? 정의는 다음과 같다. func fatalError(_ message: @autoclosure () -> String = String(), file: StaticString = #file, line: UInt = #line) -> Never Never을 반환한다. 이 의미는 호출이 되면 더 이상 앱이 진행되지 않는다. 즉 개발자가 인지 하지 못하는 상황에서 예외처리를 이 함수로 한다면, 실행 되었을 때 문제가 있는 부분을 알 수 있다. 다른 예를 하나 더 들어보자. 테이블 뷰를 쓸 때 자주 구현하는 메소드이다. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? MyCustomCell else {