1. KOTLIN(코틀린)
- 2017년 안드로이드 공식 개발 언어로 지정
Kotlin Programming Language
kotlinlang.org
* 코틀린은 java 와 100% 상호 호환 / 하나의 프로젝트에서 썩어 사용할 수 도 있음
* 코틀린은 Null Pointer Exception 발생 코드를 금지, Null 에 대해 안전한 코드를 간결하게 표현할 수 있도록 지원
* 코틀린은 '타입 추론'을 지원 / 정적 타입 지정 언어가 가진 정확성과 성능을 보장하면서도 동적 타입 언어와 같은 간결함을 유지
* 코틀린은 '람다 표현식'을 지원
* 코틀린은 객체지향 / 함수형 프로그램 스타일을 모두 지원
* 코틀린의 확장 함수는 기존 클래스의 변경 없이 클래스의 기능을 추가하는 것이 가능
* 코틀린은 코드 패턴을 간결화
* 코틀린의 함수는 '일급 객체'로서 다른 함수의 파라미터로 전달 가능 / 함수의 반환값을 함수 형태로 반환할 수 있어 높은 추상화가 가능
* 코틀린은 불변성을 보장하는 변수 / 변경이 가능한 변수 를 언어 차원에서 분리
* 코틀린은 Android Extension 을 사용하면 findViewById() 함수로 접근해야 했던 코드들을 줄일 수 있어 간결성 유지
* 코틀린은 JetBrain 이 만든 언어
- android studio(3.0이상) 에서 [Language]를 [kotlin] 을 선택하면 사용할 수 있다.
- java -> kotlin 으로 변환 ( 메뉴 [Code] > [Convert Java File to Kotlin File] 을 클릭하면 변환 )
// java
package com.example.hello;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
// kotlin
package com.example.hello
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class MainActivity1 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
* 함수를 선언할 때 fun 이라는 키워드를 사용한다.
* 파라미터 이름 뒤에 파라미터 타입을 쓴다.
* 문장 끝에 세미콜론(;)을 붙이지 않아도 된다.
* 클래스 상속을 표현할 때 extends 대신 콜론(:) 기호를 쓴다.
* 함수의 반환값이 없는 경우, void 를 표시하지 않고 생략한다.
2. 확장 플러그인( Plug-in )
- 특정 환경을 위해 부가적으로 제공하는 기능
- 크게 2가지 기능 제공
- XML 에서 만든 UI 요소를 findViewById() 없이 접근하는 'View Binding' / 안드로이드에서 객체를 직렬화할 때 사용하는 'parcelable' 을 위한 기능
- import 문 'kotlinx'는 kotlin 의 확장 패키지, -x 는 대부분 확장을 의미
import kotlinx.android.synthetic.main.activity_main.*
- Intent 클래스는 일종의 메세지 객체이다.
package com.example.kotlinsample
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button02.setOnClickListener {
startActivity(Intent(this@MainActivity, SubActivity::class.java))
}
}
}
- 써드 파티 라이브러리( Third Party Library )
- 써드 파티는 제3자의 뜻하는 단어로, 하드웨어나 소프트웨어 등의 제품을 제조하는 원래 회사나 기술제휴가 이외의 기업을 통칭 / 여기에서는 구글 외의 기업에서 개발한 라이브러리를 써드 파티 라이브러리 라고 일컴.
* 코틀린은 확장 기능으로서 안드로이드 확장 플러그인을 제공
* 코틀린의 안드로이드 확장 플러그인은 View Binding, Parcelable 어노테이션을 지원
* View Binding 기능은 XML 로 작성된 UI 요소를 findViewById() 함수 없이 직접 접근하여 사용하는 기능
* Parcelable 어노테이션은 Parcelable 인터페이스 구현을 어노테이션으로 대체하여 간결 작성할 수 있도록하는 기능
3. 변수
- 코틀린은 2가지 키워드
- 변수의 불변성을 보장 / 타입 추론을 하기 때문
- val / var
val
* 변경 불가능한 참조를 저장하는 변수 / 특정한 값을 의미 / Value
* 변수의 재 대입 불가능
* java 'final' 키워드와 동일
var
* 변경 가능한 참조 / Variable
* java 일반적인 변수
- 변수의 타입추론
- 코틀린은 컴파일 시점에 타입을 결정하는 정적 타입 언어이다. / 변수의 타입을 추론.
- 정적 타입 언어는 컴파일 시에 타입 캐스팅 문제를 확인할수 있고, 실행이 빠르다는 장점이 있지만, 반드시 변수를 선언할 때 타입을 적어야 하므로 코드 작성 시에 타입을 신경 써야 하는 불편한 점이 있다.
- 동적 타입 언어는 변수의 타입에 상관없이 코딩하기 때문에 코드 작성이 쉽지만, 사전에 타입을 체크하지 않기 때문에 프로그램 실행 중 타입으로 인한 에러가 발생할 수 있다는 단점이 있다. 자바스크립트 or 파이썬
var count = 0
var count:Int = 0
// 자바스크립트에서는 실행되지만 코틀린에서는 실행안됨
// name 은 String 타입이므로 정수 타입인 Int 를 할당할 수 없음
var name = "이름"
name = 30
- 스마트 캐스팅
fun plus(param: Any) {
// param 은 타입체크를 했기 때문에 Int / Double 로 스마트 캐스팅
if( param is Int) {
var result = 3 + param
println( "" + result )
}else if( param is Double ){
var result = 3.0 + param
println( "" + result )
}else{
println( "0" )
}
}
- Any : 코틀린 최상위 클래스
- Object : 자바 최상위 클래스
* 코틀린의 변수는 var / val 키워드로 선언
* var 변수는 초기값 지정 후 변경 가능 / val 변수는 초기값 지정 후 변경 불가능
* 변수가 불변인 경우 메모리 사용측면, 멀티쓰레드 프로그래밍에서의 처리 등 유리한 점이 많다.
* 쓰레드는 프로그램 흐름의 최소 단위이며, 보통 프로세스마다 한 개 이상의 쓰레드를 가지고 있다.
* 코틀린은 변수의 타입을 추론하기 때문에 대부분의 경우 변수의 타입을 명시할 필요가 없다.
* 변수의 타입 추론은 변수의 '동적 타입'과는 다르다. 코틀린은 변수 타입이 컴파일 시점에 모두 결정되는 '정적 타입 언어'이다.
* 코틀린은 변수의 타입을 체크한 경우 블럭 내에서 타입 캐스팅이 자동으로 되는 스마트 캐스팅이 있다.
4. 제어문
- 조건문
- java : if / else / switch
- kotlin : if / else / when
- 코틀린의 if / else 는 java 와 큰 차이 없다.
- when 문
var number = 1
when( number ){
in 1..4 -> println( "number 가 1 ~ 4 까지인 경우 실행된다." )
9, 18 -> {
println( "number 가 9, 18 인 경우 실행된다." )
}
else -> println( "이외의 경우 실행된다." )
}
// when 문은 케이스로 조건식도 사용 가능
when {
number % 2 == 0 -> println( "${number} 는 2의 배수입니다." )
number % 3 == 0 -> println( "${number} 는 3의 배수입니다." )
else -> println( "이외의 경우 실행된다." )
}
- 반복문
- .. : 코틀린의 범위 표현
- for
for( item in collection ){
println( item )
}
for( i in 0..100 ){
println( i )
}
var collection = mutableListOf<String>( "apple" , "banana" )
for( (index, value) in collection.withIndex() ){
println( "the element at $index is $value" );
}
- while
var x = 0
while( x < 4 ){
x++
}
do {
val y = searchData()
} while( y != null ) // do 블럭 내부의 변수 y 에 접근가능 , java 는 접근 불가능
// 여기서부터는 y에 접근 불가
- break
- 일반적으로 자신이 포함된 반복 루프만 빠져나간다.
- 코틀린에서는 레이블을 지원한다. 빠져나갈 곳을 마킹해두는 것
loop1@while(true){
var x = searchData()
if( x == null ) break@loop1
else{
loop2@while(true){
var y = getData()
if( y == null ) break@loop2
}
}
}
loop@for( i in 1..100 ){
for( j in 1..100 ){
if( i*j == 50 ) break@loop
}
}
* 코틀린의 조건문은 java 와 같은 방법으로 if ~ else 문을 사용할 수 있다.
* when 문은 switch 문과 다중 if ~ else 문을 대체할 수 있으며 휠씬 더 간결하다.
* 코틀린은 반복문으로 for, while do ~ while 문을 사용할 수 있다.
* 코틀린의 do ~ while 문은 do 블럭에서 while 블럭의 변수에 접근할 수 있다.
* 코틀린의 continue 키워드는 자바의 continue 키워드처럼 loop를 건터뛰는 역할을 한다.
* 코틀린은 반복문에 레이블을 지정할 수 있으며, break 문 사용시 해당 레이블로 빠져나갈 수 있다.
5. 함수
fun function1(age:int){
// void
}
fun function2(age:int):int{
return 0
}
- 최상위 함수
- java 에서 모든 함수는 클래스 내부에 있어야 한다.
- 객체의 상태 정보가 없고 정적인 메소드를 모아둔 클래스를 정적 유틸리티 클래스 라고 부른다.
- 최상위 함수는 클래스 내부가 아닌, 클래스 외부에 있는 함수를 의미한다.
- 같은 패키지의 모든 코드에서 전역적 접근이 가능하다.
// 파일명 : ToastUtil.kt
// util 파일 생성 후 클래스 선언 없이 함수를 생성하면 된다.
// 최상위 함수
fun toastShort( message:String ){
Toast.makeText( MainApplication.getAppContext(), messgae, Toast.LENGTH_SHORT ).show()
}
fun toastLong( message:String ){
Toast.makeText( MainApplication.getAppContext(), messgae, Toast.LENGTH_LONG ).show()
}
- java 에서도 사용가능하다.
- java 에서는 컴파일시점에 자동으로 ToastUtil.kt 를 ToastUtilKT 클래스로 만들어 사용하게 된다.
- ToastUtilKT 가 아닌 ToastUtil 이름으로 사용하고 싶을 때, '@file 어노테이션' 을 활용
// 파일명 : ToastUtil.kt
// ToastUtilKT 가 아닌 ToastUtil 이름으로 사용하고 싶을 때
@file:JvmName("ToastUtil")
package com.test
...
- 디폴트 파라미터
// java 의 오버로딩과 동일
// java 에서 사용할려면 @ 어노테이션을 사용
@JvmOverloads
fun function( param1:Int, param2:Int = 2, param3:Int = 3, param4:Int = 4, param5:Int = 5 ){
...
}
// 함수를 그대로 호출하면 param3만 값을 바꾸는 것은 불가능하다.
// 이름 붙인 인자를 사용하면 param3만 바꾸는 것이 가능하다.
function( param1 = 10, param3 = 20 )
* 코틀린에서 함수를 선언하려면 fun 키워드를 사용한다.
* 코틀린의 함수는 반환값이 없는 경우 반환 타입을 생략할 수 있다.
* 코틀린은 클래스 외부에 함수를 선언할 수 있으며 , 이를 최상위 함수라 한다.
* 최상위 함수를 Java에서 사용할 때에는 최상위 함수가 포함된 파일 이름을 기반으로 클래스가 생성되고, 생성된 클래스의 정적 함수로 사용된다.
* 코틀린은 함수의 파라미터 기본값을 지원하여 메소드 오버로딩을 줄일 수 있다.
* 코틀린은 함수를 호출할 때 파라미터 인자에 이름을 붙여 값을 할당할 수 있다.
'IT > Android(비공개)' 카테고리의 다른 글
[Android] View / Theme (0) | 2020.03.05 |
---|---|
Activity / Intent (0) | 2020.03.04 |
Android-studio / svn 연결 (0) | 2020.03.04 |
4. Kotlin(코틀린)_3 (0) | 2020.03.02 |
3. Kotlin(코틀린)_2 (0) | 2020.02.26 |
1. Android 기본 (0) | 2020.02.07 |
Android 재시작 (0) | 2020.02.07 |