SlideShare a Scribd company logo
1 of 74
Download to read offline
let swift(16)
안드로이드 개발자를 위한 스위프트
Swift & VIPER
osxdev.org / todait유병한
저는…
유병한
현재 투데잇에서 iOS 개발을 담당

(하고 있지만 사실은 Android 개발자 🙈🙉)
이제는 iOS 개발자가 되고픔
아니 Android 개발자가 왜 iOS 개발을...?
회사에 iOS 개발자가 없어서... 😭
Agenda
Swift를 사용하면서 Java에 비해 좋았던 부분

(중요한 부분만 빠르게 알아봐요!)
VIPER 아키텍처 적용 사례
let swift(16)
Android 개발을 하면서 아쉬웠던 부분
Java ☕
Null Pointer Exception
Getter / Setter
Anonymous Class
복잡한 계산로직을 자유자재로, 가독성이 좋게 짜기
힘듦
Activity (== ViewController)
너무나 많은 역할을 하는 Activity
View, Life Cycle, Navigation, Networking, DB,
Business Logic, …
어떤 코드가 어디에 있는지 찾기 힘듦

(== 뭣이 중헌지 모름)
이러한 구조로는 테스트도 불가능
빚이되어 돌아오리… 💸
Dirty & Fast
모든 것이 빚으로 돌아옴
버그라던지.
버그라던지..
버그라던지...
인간의	욕심은	끝이	없고
같은	실수를	반복한다
같은 실수를 반복하지 말자! 🤔
let swift(16)
Swift
Swift
Optional Type
Property
Closure & Functional
Protocol & Extension
Java, 넘나 위험한 것! ⚠
Optional Type
Optional Type이란?
타입 선언 시 변수에 nil이 저장될 수 있는지 여부를 명시
var nonOptional: Int = 0
nonOptional = nil // Compile Error!
var optional: Int? = 0
optional = nil // OK!
Optional Chaining
let viewController = UIViewController()
print(viewController.navigationItem.backBarButtonItem?.title?.characters.count)
print(viewController.navigationItem.backBarButtonItem?.title ?? "Title")
Optional Binding - if let
if let viewController = viewController as? UITableViewController {
viewController.tableView.reloadData()
}
Optional Binding - if let
if let viewController = viewController as? UITableViewController,
refreshControl = viewController.refreshControl {
refreshControl.beginRefreshing()
}
Optional Binding - if let
if let viewController = viewController as? UITableViewController,
refreshControl = viewController.refreshControl
where refreshControl.refreshing {
refreshControl.beginRefreshing()
}
Optional Binding - guard let
func signUp1(email: String?) {
guard let email = email else {
return
}
print(email.characters.count)
}
Optional Binding - guard let
func signUp(email: String?, password: String?) {
guard let email = email, password = password else {
return
}
print("(email) / (password)")
}
Optional Binding - guard let
func signUp(email: String?, password: String?) {
guard let email = email, password = password
where 8 <= password.characters.count else {
return
}
print("(email) / (password)")
}
Optional Binding - switch
let passwordText: String? = ""
switch(passwordText) {
case .Some(let password) where 8 <= password.characters.count:
print(password)
case .Some:
print("8자리 이상 입력해주세요")
case .None:
print("password is nil")
}
이제는 안녕 Getter, Setter 🙋
Property
Stored Property
struct Box {
let width: Double
let height: Double
let depth: Double
}
Stored Property
struct Box {
var width: Double {
willSet {
print("newValue: (newValue)")
}
didSet {
print("oldValue: (oldValue)")
volume = width * height * depth
}
}
var height: Double { ... }
var depth: Double { ... }
var volume: Double
}
Computed Property
struct Box {
var width: Double
var height: Double
var depth: Double
var volume: Double {
get { return width * height * depth }
set { print("newValue: (newValue)") }
}
}
Computed Property
struct Box {
var width: Double
var height: Double
var depth: Double
var volume: Double { return width * height * depth }
}
for, if의 늪에서 나를 구해줘요! 😱
Closure & Functional
객체로서의 함수
함수의 인자로 함수를 넘길 수 있음
함수의 결과로 함수를 반환할 수 있음
Closure 사용과 타입 추론
Closure는 이름이 없는 함수
var sum = [1, 23, 4, 32].reduce(0, combine: { (sum: Int, element: Int) -> Int in
return sum + element
})
Closure 사용과 타입 추론
타입이 명확한 경우 생략 가능
extension SequenceType {
/// Returns the result of repeatedly calling `combine` with an
/// accumulated value initialized to `initial` and each element of
/// `self`, in turn, i.e. return
/// `combine(combine(...combine(combine(initial, self[0]),
/// self[1]),...self[count-2]), self[count-1])`.
@warn_unused_result
public func reduce<T>(initial: T, @noescape combine: (T, Self.Generator.Element) throws -> T) rethrows -> T
}
var sum = [1, 23, 4, 32].reduce(0, combine: { (sum: Int, element: Int) -> Int in
return sum + element
})
Closure 사용과 타입 추론
sum = [1, 23, 4, 32].reduce(0, combine: { sum, element in
return sum + element
})
sum = [1, 23, 4, 32].reduce(0, combine: {
return $0 + $1
})
sum = [1, 23, 4, 32].reduce(0, combine: { $0 + $1 })
sum = [1, 23, 4, 32].reduce(0) { $0 + $1 }
sum = [1, 23, 4, 32].reduce(0, combine: +)
투데잇에서의 Functional
통계 계산 로직에서 적극적으로 사용
대용량 데이터를 다루는 것이 아닌 유저 한사람의 데이
터 그 중에서도 특정 날짜의 데이터를 주로 다룸
스레드 처리만 잘 해주면 사용자 체감 상 크게 문제될 상
황은 없음
퍼포먼스도 물론 중요하지만 오류 없고, 가독성이 높고,
수정이 용이한 코드가 필요
map, flatMap, filter, reduce, contains ...
Protocol & Extension
Property&Method Requirements
Property & Method 에 대한 명세
protocol Flyable {
var distance: Int { get set }
func fly()
}
struct SwiftBird: Flyable {
var distance: Int
func fly() {
print("flying!")
}
}
Protocol with an Extension
Protocol은 Property를 가질 수 없지만 Method는
가질 수 있음
protocol ViewControllerProtocol: class {
var loadingView: LoadingView { get set }
}
extension ViewControllerProtocol where Self: UIViewController {
func showLoadingView() {
loadingView.showLoadingView(self)
}
func dismissLoadingView() {
loadingView.dismissView()
}
}
let swift(16)
VIPER
좋은 Architecture는?
Distribution
Testability
Ease of Use
VIPER 구성요소
View Presenter
Router
Interactor Entity
DataService
Todait의 VIPER 구성요소
View Presenter
Router
Interactor
Entity
ViewModel
DataService
DataService
View Presenter
Router
Interactor
Entity
ViewModel
DataService
View
UIViewController에 해당
View Life Cycle

ex) viewDidLoad 함수가 호출되었음을 Presenter에 알림
View Event

ex) signUpButton이 클릭되었음을 Presenter에 알림
View Control

ex) titleLabel의 텍스트를 바꾸는 방법을 Presenter에 제공
DataService
View Presenter
Router
Interactor
Entity
ViewModel
DataService
Presenter
View와 Interactor의 중간 다리 역할
View에 대한 비즈니스 로직
Life Cycle에 대한 처리
View Event에 대한 처리
View 업데이트
UIKit Independent
DataService
View Presenter
Router
Interactor
Entity
ViewModel
DataService
Interactor
Data(Entity)에 대한 비즈니스 로직
DataService
View Presenter
Router
Interactor
Entity
ViewModel
DataService
Entity
네트워크, DB 등의 데이터 모델
Realm Object, NSUserDefuatls, Json Data 등
Interactor에서 사용
DataService
View Presenter
Router
Interactor
Entity
ViewModel
DataService
Router
View 간의 전환
VIPER 컴포넌트들의 DI(Dependency Injection)를
담당
DataService
View Presenter
Router
Interactor
Entity
ViewModel
DataService
DataService
Network 요청, DB 접근, UserDefaults, 이미지 처
리 등 반복되는 코드를 모듈화
Interactor가 호출함
DataService
View Presenter
Router
Interactor
Entity
ViewModel
DataService
ViewModel
View에 나타나는 데이터와 1:1 매칭
Entity가 어떻게 View에 바인딩될지 정의
Interactor에서 생성되어 Presenter로 전달
VIPER Flow
가입하기 버튼을 눌려 회원가입을 완료하는 과정
DataService
presenter.onClickSignUpButton()
View Presenter
Router
Interactor
Entity
ViewModel
DataService
DataService
viewController.showLoadingAlert()
View Presenter
Router
Interactor
Entity
ViewModel
DataService
DataService
interactor.signUp(signUpViewModel)
View Presenter
Router
Interactor
Entity
ViewModel
DataService
DataService
signUpViewModel.checkValidation()
View Presenter
Router
Interactor
Entity
ViewModel
DataService
DataServic
serverService.signUp(email, password)
View Presenter
Router
Interactor
Entity
ViewModel
DataService
realmService.saveUserData()
DataService
View Presenter
Router
Interactor
Entity
ViewModel
DataService
presenter.onSignUpSucceed() / presenter.onSignUpFailed()
DataService
View Presenter
Router
Interactor
Entity
ViewModel
DataService
viewController.dismissLoadingAlert()
DataService
View Presenter
Router
Interactor
Entity
ViewModel
DataService
router.dismissViewController()
DataService
View Presenter
Router
Interactor
Entity
ViewModel
DataService
VIPER with Swift - Protocol
protocol ViewControllerProtocol: class {
var loadingAlert: LoadingAlert { get set }
}
extension ViewControllerProtocol where Self: UIViewController {
func showLoadingAlert() {
loadingView.showLoadingAlert(self)
}
func dismissLoadingAlert() {
loadingView.dismissAlert()
}
}
VIPER with Swift - Computed Property
protocol SignUpViewControllerProtocolForPresenter: class {
var email: String? { get set }
var password: String? { get set }
}
extension SignUpViewController: SignUpViewControllerProtocolForPresenter {
var email: String? {
get { return emailTextField.text }
set { emailTextField.text = newValue }
}
var password: String? {
get { return passwordTextField.text }
set { passwordTextField.text = newValue }
}
}
장점
하나의 화면에서 기능 단위로 코드를 명확하게 분리
(물론 모든 컴포넌트에 대해 테스트를 하고 있지 않
지만) 모든 컴포넌트에 대해 테스트 가능해지는 구조
가됨
(물론 혼자 개발하고 있지만) 분업이 훨씬 수월해짐
단점
간단한 화면, 간단한 기능에 대해서도 작성해야할 코
드가 늘어남
Next Step
Code Generator
RxSwift, KVO
Android에도 적용
Swift로 iOS 앱 개발을 하면서 느낀 점
Swift 정말 최고!
UI가 있는 어플리케이션 만든다는 관점에서 큰 동작
원리는 Android나 iOS나 비슷한 것 같음
iOS에도 문제가 많다고 하지만 안드로이드에 비할바
는 아닌 것 같음
훨씬 평화로운 iOS! 피쓰~ 🕊
투데잇의 성장을 함께할
당신을 기다리고 있습니다.
i O S 개 발 을 박 ♥ 살 내 주 실 당 신 !
let swift(16)

More Related Content

What's hot

[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅NAVER D2
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overviewyongwoo Jeon
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
Web Components 101 polymer & brick
Web Components 101 polymer & brickWeb Components 101 polymer & brick
Web Components 101 polymer & brickyongwoo Jeon
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기NAVER Engineering
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
5-4. html5 offline and storage
5-4. html5 offline and storage5-4. html5 offline and storage
5-4. html5 offline and storageJinKyoungHeo
 
1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초Circulus
 
5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivityJinKyoungHeo
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oopYoung-Beom Rhee
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple OverviewKim Hunmin
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
[11]Android DataBinding : 기초에서 고급까지
[11]Android DataBinding : 기초에서 고급까지[11]Android DataBinding : 기초에서 고급까지
[11]Android DataBinding : 기초에서 고급까지NAVER Engineering
 
Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개beom kyun choi
 
ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는Taegon Kim
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료욱진 양
 

What's hot (20)

[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
Javascript
JavascriptJavascript
Javascript
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overview
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
Web Components 101 polymer & brick
Web Components 101 polymer & brickWeb Components 101 polymer & brick
Web Components 101 polymer & brick
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
5-4. html5 offline and storage
5-4. html5 offline and storage5-4. html5 offline and storage
5-4. html5 offline and storage
 
1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초
 
5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivity
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple Overview
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
[11]Android DataBinding : 기초에서 고급까지
[11]Android DataBinding : 기초에서 고급까지[11]Android DataBinding : 기초에서 고급까지
[11]Android DataBinding : 기초에서 고급까지
 
Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개
 
ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
 
Redux
ReduxRedux
Redux
 

Viewers also liked

Swift server-side-let swift2016
Swift server-side-let swift2016Swift server-side-let swift2016
Swift server-side-let swift2016Eric Ahn
 
Swift package manager
Swift package managerSwift package manager
Swift package manager성관 윤
 
Swift and Xcode8
Swift and Xcode8Swift and Xcode8
Swift and Xcode8Hyuk Hur
 
Do swift: Swift 무작정 해보기
Do swift: Swift 무작정 해보기Do swift: Swift 무작정 해보기
Do swift: Swift 무작정 해보기YoonBong Steve Kim
 
Letswift Swift 3.0
Letswift Swift 3.0Letswift Swift 3.0
Letswift Swift 3.0Sehyun Park
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기Yongha Yoo
 
Swift internals
Swift internalsSwift internals
Swift internalsJung Kim
 
LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기Wanbok Choi
 

Viewers also liked (8)

Swift server-side-let swift2016
Swift server-side-let swift2016Swift server-side-let swift2016
Swift server-side-let swift2016
 
Swift package manager
Swift package managerSwift package manager
Swift package manager
 
Swift and Xcode8
Swift and Xcode8Swift and Xcode8
Swift and Xcode8
 
Do swift: Swift 무작정 해보기
Do swift: Swift 무작정 해보기Do swift: Swift 무작정 해보기
Do swift: Swift 무작정 해보기
 
Letswift Swift 3.0
Letswift Swift 3.0Letswift Swift 3.0
Letswift Swift 3.0
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기
 
Swift internals
Swift internalsSwift internals
Swift internals
 
LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기
 

Similar to 안드로이드 개발자를 위한 스위프트

[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기현철 조
 
HeadFisrt Servlet&JSP Chapter 2
HeadFisrt Servlet&JSP Chapter 2HeadFisrt Servlet&JSP Chapter 2
HeadFisrt Servlet&JSP Chapter 2J B
 
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본Lee Sang-Ho
 
안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기YoungSu Son
 
[Flutter Meetup In Songdo] 상태관리 올바르게 쓰기
[Flutter Meetup In Songdo] 상태관리 올바르게 쓰기[Flutter Meetup In Songdo] 상태관리 올바르게 쓰기
[Flutter Meetup In Songdo] 상태관리 올바르게 쓰기SuJang Yang
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With GroovyTommy C. Kang
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍흥배 최
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Sangon Lee
 
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작Taeyoung Kim
 
Design pattern 옵저버
Design pattern 옵저버Design pattern 옵저버
Design pattern 옵저버Sukjin Yun
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13hungrok
 
안드로이드 오픈소스 어플리케이션 블록
안드로이드 오픈소스 어플리케이션 블록안드로이드 오픈소스 어플리케이션 블록
안드로이드 오픈소스 어플리케이션 블록YoungSu Son
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스Sungik Kim
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationHyuncheol Jeon
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기Jeado Ko
 
RUCK 2017 Shiny의 또 다른 활용: RStudio addin 함수 및 패키지의 제작
RUCK 2017 Shiny의 또 다른 활용: RStudio addin 함수 및 패키지의 제작RUCK 2017 Shiny의 또 다른 활용: RStudio addin 함수 및 패키지의 제작
RUCK 2017 Shiny의 또 다른 활용: RStudio addin 함수 및 패키지의 제작r-kor
 
Shiny의 또 다른 활용
Shiny의 또 다른 활용Shiny의 또 다른 활용
Shiny의 또 다른 활용건웅 문
 
Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Fermat Jade
 

Similar to 안드로이드 개발자를 위한 스위프트 (20)

[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
Coded ui가이드
Coded ui가이드Coded ui가이드
Coded ui가이드
 
Mongo db 최범균
Mongo db 최범균Mongo db 최범균
Mongo db 최범균
 
HeadFisrt Servlet&JSP Chapter 2
HeadFisrt Servlet&JSP Chapter 2HeadFisrt Servlet&JSP Chapter 2
HeadFisrt Servlet&JSP Chapter 2
 
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본
 
안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기
 
[Flutter Meetup In Songdo] 상태관리 올바르게 쓰기
[Flutter Meetup In Songdo] 상태관리 올바르게 쓰기[Flutter Meetup In Songdo] 상태관리 올바르게 쓰기
[Flutter Meetup In Songdo] 상태관리 올바르게 쓰기
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With Groovy
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
 
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
 
Design pattern 옵저버
Design pattern 옵저버Design pattern 옵저버
Design pattern 옵저버
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13
 
안드로이드 오픈소스 어플리케이션 블록
안드로이드 오픈소스 어플리케이션 블록안드로이드 오픈소스 어플리케이션 블록
안드로이드 오픈소스 어플리케이션 블록
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기
 
RUCK 2017 Shiny의 또 다른 활용: RStudio addin 함수 및 패키지의 제작
RUCK 2017 Shiny의 또 다른 활용: RStudio addin 함수 및 패키지의 제작RUCK 2017 Shiny의 또 다른 활용: RStudio addin 함수 및 패키지의 제작
RUCK 2017 Shiny의 또 다른 활용: RStudio addin 함수 및 패키지의 제작
 
Shiny의 또 다른 활용
Shiny의 또 다른 활용Shiny의 또 다른 활용
Shiny의 또 다른 활용
 
Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)
 

안드로이드 개발자를 위한 스위프트