コトリンの基本文法


コトリンの基本文法
1.main()関数
Intellijでcottlinプロジェクトを作成し、大学生のときに最初に接触したプログラミング担当者としてHello Kotlin!をコンソールウィンドウに配置する例を作成しました.
fun main() {
    println("Hello Kotlin!")
}
上のkotlinファイルでのみmain()関数を定義して実行すると、コンソールは正常にHello Kotlin!を出力します.
mainを入力し、Tabキーを押して自動的に作成します.argsを追加する場合は、mainaを押すだけで、Tabキーを押すと自動的に完了します.
上記main関数がJVMで実行されると、main関数を含むファイル名に基づいてJavaクラスが自動的に生成されます.
シーケンスは、JVMでCOTLIN->バイトコードの順に実行されます.
上記の方法を逆コンパイルすると、以下のコードとして解釈されます.
public final class HelloKotlinKt {
    public static final void main() {
        String var0 = "Hello Kotlin!";
        boolean var1 = false;
        System.out.println(var0);
    }
}
上記のソースコードから、main()メソッドはHelloKotlinktクラスに属するメンバーメソッドとして宣言されていることがわかります.JavaをアルバムJVM上で実行するため、文字列はString var 1として宣言され、Systemと呼ばれます.out.println()からコンソールデバイスに出力されます.
package
コトリンプロジェクトは複数のモジュールから構成されています.通常、各機能はモジュール単位で管理され、モジュールにpackageを配置してクラス/ファイルを管理します.
2.変数の作成
変数宣言キーワードは2種類あります.
  • val:不変、JavaScriptのconst、JavaのStringクラス.Javaのfinalキーワードとは少し違います
  • var:可変変数で、通常の変数として再割り当てできます.JavaScriptのletと同じです.コートリンで変数を宣言するには、キーワードの1つを使用する必要があります.
  • valを主とし、セキュリティの向上を目標とし、可変割当が必要な変数に対してvarを用いるべきである.
    val username: String = "junyoung"
    변수선언키워드 변수명:타입=값こう書けばいいCottinコンパイラがタイプを推定できる場合は、このタイプを省略できます.
    val username = "junyoung"
    上記のように、値が文字列の場合、cottlinコンパイラはユーザー名をStringタイプと推定します.
    変数と割当て変数を同時に宣言しない場合は、タイプを無視することはできません.
    val name // 불가능
    val name:String // 가능
    name = "hello"
    前述したように、先に宣言するだけであれば、タイプを記入する必要があります.
    変数宣言の例
    // val var 차이
    val name:String = "immutable"
    var age:Int = 20
    name = "junyoung"  // val로 설정했으니까 컴파일 시점에 에러가 납니다.
    age = 30
    println("age: $age")  // $(달러표시)로 변수를 출력할 수 있습니다. 
    
    // 선언과 할당
    var number = 10
    number = 20
    var number2:Int // Int라고 타입을 줬으니까 선언만 해도 됩니다.
    number2 = 30
    val number4 // 이 변수는 타입을 가져야 하거나 초기화가 되어야된다는 에러가 납니다.
    変数タイプ基本タイプ(Primitive type)と参照タイプ(Reference type)
    コトリンでは、参照フォーマットを使用して符号化する必要があります.
    コンパイラは内部で基本型に変換し、最適化されたバイトコードにするので、参照型だけを使用するのもいいです.
    (int,long,double,...この基本タイプではなくlong,double,...を使うべきで、内部もよく置き換えることができます.)
    3.資料型
  • 整数データ型
  • Long、Int、Short、Byte.
    変数を宣言するときにタイプが個別に書き込まれていない場合は、アノテーションでタイプが指定されます.
    値100、省略タイプの場合はIntと推定され、99933332223344455はLongと推定される.
  • valex 1=100 Lのように接尾辞Lを付けると,Longタイプと推定される.整数タイプでは、Intはデフォルトです.Short範囲内の整数であってもShortではなくIntと推定する.
    val myLong = 99_933_322_233_344_455 // Long으로 추론
    val ex1 = 0x0F // 16진수 표기 15
    val ex2 = 0b0001111 // 2진수 표기 15

  • 実数データ型
  • のデフォルトは二重引用符で、値にFを付けるとFloatタイプになります.

  • 論理データ型
  • valisOpen=trueは自動的にBooleanと推定されます.

  • 文字データ型
  • '(一重引用符)という文字を指定すると、Charと推定されます.

  • 文字列データ型
  • 文字列タイプは、他のタイプとは異なり、基本タイプではなく参照タイプです.値に文字を並べた場合、Stringタイプと推定されます.Javaと同様にお尻でStringPoolを共有するのが特徴です.
  • var string1 = "hello"
    var string2 = "hello"
    println(${string1 === string2}) // true
    // string1과 string2가 참조하는 주소값이 같습니다.
    文字列で「(二重引用符)または$(ドルで表される)を使用する場合は、反スラッシュ()を前に置くことができます.
    val expression = "\"hello\" this is \$10"
    スラッシュではなく${""}を使用する場合は、二重引用符を適用できます.
    文字列""の使用方法(文字列自体で表す方法)
    val num = 10
    val formattedString = """
        var a = 11
        var b = "hello kotlin"
        """
    println(formattedString)
    実行結果
    var a = 11
    var b = "hello kotlin"
  • 資料型別名
  • typealias Username = String
    val user:Username = "junyoung"
    typealiasキーワードを使用してStringタイプにユーザー名を付けます.
    4.資料型検査
  • コトリンnull
  • コトリンは変数を使用するときに値を付けなければなりません!このような原則がある.(nullが好きではありません)これまで、上記のコードでは多変数nullは許可されていませんでした.nullを許可する場合は、疑問符(?)を入力します.記号をタイプに貼り付けた後、変数を宣言します.
    // null 문제
    val str:String = "hello_world"
    str = null // 컴파일러에서 이미 에러 발생함
    // 타입 뒤에 ? 붙이면 null이 할당될 수 있는 변수라는 의미입니다.
    var str2:String? = "hello_world" // val은 immutable이라 ?를 붙여도 컴파일 에러가 발생합니다.
    str2 = null
    println(str2) // null 출력 
    // non-null 단정 기호와 세이프 콜
    var nullableString:String? = "hello_kotlin"
    nullableString = null
    // println("nullableString: $nullableString.length: ${nullableString.length}") // .에서 컴파일 에러 발생
    
    // String? 타입에서는 ?.(세이프콜) 또는 !!.(non-null 단정기호)만 쓸 수 있다고 나온다. 
    // safe call이란 말 그대로 안전하게 호출하도록 도와주는 기법이다. println("nullableString : $nullableString , length : ${nullableString?.length}") //출력 값 : nullableString : null , length : null
  • エルビス演算子:(?:)
  • 上で学んだSAFE CALLとELVIS演算子を使って、とてもきれいなnull処理を実現できます.
    var testString:String? = "hello_kotlin"
    testString = null
    println("testString length: ${testString?.length ?: -1}")
    testStringは、SAFE COLONGにアクセスせずにnullを返すため、エルビス演算子の前の値はnullとなります.
    値がnullの場合、エルビス演算子は演算子であり、予め指定された値を返します.したがって、出力を-1として指定すると、-1が表示されます.
    if文を使用してnullを1つずつチェックする必要がなく、1行で処理できるため、読みやすさが向上します.
    5.データ変換
    int値を二変数に割り当てると、Javaは自動的にタイプを変換します.
    int a = 3;
    double d = a; // 3.0으로 자동 변환
    コトリンは自動的に形を変えることはありません.逆にタイプミスが発生し、ミスを徹底的に防止します.従って、コトリンはフォーマットを変換する方法を提供した.
    val intValue:Int = 3
    val doubleValue:Double = intValue.toDouble()
    val result = 1L + 3 // Long으로 형변환 -> 표현범위가 더 큰쪽으로 변환됩니다.
    基本型と参照型の比較原理
    比較値:==、値が同じ場合true、値が異なる場合false
    比較参照アドレス:===、参照自体が同じ(値にかかわらず)場合はtrue、そうでなければfalse(値は考慮されませんが、参照自体が同じ)です.
    基本タイプと参照タイプの比較例
    val one:Int = 128
    val two:Int = 128
    
    println(one == two) // true
    println(one === two) // true
    
    val three:Int = 128
    val four:Int? = 128
    
    println(three == four) // true
    println(three === four) // false
    // Int 형으로 선언된 three는 128 값 자체가 스택에 저장, Int? 형으로 서언된 four는 128이 힙 영역에 저장되어 있고, 그것의 주소로 저장합니다.
    
    val data1:Int = 128 
    val data2 = data1; 
    println(data1 == data2)//기본형으로 int로 변환되어 값이 동일하므로 true 
    
    val data3:Int? = data1  //128이라는 값을 힙에 할당하고 그것을 가리킵니다. 
    val data4:Int? = data1  //128이라는 값을 힙에 할당하고 그것을 가리킵니다. 
    val data5:Int? = data3 
    println(data3 == data4) //true 값만 비교했는데 두 개의 값은 128로 같습니다.
    
    //각각 값은 128로 동일하지만 힙에 생긴 128은 각각 생기기 때문에 다른 주소를 가리키므로 주소비교는 false 
    println(data3 === data4) //false
    /**
    * data5는 data3를 가리키는데 data3가 힙의 128의 주소를 가리키고 있으므로 
    * 복사되었을 때 같은 힙에 있는 128을 가리킵니다.
    **/
    println(data3 === data5) // true
    まず、メモリ領域のHIPで作成するかスタックで作成するかを知る必要がありますが、簡単に言えばnullを許可しない変数は、参照タイプを使用する場合、内部でデフォルトタイプの値が得られ、スタックに直接割り当てられます.
    ただし、nullの変数は、基本タイプの参照に変換されても、hipに独自の値を割り当て、そのアドレスを스택공간に割り当てることができる.
    デフォルトでは、
  • はnullを許可します.これは、変数自体がオブジェクトであることを意味します.nullをデフォルトのタイプに割り当てることもできません.
  • -128-127の整数値はキャッシュに格納され、参照される.
  • したがって、上記の例では、値が10の場合、10自体がキャッシュに格納され、すべての変数がキャッシュのアドレス値を格納する.
    6.インテリジェント放送
    値が整数、実数の場合、どうすればいいですか?Number型もございます(特殊オブジェクト)Number型として定義される変数は、整数および実数を含むことができる.
    var sc:Number = 3.14
    println(sc) // 3.14 Double
    
    sc = 3
    println(sc) // 3 Int
    
    sc = 30L
    println(sc) // 30 Long
    
    sc = 10.1F
    println(sc) // 10.1 Float
    データ型チェック時isキーワード
    val cup = 3
    if(cup is Int) {
        println("Int Type")
    }
    if(cup !is Int) {
        println("Not a Int Type")
    }
    if(!(cup is Int)) {
        println("Not a Int Type")
    }
    データ型インテリジェント放送
    val x:Any // Any는 자바의 Object와 유사합니다. 모든 타입의 부모 타입입니다. Any를 이용하면 자료형을 결정하지 않은 채로 변수를 선언할 수 있습니다.
    x = "jdk"
    if(x is String) { // is 키워드로 검사될 때 자동으로 스마트 캐스팅 되었으므로 해당 조건문을 탑니다.
        println(x)
    }
    asキーワードによるインテリジェント鋳造
    var y:Int = 3
    val t:String = y as String 
    val tt:String? = y as? String
    yがnullでない場合、Stringに変換してtに割り当てます.nullの場合、変換できないため異常が発生します.
    nullが発生する可能性がある場合は、異常を回避するために、以下の方法で疑問符を付けて解決できます.
    yがnullの場合、asキーにアクセスせずにnullが返されます.ttはnullとすることができるのでnullを保存します.
    参考文献:Do it!コトリンプログラミング