[Kotlin] 안드로이드와 코틀린
코틀린 공부를시작 하기에앞서 먼저 안드로이드가 동작하는 플랫폼과 리눅스 커널, 현재 사용되고 있는 안드로이드의 API레벨 그리고 함수형 프로그래밍에 대해 알아볼 것이다.
1) 운영체제와 플랫폼
안드로이드 플랫폼은 리눅스 운영체제 안에서 리눅스와 상호작용하면서 동작한다.
아래 그림은 안드로이드 플랫폼으로 아직 이해하기에는 어렵겠지만 전체 아키텍처 위쪽에 안드로이드가 실행되는 런타임 영역(파란색으로 표시)이 존재한다는 점은 이해하고 있어야 한다.
2) 플랫폼 버전과 API 레벨
- 안드로이드는 사용하는 플랫폼 버전과 별개로 API 레벨이 있다.
- API는 개발자에게 안드로이드 플랫폼의 기능을 사용할 수 있게 제공하는 도구라고 생각하면된다.
- API 레벨에 따라서 새로운 기능이 추가되거나 코드 전체를 변경해야 하는 경우가 있기때문에 API 레벨의 변경 사항이 있을 때는 기존 코드를 다시 한번 확인할 필요가 있다.
현재 플랫폼의 최신 버전은 안드로이드 13(베타)이지만 실제 사용자가 사용하는 버전은 훨씬 다양하다.
- 개발용 툴인 안드로이드 스튜디오에서 새로운 프로젝트를 생성할 때 나타나는 “Help me choose”링크를 눌러 버전별 점유율을 확인할 수 있다.
- 현재 API 레벨 21, 롤리팝 버전 이상을 사용하는 디바이스가 전체의 98.8% 이다.
- 특별한 경우가 아니라면 그 이전 버전은 고려하지 않아도 된다.
여기서 잠깐!
- 안드로이드는 일년에 한번 정도 메이저 버전이 업데이트 되고 있다.(메이저 버전이 바뀐다는 것은 새로운 버전의 안드로이드가 출시 된다는 의미)
- 하지만 새로운 버전으로 사용자가 옮겨 가는 데는 적어도 몇 년의 시간이 소요되기 때문에 항상 최신 버전에 맞춰서 개발할 필요는 없다.
3) 코틀린(Kotlin)
- 안드로이드 플랫폼의 구조를 떠올리면 리눅스 커널과 자바 API 프레임워크가 결합된 형태이다.
- 과거에 안드로이드 플랫폼에 대한 설명에는 JVM(정확히는 Dalvik VM 입니다만, 이해를 돕고자 JVM으로 표기함)이 항상 따라 붙었는데 자바 가상 머신 위에서 앱이 동작했기 때문이다.
- 현재는 이를 대신해 안드로이드 런타임(Android Runtime, ART)을 사용한다.
- 따라서 JVM이 없지만 여전히 가상 머신 위에서 동작한다는 점에서 자바의 동작 구조를 차용하고 있습니다.
- 기존에는 주로 자바를 앱 개발 언어로 사용했지만 2017년 5월 Google I/O에서 Kotlin을 공식 언어로 채택한 후 코틀린으로 앱을 개발하게 되었다.
- Google은 2019년 Goolge I/O에서 Kotlin 퍼스트를 선언하며 모든 문서에서 Kotlin 코드를 먼저 노출하는 등 좀 더 강력하게 Kotlin을 메인 언어로 지원하고 있다.
- Kotlin은 Jetbrans사가 만든 프로그래밍 언어이다.
- 여담으로 젯프레인 사에서 만든 가장 유명한 프로그램은 IntelliJ라는 개발 툴이고, 이를 기반으로 안드로이드 스튜디오가 만들어졌다.
4) 함수형 프로그래밍 언어 코틀린
- Kotlin은 함수형 프로그래밍을 표방하고 있다.
- 객체지향 프로그래밍과 비교하자면 객체지향 프로그래밍은 클래스 내부에 있는 함수에서만 로직을 작성하지만, 함수형 프로그래밍은 이런 제한 없이 어디에서나 작성할 수 있다.
- “Hello World”를 출력하는 짧은 코드로 비교하면 다음과 같다.
// [Java Code]
class Hello {
public static void main(String args[]) {
System.out.print("Hello World");
}
}
// [Kotlin Code]
print("Hello World")
5) 안드로이드 개발에 있어서 자바와 코틀린의 차이
- Kotlin으로 코드를 작성하면 자바로 작성했을 때보다는 코드의 양이 훨씬 적어진다.
- 간단하게 체크박스를 클릭하면 화면에서 이미지를 숨겼다가 보여주는 코드를 살펴보겠다.
- 다음 코드는 각각 자바와 Kotlin으로 작성한 예제이다.
- 자바로 작성하기 위해서는 기본 코드 외에 약 열 줄 이상의 코드가 필요하지만 Kotlin으로 작성하면 세 줄의 코드로 표현할 수 있다.
// [Java Code]
CheckBox checkBox = findViewById(R.id.check);
ImageView imageView = findViewById(R.id.image);
check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onChanged(CompoundButton buttonView, boolean isChecked){
if (isChecked){
image.setVisibility(View.VISIBLE);
} else {
image.setVisibility(View.GONE);
}
}
});
// [Kotlin Code]
binding.check.setOnCheckedChangeListener { buttonView, isChecked ->
binding.image.visibility = if(isChecked) View.VISIBLE else View.GONE
}