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. 그루비란?
• 자바 플랫폼에서 실행되는 객채 지향 프로그래밍 언어
• 파이썬, 루비, 스몰토크 등에 영향을 받은 동적 타이핑 프로그래밍 언어
• 기존 자바 프로그래머에 낮은 학습비용으로 최신 프로그래밍 기법 제공
• 도메인 전문 언어와 단순화된 문법으로 향상된 코드 가시성과 유지 보수성 지원
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
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로 메일 주시기 바랍니다.