SlideShare a Scribd company logo
1 of 23
Download to read offline
그루비로 안드로이드 앱 개발하기 
Developing Android Applications with Groovy 
남 상 균 
소프트웨어 엔지니어
C 
C++ 
Objective-C 
Java 
Ruby 
Python 
Javascript 
Perl 
Groovy 
Lua 
Developer Productivity 
App Performance
그루비란? 
• 자바 플랫폼에서 실행되는 객채 지향 프로그래밍 언어 
• 파이썬, 루비, 스몰토크 등에 영향을 받은 동적 타이핑 프로그래밍 언어 
• 기존 자바 프로그래머에 낮은 학습비용으로 최신 프로그래밍 기법 제공 
• 도메인 전문 언어와 단순화된 문법으로 향상된 코드 가시성과 유지 보수성 지원
iOS의 스위프트와 안드로이드의 그루비 
1983 
Objective-C 
Java 
1995 
Java SE 6 
2006 
2006 
Objective-C 2.0 
2014 
Swift 
Groovy 
2003 
Groovy 2.0 
2012
그루비 vs. 스위프트 
• List and Map 
def memberList = ["Nam Sangkyoon", "Park Yeonjin", "Ari"] 
memberList[2] = "Nam Dahyeon" 
def emptyList = [] 
def profile = [ 
"name": "Hong gildong", 
"occupation": "Software Engineer", 
] 
profile["e-mail"] = "hong.gildong@gmail.com" 
def emptyMap = [:] 
var memberList = ["Nam Sangkyoon", "Park Yeonjin", "Ari"] 
memberList[2] = "Nam Dahyeon" 
var emptyList = [] 
var profile = [ 
"name": "Hong gildong", 
"occupation": "Software Engineer", 
] 
profile["e-mail"] = "hong.gildong@gmail.com" 
var emptyMap = [:] 
Groovy 
Swift
그루비 vs. 스위프트 
Swift 
Groovy 
Swift 
• Closure 
numbers.collect { int number -> 
def result = 3 * numbers 
return result 
} 
numbers.map({ 
(number: Int) -> Int in 
let result = 3 * number 
return result 
}) 
• Implict Variables 
numbers.collect { 3 * it } 
numbers.map({ 3 * $0 }) 
numbers.map({ it in 3 * it }) 
Groovy
그루비 vs. 스위프트 
• Closures as Method Argument 
sort([1, 5, 3, 12, 2]) { a, b -> a > b } 
// or possibly, if we pass an array as param 
sort([1, 5, 3, 12, 2]) { it[0] > it[1] } 
sort([1, 5, 3, 12, 2]) { $0 > $1 } 
• Named Parameter 
def newbie = new Person(name: "Hong gildong", age: 32) 
var newbie = new Person(name: "Hong gildong", age: 32) 
Groovy 
Swift 
Groovy 
Swift
그루비 vs. 스위프트 
• Lazy transformation 
class DataManager { 
@lazy var importer = DataImporter() 
} 
Groovy 
class DataManager { 
@Lazy importer = new DataImporter() 
} 
Swift
그루비 vs. 스위프트 
• Safe Navigation Operator 
def john = new Person() 
def roomCount = john.residence?.numberOfRooms 
if (roomCount) { 
println "John's residence has ${roomCount} room(s)." 
} else { 
println "Unable to retrieve the number of rooms." 
} 
let john = Person() 
if let roomCount = john.residence?.numberOfRooms { 
println("John's residence has (roomCount) room(s).") 
} else { 
println("Unable to retrieve the number of rooms.") 
} 
Groovy 
Swift
어떻게 안드로이드에 그루비를 적용할 수 있을까? 
Developing Android Applications with Groovy? 
Cédric Champeau
그루비 온 안드로이드의 문제 GR8 Conf. Europe 2014 
Dalvik VM ≠ Java VM
해결과정 GR8 Conf. Europe 2014 
[ 과정 1 ] 
• 그루비로 생성된 바이트코드를 파일로 저장 
• 이를 jar로 패키징 
• 전용 클래스로더를 사용하여 해당 클래스들을 처리 
[ 결과 ] 
• 너무 느리게 동작 
• I/O 처리에 대한 접근이 크게 증가
해결과정 GR8 Conf. Europe 2014 
[ 과정 2 ] 
• ASMDex라는 자바 바이트코드 조작 라이브러리 사용 
• 그루비 코어에 대한 패치를 요청, 제한적으로 그루비 2.4.x에 반영 
[ 결과 ] 
• 100% 그루비로 작성된 코드로 안드로이드 앱이 구동
잘 동작합니다! GR8 Conf. Europe 2014 
• 애플리케이션 크기: 2MB 
• 프로가드 적용 후 크기: 1MB 
• ~ 8.2MB 램 사용 
https://github.com/melix/gr8confagenda
연습: Hello Groovy!
build.gradle 업데이트 
buildscript { 
repositories { 
jcenter() 
} 
dependencies { 
classpath 'com.android.tools.build:gradle:0.13.2' 
classpath 'me.champeau.gradle:gradle-groovy-android-plugin:0.3.0' 
} 
} 
apply plugin: 'me.champeau.gradle.groovy-android' 
dependencies { 
compile 'org.codehaus.groovy:groovy:2.4.0-beta-3' 
}
그루비 코드 작성 
package org.namsansg.groovyonandroidtest; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
import groovy.transform.CompileStatic; 
@CompileStatic 
class MainActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
String messageText = "Hello Groovy!"; 
def message = findViewById(R.id.message) as TextView 
message.text = messageText; 
} 
} 
• @ComplieStatic을 반드시 사용 
• 런타임시 클래스 생성 피함
그루비 온 안드로이드: Hello Groovy!
그루비 온 안드로이드의 장점 
• Inner-Class Hell 
@CompileStatic 
class MainActivity extends Activity { 
... 
class SomeAsyncTask extends AsyncTask<String, Void, String> { 
@Override 
protected String doInBackground(String... params) { 
new URL(params[0]).text 
} 
@Override 
protected void onPostExecute(String result) { 
textView.setText(result) 
} 
} 
} 
• 단순하고 간결한 코드로 쉽고 빠른 개발 
@CompileStatic 
class MainActivity extends Activity { 
... 
Fluent.async { 
new URL(params[0]).text 
} then { 
textView.setText(it) 
} 
}
그루비 온 안드로이드의 미래 
• 아직 시작단계, 플러그인 안정화가 필요 
• 디버거, 추가적인 API 지원 등 그루비 온 안드로이드에 유용한 툴 개발 및 에코 시 
스템 구축 
• iOS의 스위프트, 안드로이드의 그루비로 보다 개발자가 행복한 세상
감사합니다 
예제 코드는 아래에 공유되었습니다. 
https://github.com/sangkyoonnam/groovy-on-android-helloworld 
추가로 구현한 예제 코드는 아래에 공유될 예정입니다. 
https://github.com/sangkyoonnam/goorvy-on-android-simple-offerwall 
문의사항은 nam.sangkyoon@namsang.org로 메일 주시기 바랍니다.

More Related Content

What's hot

그레이들(Gradle)로 만드는 안드로이드 요리법
그레이들(Gradle)로 만드는 안드로이드 요리법그레이들(Gradle)로 만드는 안드로이드 요리법
그레이들(Gradle)로 만드는 안드로이드 요리법양 한빛
 
[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드
[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드
[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드NAVER Engineering
 
Gradle 사용하기
Gradle 사용하기Gradle 사용하기
Gradle 사용하기jiseob kim
 
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java ProjectJi-Woong Choi
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기현철 조
 
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱NAVER Engineering
 
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지GDG Korea
 
이클립스 플랫폼
이클립스 플랫폼이클립스 플랫폼
이클립스 플랫폼Kenu, GwangNam Heo
 
KotlinJS Overview - TwiceRound #001
KotlinJS Overview - TwiceRound #001KotlinJS Overview - TwiceRound #001
KotlinJS Overview - TwiceRound #001Lee WonJae
 
KotlinJS Practice : Chrome API - TwiceRound Project #002
KotlinJS Practice : Chrome API - TwiceRound Project #002KotlinJS Practice : Chrome API - TwiceRound Project #002
KotlinJS Practice : Chrome API - TwiceRound Project #002Lee WonJae
 
C++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & NanaC++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & NanaLazy Ahasil
 
Modern Android App Development
Modern Android App DevelopmentModern Android App Development
Modern Android App DevelopmentChi Hwan Choi
 
Jurano강의 lec1. AndroidAnnotations 시작하기
Jurano강의 lec1. AndroidAnnotations 시작하기Jurano강의 lec1. AndroidAnnotations 시작하기
Jurano강의 lec1. AndroidAnnotations 시작하기Ju-ri Seo
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
웹 IDE 비교
웹 IDE 비교웹 IDE 비교
웹 IDE 비교Junyoung Lee
 
예제를 통해 쉽게_살펴보는_뷰제이에스
예제를 통해 쉽게_살펴보는_뷰제이에스예제를 통해 쉽게_살펴보는_뷰제이에스
예제를 통해 쉽게_살펴보는_뷰제이에스Dexter Jung
 
자바_웹_개발자를_위한_c#_핵심_기능
자바_웹_개발자를_위한_c#_핵심_기능자바_웹_개발자를_위한_c#_핵심_기능
자바_웹_개발자를_위한_c#_핵심_기능Dexter Jung
 
테스트 주도 개발 By googletest 1장 다중 통화를 지원하는 money 객체
테스트 주도 개발 By googletest   1장 다중 통화를 지원하는 money 객체테스트 주도 개발 By googletest   1장 다중 통화를 지원하는 money 객체
테스트 주도 개발 By googletest 1장 다중 통화를 지원하는 money 객체Mickey SJ Lee
 
Welcome to Android Studio
Welcome to Android StudioWelcome to Android Studio
Welcome to Android StudioWonKyun Lim
 
Windows에서 go+eclipse 개발환경 구축
Windows에서 go+eclipse 개발환경 구축Windows에서 go+eclipse 개발환경 구축
Windows에서 go+eclipse 개발환경 구축Jaehoon Kim
 

What's hot (20)

그레이들(Gradle)로 만드는 안드로이드 요리법
그레이들(Gradle)로 만드는 안드로이드 요리법그레이들(Gradle)로 만드는 안드로이드 요리법
그레이들(Gradle)로 만드는 안드로이드 요리법
 
[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드
[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드
[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드
 
Gradle 사용하기
Gradle 사용하기Gradle 사용하기
Gradle 사용하기
 
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
 
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
 
이클립스 플랫폼
이클립스 플랫폼이클립스 플랫폼
이클립스 플랫폼
 
KotlinJS Overview - TwiceRound #001
KotlinJS Overview - TwiceRound #001KotlinJS Overview - TwiceRound #001
KotlinJS Overview - TwiceRound #001
 
KotlinJS Practice : Chrome API - TwiceRound Project #002
KotlinJS Practice : Chrome API - TwiceRound Project #002KotlinJS Practice : Chrome API - TwiceRound Project #002
KotlinJS Practice : Chrome API - TwiceRound Project #002
 
C++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & NanaC++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & Nana
 
Modern Android App Development
Modern Android App DevelopmentModern Android App Development
Modern Android App Development
 
Jurano강의 lec1. AndroidAnnotations 시작하기
Jurano강의 lec1. AndroidAnnotations 시작하기Jurano강의 lec1. AndroidAnnotations 시작하기
Jurano강의 lec1. AndroidAnnotations 시작하기
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
웹 IDE 비교
웹 IDE 비교웹 IDE 비교
웹 IDE 비교
 
예제를 통해 쉽게_살펴보는_뷰제이에스
예제를 통해 쉽게_살펴보는_뷰제이에스예제를 통해 쉽게_살펴보는_뷰제이에스
예제를 통해 쉽게_살펴보는_뷰제이에스
 
자바_웹_개발자를_위한_c#_핵심_기능
자바_웹_개발자를_위한_c#_핵심_기능자바_웹_개발자를_위한_c#_핵심_기능
자바_웹_개발자를_위한_c#_핵심_기능
 
테스트 주도 개발 By googletest 1장 다중 통화를 지원하는 money 객체
테스트 주도 개발 By googletest   1장 다중 통화를 지원하는 money 객체테스트 주도 개발 By googletest   1장 다중 통화를 지원하는 money 객체
테스트 주도 개발 By googletest 1장 다중 통화를 지원하는 money 객체
 
Welcome to Android Studio
Welcome to Android StudioWelcome to Android Studio
Welcome to Android Studio
 
Windows에서 go+eclipse 개발환경 구축
Windows에서 go+eclipse 개발환경 구축Windows에서 go+eclipse 개발환경 구축
Windows에서 go+eclipse 개발환경 구축
 

Similar to GKAC 2014 Nov. - 그루비로 안드로이드 앱 개발하기

Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With GroovyTommy C. Kang
 
Python on Android
Python on AndroidPython on Android
Python on Android용 최
 
React native 개발 및 javascript 기본
React native 개발 및 javascript 기본React native 개발 및 javascript 기본
React native 개발 및 javascript 기본Tj .
 
Go로 새 프로젝트 시작하기
Go로 새 프로젝트 시작하기Go로 새 프로젝트 시작하기
Go로 새 프로젝트 시작하기Joonsung Lee
 
C++ 개발자와 함께 하는 visual studio 2013
C++ 개발자와 함께 하는 visual studio 2013C++ 개발자와 함께 하는 visual studio 2013
C++ 개발자와 함께 하는 visual studio 2013명신 김
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기Chris Ohk
 
공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반BJ Jang
 
[A1]루비는 패셔니스타
[A1]루비는 패셔니스타[A1]루비는 패셔니스타
[A1]루비는 패셔니스타NAVER D2
 
Golang Restful 서버 개발기
Golang Restful 서버 개발기Golang Restful 서버 개발기
Golang Restful 서버 개발기Hyejong
 
[자바카페] 미니 세미나 ProGuard
[자바카페] 미니 세미나 ProGuard[자바카페] 미니 세미나 ProGuard
[자바카페] 미니 세미나 ProGuardChi Hwan Choi
 
Windows Debugging Technique #3
Windows Debugging Technique #3Windows Debugging Technique #3
Windows Debugging Technique #3Wooseok Seo
 
Python codelab1
Python codelab1Python codelab1
Python codelab1건희 김
 
Front end dev 2016 & beyond
Front end dev 2016 & beyondFront end dev 2016 & beyond
Front end dev 2016 & beyondJae Sung Park
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rdPark Jonggun
 
[W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js
[W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js [W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js
[W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js 양재동 코드랩
 
Git 더하기 GitHub(구름IDE 환경)
Git 더하기 GitHub(구름IDE 환경)Git 더하기 GitHub(구름IDE 환경)
Git 더하기 GitHub(구름IDE 환경)Junyoung Lee
 

Similar to GKAC 2014 Nov. - 그루비로 안드로이드 앱 개발하기 (20)

Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With Groovy
 
Python on Android
Python on AndroidPython on Android
Python on Android
 
React native 개발 및 javascript 기본
React native 개발 및 javascript 기본React native 개발 및 javascript 기본
React native 개발 및 javascript 기본
 
Go로 새 프로젝트 시작하기
Go로 새 프로젝트 시작하기Go로 새 프로젝트 시작하기
Go로 새 프로젝트 시작하기
 
C++ 개발자와 함께 하는 visual studio 2013
C++ 개발자와 함께 하는 visual studio 2013C++ 개발자와 함께 하는 visual studio 2013
C++ 개발자와 함께 하는 visual studio 2013
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
 
공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반
 
[A1]루비는 패셔니스타
[A1]루비는 패셔니스타[A1]루비는 패셔니스타
[A1]루비는 패셔니스타
 
Golang Restful 서버 개발기
Golang Restful 서버 개발기Golang Restful 서버 개발기
Golang Restful 서버 개발기
 
[자바카페] 미니 세미나 ProGuard
[자바카페] 미니 세미나 ProGuard[자바카페] 미니 세미나 ProGuard
[자바카페] 미니 세미나 ProGuard
 
Start groovy
Start groovyStart groovy
Start groovy
 
Windows Debugging Technique #3
Windows Debugging Technique #3Windows Debugging Technique #3
Windows Debugging Technique #3
 
Portfolio
PortfolioPortfolio
Portfolio
 
Python codelab1
Python codelab1Python codelab1
Python codelab1
 
Front end dev 2016 & beyond
Front end dev 2016 & beyondFront end dev 2016 & beyond
Front end dev 2016 & beyond
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd
 
요즘웹개발
요즘웹개발요즘웹개발
요즘웹개발
 
[W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js
[W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js [W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js
[W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js
 
Git 더하기 GitHub(구름IDE 환경)
Git 더하기 GitHub(구름IDE 환경)Git 더하기 GitHub(구름IDE 환경)
Git 더하기 GitHub(구름IDE 환경)
 

More from GDG Korea

Reinfocement learning
Reinfocement learningReinfocement learning
Reinfocement learningGDG Korea
 
Introduce Android TV and new features from Google I/O 2016
Introduce Android TV and new features from Google I/O 2016Introduce Android TV and new features from Google I/O 2016
Introduce Android TV and new features from Google I/O 2016GDG Korea
 
접근성(Accessibility)과 안드로이드
접근성(Accessibility)과 안드로이드접근성(Accessibility)과 안드로이드
접근성(Accessibility)과 안드로이드GDG Korea
 
Tensorflow 101
Tensorflow 101Tensorflow 101
Tensorflow 101GDG Korea
 
Best Practices in Media Playback
Best Practices in Media PlaybackBest Practices in Media Playback
Best Practices in Media PlaybackGDG Korea
 
Building Extraordinary Apps with Firebase Analytics
Building Extraordinary Apps with Firebase AnalyticsBuilding Extraordinary Apps with Firebase Analytics
Building Extraordinary Apps with Firebase AnalyticsGDG Korea
 
디자이너 없어도 괜찮아! (feat.Material Design Guide)
디자이너 없어도 괜찮아! (feat.Material Design Guide)디자이너 없어도 괜찮아! (feat.Material Design Guide)
디자이너 없어도 괜찮아! (feat.Material Design Guide)GDG Korea
 
안드로이드 데이터 바인딩
안드로이드 데이터 바인딩안드로이드 데이터 바인딩
안드로이드 데이터 바인딩GDG Korea
 
같은 유저수, 다른 수익? 모바일 앱의 수익을 높이는 방법
같은 유저수, 다른 수익? 모바일 앱의 수익을 높이는 방법같은 유저수, 다른 수익? 모바일 앱의 수익을 높이는 방법
같은 유저수, 다른 수익? 모바일 앱의 수익을 높이는 방법GDG Korea
 
FIrebase를 이용한 호우호우 미니게임 만들기
FIrebase를 이용한 호우호우 미니게임 만들기FIrebase를 이용한 호우호우 미니게임 만들기
FIrebase를 이용한 호우호우 미니게임 만들기GDG Korea
 
GKAC 2015 Apr. - Xamarin forms, mvvm and testing
GKAC 2015 Apr. - Xamarin forms, mvvm and testingGKAC 2015 Apr. - Xamarin forms, mvvm and testing
GKAC 2015 Apr. - Xamarin forms, mvvm and testingGDG Korea
 
GKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroidGKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroidGDG Korea
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GDG Korea
 
GKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGDG Korea
 
GKAC 2014 Nov. - RxJava를 활용한 Functional Reactive Programming
GKAC 2014 Nov. - RxJava를 활용한 Functional Reactive ProgrammingGKAC 2014 Nov. - RxJava를 활용한 Functional Reactive Programming
GKAC 2014 Nov. - RxJava를 활용한 Functional Reactive ProgrammingGDG Korea
 
GKAC 2014 Nov. - Android Wear 개발, 할까요 말까요?
GKAC 2014 Nov. - Android Wear 개발, 할까요 말까요?GKAC 2014 Nov. - Android Wear 개발, 할까요 말까요?
GKAC 2014 Nov. - Android Wear 개발, 할까요 말까요?GDG Korea
 
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기GDG Korea
 
GKAC 2014 Nov. - The Beautiful Design Collection 살펴보기
GKAC 2014 Nov. - The Beautiful Design Collection 살펴보기GKAC 2014 Nov. - The Beautiful Design Collection 살펴보기
GKAC 2014 Nov. - The Beautiful Design Collection 살펴보기GDG Korea
 
GKAC 2014 Nov. - 안드로이드 5.0의 새로운 기능
GKAC 2014 Nov. - 안드로이드 5.0의 새로운 기능GKAC 2014 Nov. - 안드로이드 5.0의 새로운 기능
GKAC 2014 Nov. - 안드로이드 5.0의 새로운 기능GDG Korea
 

More from GDG Korea (19)

Reinfocement learning
Reinfocement learningReinfocement learning
Reinfocement learning
 
Introduce Android TV and new features from Google I/O 2016
Introduce Android TV and new features from Google I/O 2016Introduce Android TV and new features from Google I/O 2016
Introduce Android TV and new features from Google I/O 2016
 
접근성(Accessibility)과 안드로이드
접근성(Accessibility)과 안드로이드접근성(Accessibility)과 안드로이드
접근성(Accessibility)과 안드로이드
 
Tensorflow 101
Tensorflow 101Tensorflow 101
Tensorflow 101
 
Best Practices in Media Playback
Best Practices in Media PlaybackBest Practices in Media Playback
Best Practices in Media Playback
 
Building Extraordinary Apps with Firebase Analytics
Building Extraordinary Apps with Firebase AnalyticsBuilding Extraordinary Apps with Firebase Analytics
Building Extraordinary Apps with Firebase Analytics
 
디자이너 없어도 괜찮아! (feat.Material Design Guide)
디자이너 없어도 괜찮아! (feat.Material Design Guide)디자이너 없어도 괜찮아! (feat.Material Design Guide)
디자이너 없어도 괜찮아! (feat.Material Design Guide)
 
안드로이드 데이터 바인딩
안드로이드 데이터 바인딩안드로이드 데이터 바인딩
안드로이드 데이터 바인딩
 
같은 유저수, 다른 수익? 모바일 앱의 수익을 높이는 방법
같은 유저수, 다른 수익? 모바일 앱의 수익을 높이는 방법같은 유저수, 다른 수익? 모바일 앱의 수익을 높이는 방법
같은 유저수, 다른 수익? 모바일 앱의 수익을 높이는 방법
 
FIrebase를 이용한 호우호우 미니게임 만들기
FIrebase를 이용한 호우호우 미니게임 만들기FIrebase를 이용한 호우호우 미니게임 만들기
FIrebase를 이용한 호우호우 미니게임 만들기
 
GKAC 2015 Apr. - Xamarin forms, mvvm and testing
GKAC 2015 Apr. - Xamarin forms, mvvm and testingGKAC 2015 Apr. - Xamarin forms, mvvm and testing
GKAC 2015 Apr. - Xamarin forms, mvvm and testing
 
GKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroidGKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroid
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
 
GKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android Looper
 
GKAC 2014 Nov. - RxJava를 활용한 Functional Reactive Programming
GKAC 2014 Nov. - RxJava를 활용한 Functional Reactive ProgrammingGKAC 2014 Nov. - RxJava를 활용한 Functional Reactive Programming
GKAC 2014 Nov. - RxJava를 활용한 Functional Reactive Programming
 
GKAC 2014 Nov. - Android Wear 개발, 할까요 말까요?
GKAC 2014 Nov. - Android Wear 개발, 할까요 말까요?GKAC 2014 Nov. - Android Wear 개발, 할까요 말까요?
GKAC 2014 Nov. - Android Wear 개발, 할까요 말까요?
 
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
 
GKAC 2014 Nov. - The Beautiful Design Collection 살펴보기
GKAC 2014 Nov. - The Beautiful Design Collection 살펴보기GKAC 2014 Nov. - The Beautiful Design Collection 살펴보기
GKAC 2014 Nov. - The Beautiful Design Collection 살펴보기
 
GKAC 2014 Nov. - 안드로이드 5.0의 새로운 기능
GKAC 2014 Nov. - 안드로이드 5.0의 새로운 기능GKAC 2014 Nov. - 안드로이드 5.0의 새로운 기능
GKAC 2014 Nov. - 안드로이드 5.0의 새로운 기능
 

GKAC 2014 Nov. - 그루비로 안드로이드 앱 개발하기

  • 1. 그루비로 안드로이드 앱 개발하기 Developing Android Applications with Groovy 남 상 균 소프트웨어 엔지니어
  • 2.
  • 3.
  • 4. C C++ Objective-C Java Ruby Python Javascript Perl Groovy Lua Developer Productivity App Performance
  • 5. 그루비란? • 자바 플랫폼에서 실행되는 객채 지향 프로그래밍 언어 • 파이썬, 루비, 스몰토크 등에 영향을 받은 동적 타이핑 프로그래밍 언어 • 기존 자바 프로그래머에 낮은 학습비용으로 최신 프로그래밍 기법 제공 • 도메인 전문 언어와 단순화된 문법으로 향상된 코드 가시성과 유지 보수성 지원
  • 6. iOS의 스위프트와 안드로이드의 그루비 1983 Objective-C Java 1995 Java SE 6 2006 2006 Objective-C 2.0 2014 Swift Groovy 2003 Groovy 2.0 2012
  • 7. 그루비 vs. 스위프트 • List and Map def memberList = ["Nam Sangkyoon", "Park Yeonjin", "Ari"] memberList[2] = "Nam Dahyeon" def emptyList = [] def profile = [ "name": "Hong gildong", "occupation": "Software Engineer", ] profile["e-mail"] = "hong.gildong@gmail.com" def emptyMap = [:] var memberList = ["Nam Sangkyoon", "Park Yeonjin", "Ari"] memberList[2] = "Nam Dahyeon" var emptyList = [] var profile = [ "name": "Hong gildong", "occupation": "Software Engineer", ] profile["e-mail"] = "hong.gildong@gmail.com" var emptyMap = [:] Groovy Swift
  • 8. 그루비 vs. 스위프트 Swift Groovy Swift • Closure numbers.collect { int number -> def result = 3 * numbers return result } numbers.map({ (number: Int) -> Int in let result = 3 * number return result }) • Implict Variables numbers.collect { 3 * it } numbers.map({ 3 * $0 }) numbers.map({ it in 3 * it }) Groovy
  • 9. 그루비 vs. 스위프트 • Closures as Method Argument sort([1, 5, 3, 12, 2]) { a, b -> a > b } // or possibly, if we pass an array as param sort([1, 5, 3, 12, 2]) { it[0] > it[1] } sort([1, 5, 3, 12, 2]) { $0 > $1 } • Named Parameter def newbie = new Person(name: "Hong gildong", age: 32) var newbie = new Person(name: "Hong gildong", age: 32) Groovy Swift Groovy Swift
  • 10. 그루비 vs. 스위프트 • Lazy transformation class DataManager { @lazy var importer = DataImporter() } Groovy class DataManager { @Lazy importer = new DataImporter() } Swift
  • 11. 그루비 vs. 스위프트 • Safe Navigation Operator def john = new Person() def roomCount = john.residence?.numberOfRooms if (roomCount) { println "John's residence has ${roomCount} room(s)." } else { println "Unable to retrieve the number of rooms." } let john = Person() if let roomCount = john.residence?.numberOfRooms { println("John's residence has (roomCount) room(s).") } else { println("Unable to retrieve the number of rooms.") } Groovy Swift
  • 12. 어떻게 안드로이드에 그루비를 적용할 수 있을까? Developing Android Applications with Groovy? Cédric Champeau
  • 13. 그루비 온 안드로이드의 문제 GR8 Conf. Europe 2014 Dalvik VM ≠ Java VM
  • 14. 해결과정 GR8 Conf. Europe 2014 [ 과정 1 ] • 그루비로 생성된 바이트코드를 파일로 저장 • 이를 jar로 패키징 • 전용 클래스로더를 사용하여 해당 클래스들을 처리 [ 결과 ] • 너무 느리게 동작 • I/O 처리에 대한 접근이 크게 증가
  • 15. 해결과정 GR8 Conf. Europe 2014 [ 과정 2 ] • ASMDex라는 자바 바이트코드 조작 라이브러리 사용 • 그루비 코어에 대한 패치를 요청, 제한적으로 그루비 2.4.x에 반영 [ 결과 ] • 100% 그루비로 작성된 코드로 안드로이드 앱이 구동
  • 16. 잘 동작합니다! GR8 Conf. Europe 2014 • 애플리케이션 크기: 2MB • 프로가드 적용 후 크기: 1MB • ~ 8.2MB 램 사용 https://github.com/melix/gr8confagenda
  • 18. build.gradle 업데이트 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:0.13.2' classpath 'me.champeau.gradle:gradle-groovy-android-plugin:0.3.0' } } apply plugin: 'me.champeau.gradle.groovy-android' dependencies { compile 'org.codehaus.groovy:groovy:2.4.0-beta-3' }
  • 19. 그루비 코드 작성 package org.namsansg.groovyonandroidtest; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import groovy.transform.CompileStatic; @CompileStatic class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String messageText = "Hello Groovy!"; def message = findViewById(R.id.message) as TextView message.text = messageText; } } • @ComplieStatic을 반드시 사용 • 런타임시 클래스 생성 피함
  • 21. 그루비 온 안드로이드의 장점 • Inner-Class Hell @CompileStatic class MainActivity extends Activity { ... class SomeAsyncTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { new URL(params[0]).text } @Override protected void onPostExecute(String result) { textView.setText(result) } } } • 단순하고 간결한 코드로 쉽고 빠른 개발 @CompileStatic class MainActivity extends Activity { ... Fluent.async { new URL(params[0]).text } then { textView.setText(it) } }
  • 22. 그루비 온 안드로이드의 미래 • 아직 시작단계, 플러그인 안정화가 필요 • 디버거, 추가적인 API 지원 등 그루비 온 안드로이드에 유용한 툴 개발 및 에코 시 스템 구축 • iOS의 스위프트, 안드로이드의 그루비로 보다 개발자가 행복한 세상
  • 23. 감사합니다 예제 코드는 아래에 공유되었습니다. https://github.com/sangkyoonnam/groovy-on-android-helloworld 추가로 구현한 예제 코드는 아래에 공유될 예정입니다. https://github.com/sangkyoonnam/goorvy-on-android-simple-offerwall 문의사항은 nam.sangkyoon@namsang.org로 메일 주시기 바랍니다.