안드로이드 앱 개발 공식언어 Kotlin
구글에서 안드로이드의 공식언어를 코틀린(Kotlin)으로 변경하였습니다. 코틀린은 사실 전혀 새로운 프로그래밍 언어는 아닙니다. 코틀린문법으로 작성한 소스코드를 컴퓨터가 인식할 수 있도록 compile 시키면 .class 파일로 만들어 집니다. Java언어의 .class 파일과 같습니다. 즉, 컴퓨터 입장에서는 코틀린으로 개발한거나 Java문법으로 개발한거나 컴파일 시킨 파일이 같기때문에 개발자가 작성하는 문법적 표기법만 차이가 있을 뿐 입니다. 다시말하면 자바로 개발하나 코틀린으로 개발하나 똑같기 때문에 하나의 앱안에서 특정 파일은 코틀린으로 작성하고 다른 파일은 자바로 작성해도 서로 잘 인식합니다. 자바로 만든 클래스를 코틀린에서 객체로 생성해도 된다는 겁니다. 그래서 언어가 바뀌었다고 기존 자바 앱개발 기술이 쓸모 없거나 한건 아닙니다. 여전히 현업에서 20% 정도는 자바언어를 이용하여 앱을 개발합니다. 특히, 웨어러블 의료기기의 시그널을 받아 사용자에게 정보를 제공하는 앱들의 경우에는 자바언어를 이용하여 앱을 개발하는 경우가 많습니다. 그리고 개인적인 견해이기는 하지만 코틀린은 결국 컴파일 하면 자바의 .class파일이 되는 만큼 자바언어에 대한 이해없이 코틀린 언어만 학습하여 앱 개발을 하는 것에 대해서는 긍정적으로 보고 있지는 않습니다. 아. 그렇다고 코틀린언어 학습으로 앱 개발을 시작한다고 해서 잘못 되었다는 것은 아닙니다. 단지, 코틀린이 자바언어를 기반으로 하는 만큼 개발자라면 이런 자바와 코틀린언어의 특징은 알고 시작했으면 하는 겁니다.
그래서 필자가 강의를 할때는 보통 자바언어 문법 수업을 먼저 교육하고 안드로이드 수업의 시작은 자바언어로 만들어 봅니다. TextView 나 Button 같은 기본 View 들을 다루는 정도의 수업을 통해 안드로이드 앱 개발의 기초 개념을 익히는 정도는 자바언어로 만들어보는 경험을 한 후에 코틀린언어의 주요 문법들을 학습하여 나머지 안드로이드 앱 개발 수업을 했을 때 비전공자들이 조금 더 프로그래밍 언어의 차이에 대한 이해를 잘하는 것을 볼 수 있어서 이 학습 순서를 선호합니다. 혹시 안드로이드 앱 개발 공부를 시작하는 입장이시라면 가급적 Java언어의 문법을 살펴보고 난 후 코틀린언어를 배우면서 두 언어의 문법적 차이를 대략적으로 확인하며 공부해 보시면 좋을 겁니다. 문법적 차이가 다소 많이 나는 편이어서 쉽지는 않겠지만 나중에 내실있는 앱 개발자가 될때 도움이 될 겁니다.
이건 추가적인 이야기 이지만, 요사이 앱 개발을 하는 스타트업에서 빠르게 android와 ios 용 앱을 만들고 배포하기 위해 많이 사용하는 크로스플랫폼 개발 툴인 Flutter 의 개발언어는 Dart 라는 언어를 사용하는 데 문법적 표기법은 코틀린보다는 자바언어와 조금 더 비슷하여 자바언어를 전혀 모르는 상태에서 코틀린만으로 앱을 개발했던 초보자들은 쉽게 Dart 문법이 익혀지지 않습니다. 반대로 자바 언어의 문법을 대략적으로라도 알고 있다면 조금 더 Dart언어를 받아들이는 과정이 수월할 겁니다.
여러분도 언젠가 앱 개발자가 되어 실무에서 프로젝트들을 수행하다 보면 디바이스의 고유 언어를 사용하는 네이티브 앱 개발만 하지 않고 웹프론트엔드와 웹뷰를 사용하는 웹앱도 개발하게 되며 Flutter 나 React Native와 같은 크로스 플랫폼 앱 개발도 하게 될 겁니다.
코틀린 언어를 학습하기 전에 가급적 자바언어의 특징과 문법. 객체지향프로그래밍 등에 대한 개념을 살펴보길 바라는 입장해서 글이 길어졌네요. 이제 코틀린 언어의 기본적인 문법을 소개하겠습니다.
다만, 이번 코틀린에 대한 글은 자바언어를 대략적으로 학습했다는 전제로 차이점을 위주로 작성하려 합니다. 또한, 코틀린 문법을 A~Z까지 모두 세세하게 학습하기 보다는 안드로이드 앱 개발에 필요한 정도의 수준으로 필요한 부분만 소개하려 한다는 점을 이해하고 읽어주시기 바랍니다.
코틀린 개발 환경
- Kotlin compiler
- 코드 편집기 IDE [ IntelliJ IDEA ]
코틀린언어도 개발자가 영어로 작성하는 언어이고 컴퓨터가 이를 인식하게 하기 위해 기계어로 번역하는 컴파일 과정을 거쳐야 하기 위해 컴파일러가 필요합니다. 이 컴파일러를 Kotlin compiler 라고 부릅니다. 무료 소프트웨어 입니다. 즉, 다운로드 받아 여러분의 컴퓨터에 설치하면 됩니다. 구글 검색을 통해 손쉽게 다운로드 받으실 수 있습니다. 그리고 코드를 작성해야 하니 편집기도 필요하겠죠. 아무래도 코틀린언어를 JetBrains 사에서 만든만큼 편집기도 같은 회사에서 만든 IntelliJ 를 사용하면 됩니다.
하지만, 이 글을 보시는 분들은 이미 안드로이드 개발환경을 모두 설치하신 분들일테니 위 2가지 개발환경을 추가로 설치하실 필요가 없습니다. 안드로이드 개발도구인 Android Studio가 IntelliJ 편집기에 앱개발관련 기능과 메뉴들을 추가해서 만들었으며 Kotlin으로 개발하도록 설계되었기에 Kotlin compiler 도 내장되어 있습니다. 이미 준비가 다 되어있기에 안드로이드 스튜디오로 실습을 진행하겠습니다.
문법 소개에 앞서, 코틀린언어 학습이 목표라기 보다 안드로이드 앱 개발을 위해 코틀린언어를 학습하는 만큼 기존 자바언어로 개발했을 때와 코틀린으로 개발했을 때가 문법적으로 어떻게 다른지를 대략적으로 살펴보는 것으로 학습을 시작해 보겠습니다.
|
이미 알고 있듯이 안드로이드 앱 개발의 화면 UI 개발은 XML 마크업 언어를 사용하고 동적인 제어를 JAVA언어에서 KOTLIN 으로 변경하는 것이기에 UI 파일인 activity_main.xml 파일을 똑같고 MainActivity.java 파일만 코틀린 파일인 MainActivity.kt 파일로 변경되어 있습니다.
그래서 MainActivity.kt 만 살펴보겠습니다.
MainActivity.kt |
package com.kitesoft.kotlinhello import android.os.Bundle import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat //대략적인 코틀린 코딩 방식 살펴보기 - 자바와의 차이를 기반하여 소개. //Kotlin에서 클래스 상속 키워드는 ":" 이며 상속하는 클래스명옆에 주생성자를 호출하는()가 필수임 class MainActivity : AppCompatActivity() { //Kotlin 에서의 메소드(함수)는 fun 키워드 사용 - onCreate() 라이프사이클 메소드 오버라이드 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 화면의 최상단 status bar(상태표시줄)와 최하단 navigation(뒤로가기,홈,최신앱목록)버튼들을 가진 네비게이션 영역 까지 액티비티 화면을 모두 사용하는 기능 함수 enableEdgeToEdge() // 화면에 보여줄 뷰를 설정 setContentView(R.layout.activity_main) // enableEdgeToEdge()를 사용 하면 화면 하단의 네비게이션 버튼에 의해 화면이 가려지기에 네비게이션 영역만큼 패딩 설정 ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } } }
아직 코틀린 문법을 정식으로 학습하기 전이기에 주석으로 대략적인 코드만 확인해 봤습니다. 지금은 너무 이해할려고 노력하지 않아도 됩니다. 문법적 표기법이 다소 차이는 있지만 기존 자바파일과 큰 차이는 없다는 것을 알 수 있을 겁니다.
이렇게 기본적으로 만들어진 코드만 살펴보기에 다소 아쉽네요.
코틀린 코드의 특징을 간단하게 확인해보기 위해 글씨를 보여주는 TextView와 Button 하나를 화면에 배치하고 버튼 클릭이벤트로 TextView가 보여주는 글씨를 변경하는 코드를 코틀린 스럽게 코딩해 보겠습니다.
LinearLayout을 이용하여 TextView와 Button을 간단하게 수직으로 배치하겠습니다.
activity_main.xml |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp" tools:context=".MainActivity"> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hello" android:padding="8dp"/> <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="change text" android:textAllCaps="false"/> </LinearLayout>
XML 레아이웃 파일을 만드는 것은 전혀 변한게 없지요. 이제 이 뷰들을 참조하여 클릭이벤트를 처리하는 코드를 작성해 보겠습니다.
기존 MainActivity.kt 파일에서 새로 추가한 부분은 굵은 글씨로 표시하겠습니다.
지금은 대략적인 코틀린 코딩스타일을 확인하는 것이라 설명은 주석으로 대체하겠습니다. 깊게 이해하기 보다는 눈에 익혀본다는 느낌으로 가볍게 살펴보시기 바랍니다.
MainActivity.kt |
package com.kitesoft.kotlinhello
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
//대략적인 코틀린 코딩 방식 살펴보기 - 자바와의 차이를 기반하여 소개.
//Kotlin에서 클래스 상속 키워드는 ":" 이며 상속하는 클래스명옆에 주생성자를 호출하는()가 필수임
class MainActivity : AppCompatActivity() {
//Kotlin 에서의 메소드(함수)는 fun 키워드 사용 - onCreate() 라이프사이클 메소드 오버라이드
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 화면의 최상단 status bar(상태표시줄)와 최하단 navigation(뒤로가기,홈,최신앱목록)버튼들을 가진 네비게이션 영역 까지 액티비티 화면을 모두 사용하는 기능 함수
// enableEdgeToEdge()
// 화면에 보여줄 뷰를 설정
setContentView(R.layout.activity_main)
// enableEdgeToEdge()를 사용 하면 화면 하단의 네비게이션 버튼에 의해 화면이 가려지기에 네비게이션 영역만큼 패딩 설정
// ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
// val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
// v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
// insets
// }
//변수는 var 키워드사용 - [ var 변수명 : 타입 ]
var btn: Button = findViewById(R.id.btn) //문장의 끝인 ;이 필요없음
//버튼에 클릭리스너 설정하기 - 자바의 람다식과 비슷한 SAM(Single Abstract Method) 변환 제공
btn.setOnClickListener {
clickBtn() //메소드 호출
}
}//onCreate method ..
//Kotlin 에서의 메소드(함수)는 fun 키워드 사용
fun clickBtn(){
var tv = findViewById<TextView>(R.id.tv) //변수선언시에 자료형을 명시하지 않아도 됨.
//tv.setText("Nice to meet you. Kotlin");
//Kotlin은 setXXX()메소드를 권장하지 않고 멤버변수에 값 대입을 선호함 (실제 내부적으로는 setter 메소드가 구동됨 - kotlin property 특성)
tv.text= "Nice to meet you. Kotlin";
}
//Override 메소드가 Java에서는 @Override 어노테이션을 사용했지만
//코틀린에서는 메소드 앞에 override 키워드 삽입
//Override 메소드는 반드시 fun앞에 'override' 키워드가 있어야 함. 없으면 Error
override fun onResume() {
super.onResume()
Toast.makeText(this, "onResume", Toast.LENGTH_SHORT).show() //kotlin언어에서는 Toast 자동완성 기능을 소문자로 toast를 써야함
}
}//MainActivity class....
실행결과
대략적으로 살펴 보았으니 다음 글에서 본격적으로 코틀린 문법에 대해 알아보겠습니다.
'소소한 소스코드' 카테고리의 다른 글
[안드로이드 Android] Kotlin 언어로의 전환 2. 자료형과 변수 (0) | 2025.02.14 |
---|---|
[안드로이드 Android] Kotlin 언어로의 전환 1. 주요특징 및 화면출력 (0) | 2025.02.08 |
[안드로이드 Android] 데이터 바인딩 Data Binding #3 - EditText 사용하기 (0) | 2021.09.30 |
[안드로이드 Android] 데이터 바인딩 Data Binding #2 - 버튼클릭이벤트 처리하기 (0) | 2021.09.29 |
[안드로이드 Android] 데이터 바인딩 Data Binding #1 (0) | 2021.09.27 |