IT/Android(비공개)

2. Kotlin(코틀린)_1

상짱 2020. 2. 20. 16:48
반응형

1. KOTLIN(코틀린)

- 2017년 안드로이드 공식 개발 언어로 지정

- https://kotlinlang.org/

 

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