Kotlinの基本概念



1.Kotlinは?


  • JetBrans社が作成したプログラミング言語で、JVMに基づいて実行され、JAVAと100%互換性があり、JAVAよりも簡潔な文法と生産性の高い文法の利便性を提供しています.

  • 最近ではAndroid公式言語として採用され、Web開発においても使用される傾向にある.

  • オブジェクト向けプログラミングや関数式プログラミングが可能で、関数を変数に含めたり、関数を関数のパラメータとして関数に渡したりできます->高次関数
  • //코틀린은 함수형 언어이므로, Lambda식 접근이 편리
    btn.setOnClickListener(new View.OnClickListener() {
      	@Override
        public void onClick(View v) {
            //실행 구문
        }
    })
    
    btn.setOnClickListener { v ->
        //실행 구문
    }

    2.基本関数と変数の宣言

        fun main() {
            println("Hello, world!!!")
        }
    
        //코틀린 구문식 함수
        fun sum(a: Int, b: Int) : Int {
            return a + b
        }
    
        //코틀린 표현식 함수
        fun sum(a: Int, b: Int) = a + b
    
        fun max(a: Int, b: Int) = if(a>b) a else b
    
        //명시적 데이터 타입 선언
        val a: Int = 1
    
        //타입 추론
        val b = 2
        val c = 3.14
    
        //Null Safe로 인해 반드시 초기 값 설정 필요
        //val : 상수이기 때문에 두 번 이상의 초기화 불가능
        val d: String
        d = "기본 값"
    
        //Nullable
        val boolNull : Boolean? = null
        
        val b: Int? = 100
        val c: Int = 100
    
        b?.sum() //null일 경우 실행하지 않는다.
        c.sum() //변수 선언 때부터 nullsafe
        
        //초기값이 없는 전역 변수 선언
        lateinit var num: Int
    
        //추후 초기화
        num = 10
    
        //실제로 변수가 사용되기 전까지는 100이라는 값이 할당되지 않는다.
        val lazyNum : Int by lazy {
            100
        }
    
        //사용할 때 100 할당
        lazyNum.add()

  • 一般的な式関数宣言とは異なり、式関数をより簡潔に宣言できます.

  • タイプ推論:Javaとは異なり、Cottinは開発者が直接変数を宣言するタイプを必要としません.

  • Nullable:Cortlinはnullのタイプですか?明確に説明することで、Null Pointer Exceptionに従ってチェックすることで信頼性を高めることができます.

  • latinit var:初期値のないグローバル変数を宣言

  • Lazy:呼び出しポイントの初期化を1回行い、その後インポートして書き込むだけです.

  • これらの関数表現,型推定,Nullableチェックにより,Javaベースの開発よりも短く安定したコードを生成できる.
  • 3.繰り返し文と状況処理

        //기본 반복문
        for(i in 1..5) {
            println(i)
        }
    
        //6 4 2 0
        for(i in 6 downTo 0 step 2) {
            println(i)
        }
    
        //1 4
        for(i in 1..5 step 3) {
            println(i)
        }
    
        //100 200 300
        val numberList = listOf(100, 200, 300)
        for (num in numberList) {
            println(number)
        }
    
        //sum에 1부터 9까지 축적 (until은 마지막 숫자 제외)
        var sum = 0;
        for(i in 1 until (10)) {
            sum += i
            println("$i")
        }
    
        //5 4 3 2 1
        var x = 5
        while(x>0) {
            println(x)
            x--
        }
    
        //0
        var y = 0
        do {
            print(y)
            y--
        } while (y>0)
    
        //표현식 if 구문
        val max = if(a>b) {
            print("Choose a")
        } else {
            print("Choose b")
        }
    
        when (x) {
            1 -> print("X==1")
            2 -> print("X==1")
            else -> {
                print("x is neither 1 nor 2")
            }
        }
    
        when (x) {
            0, 1 -> print("X==1 or X==2")
            else -> print("otherwise")
        }
    
        when (x) {
            in 1..10 -> print("x는 1부터 10 범위 안에 존재")
            !in 11..20 -> print("x는 11부터 20 범위 안에 없다.")
            else -> print("otherwise")
        }
    
        when (x) {
            is Int -> print("X는 정수형")
            else -> print("X는 정수형이 아니다.")
        }

    4. Scope Function


  • 関数の唯一の目的は、オブジェクトのContextでコード内のブロックを実行することです.

  • コードを整理して表現する機能で、可読性を高めます.

  • 1. Apply

  • オブジェクト拡張関数、オブジェクト初期化用、
  • 省略可能
        val person = Person().apply {
            firstName = "Lee"
            lastName = "Park"
        }

    2. Also


  • パラメータでオブジェクトを渡す(デフォルトパラメータ:it)

  • パラメータをLambdaの入力値に指定
  •     //1~100까지의 함수를 랜덤으로 추출하여 그 값을 파라미터로 print() 함수에 전달
        Random.nextInt(100).also {
            print("$it")
        }
    
        //파라미터명을 임의로 지정
        Random.nextInt(100).also { value ->
            print("$value")
        }

    3. Let


    非Nullオブジェクトに対してLambda構文を実行する
        val sumNumberStr = number?.let {
            //변수가 null이 아닐때 실행될 내용이 sumNumberStr에 삽입되는 것
            "${sum(10, it)}"
        }
    
        //orEmpty() : 변수가 null이면 빈 값 삽입
        val sumNumberStr = number?.let {
            "${sum(10, it)}"
        }.orEmpty()
    

    4. With


  • 宣言は、親ジェネレータを介して子関数を実行します.

  • 拡張関数として使用できません
  • val person = Person()
    
    With(person) {
        work()
        sleep()
        println(age)
    }

    5. Run


  • 初期化値と計算値を一緒にすると便利です.

  • 領域変数の制限に使用する範囲

  • 拡張関数として使用可能
  • val result = service.run {
        port = 8080
        query()
    }