Kotlinのデフォルト構文の処理


この投稿はyoutuber Code with Joyceの講義に基づいて書かれたものです.
1.関数の使い方
  • の戻り値にかかわらず、fun 함수명()に統一されています.
    return値がある場合は、fun 함수명(): Unitと宣言されます.
  • パラメータを渡す場合は、タイプの前に変数名を宣言します.
  • fun helloWorld(){
        println("Hello world!")
    }
    
    fun add(a: Int, b:Int) : Int{
        return a+b;
    }
    
    fun add(a: Int, b : Int) = a + b //expression 표현식
    2. val VS var
    fun hi(){
        val a : Int = 10
        var b = 9  // 자동으로 타입을 선언해준다. 타입 추론 가능
    
    		//a = 9 => error!
        b = 100
    }
    valは定数に変更されない値を表します.変数に1回値を初期化した場合、後で他の値に割り当てることはできません.Javaでfinalを使用するのと同様
    varは変数を他の値に変換して使用できます.
    3. String template
    val name = "Jaewon"
    println("my name is ${name} !!")
    println("is this true? ${1==0}")
    println("this is 2\$!!")
    
    /*
    
    my name is Jaewon !!
    is this true? false
    this is 2$!!
    
    */
    4.条件文
    4-3. ExpressionとStatement
    コードユニットExpressionとStatementがあり、Kotlinの関数と条件文はjavaとは異なりExpression으로 표기가 가능です.
  • Expression:1つ以上の値で表すことができるコード
  • 状態:最小の独立コードブロック
  • ExpressionはStatementの一部集合です.したがって,ExはStであってもよいが,StはすべてExではない.
    fun maxBy( a: Int, b:Int) : Int{
        if(a >b){
            return a
        }else{
            return b
        }
    }
    
    fun maxBy2(a : Int, b:Int) = if (a>b) a else b
    maxByのコードはmaxBy 2で表すことができます.
    ここでmaxByとmaxBy 2はどちらもExpressionです.cortlinの関数に戻り値がない場合でも、すべての関数がUnitを返すため、すべての関数がExpressionとしてマークされます.
    ただし、maxByでは、条件文はStatementとしてマークされ、maxBy 2では、条件文はExpressionとしてマークされます.
    Javaではvoid関数に戻り値がないためStatementで表される関数である.また、javaでは条件文はStatemtとしてマークされています.
    4-2. When
    スイッチドアとあまり差がありません.
    fun checkNum(score : Int){
        when(score){
            0 -> println("this is 0")
            1 -> println("1")
            2,3 -> println(" 2 or 3")
            else-> println(" 0~3이 아니다.")
        }
    		// 조건문이 statement로 사용될땐 else문이 없어도 된다.
    
        var b = when(score){
    				0 -> 0
            1 -> 1
            2 -> 2
            else -> 3
        }
       //조건문이 expression으로 사용될땐 else문이 꼭 있어야 한다.
    
        println("b : ${b}")
    
        when(score){
            in 1..3 -> println("1~3")
            in 4..5 -> println("4~5")
            else -> println("1~3이 아니다.")
        }
    }
    
    /* 
    입력 0
    출력
    this is 0
    b : 0
    1~3이 아니다.
    */
      
    5. Array, List
    可変リスト(変更可能)=arrayList、Array
    inmutableList(変更不可)=List
    		// 초기화 방법    
    		val array  = arrayOf(1,2,3)
        val list = listOf(1,2,3)
    
    		// 여러 타입 초기화 가능
        val array2 = arrayOf(1,"d",3.4f)
        val list2 = listOf(1,"d",3.4f)
    
        array[0] = 3 // 변경가능
        //list[0] = 2 // 리스트의 원소 변경 불가능, 읽기전용
        var result = list.get(1)
    
    		// 데이터 추가
        var arrayList = arrayListOf<Int>()
        arrayList.add(10)
        arrayList.add(20)
    6.繰り返し文
    6-1. For
    val students = arrayListOf("jaewon","sungmin","bubble","danchoo")
    
    for (name in students){
        println("${name}")
    }
    
    for((index,name) in students.withIndex()){
        println("${index+1}번째 학생 : ${name}")
    }
    
    for (i in 10 downTo 1){
        sum += i
    }
    
    for (i in 1 until  100){
        sum += i
    }
    6-2. While
    while (index < 10){
            println("index : ${index}")
            index++
    }
    7. Nullable/NonNull
    Javaはコンパイル時にNPEをキャプチャすることができず、実行時にのみNPEをチェックするため、実行時エラーが発生することが多い.
    コトリンでは、コンパイル時にnullチェックをするのがとても便利です!
    7-1. ? 演算子
  • null値を含む可能性がある変数を宣言した場合、typeの後に?貼り付け
  • var name : String = "jaewon"
    var nullName : String? = null
  • null値であるかどうかを確認するには、変数名の後にしますか?貼り付け
  • var nameInUperCase : String = name.toUpperCase()
    var NullNameUPerCase : String? = nullName?.toUpperCase()
    // nullName 변수가 null 값이면 'null'을 반환하고 null이 아니면
    // 메서드를 실행시킨다.  nullName 뒤에 ?가 붙지 않으면 컴파일오류
    7-2. ?: エルビス演算子
  • 変数がnullの場合、デフォルト値を指定したり、空の値を変換したりする関数の結果が生成されます.
  • val lastname : String? = null
    
    val fullname : String? = name+" "+(lastname?: "No lastName")
    val name1 : String? = lastname?: return
    val name2 : String? = lastname?: throw NullPointerException()
    7-3. !!
  • 宣言の値が絶対nullでない場合!!演算子として宣言した場合、null値を後でチェックする必要はありません.
  • fun ignoreNull(str : String?){
        val mNotNull : String = str!!
        val upper = mNotNull.toUpperCase()
    }
    strは空の値ではないことを保証するので、2番目の実行文では?書き間違えなくても起こりません.
    7-4. ?.
    セキュリティ処理用
  • null.nullでない場合は、右側の関数を実行するか、nullを返します.
  • val email : String? = "ashwon12"
        email?.let {
            println("my email is ${email}")
        }
    8. Class
  • javaとは異なり、ファイル名とクラス名は一致する必要はありません.
  • 8-1. クラスの作成
    class Person constructor(val name : String = "익명"){
        open fun eatingCake(){
            println("${name}이 말하길,,,케이크는 맛있다!")
        }
    }
    
    fun main(){
    		val person1 = Person("jaewon")
    		val person2 = Person()
    		person1.eatingCake()
    		person2.eatingCake()
    }
    
    /* 
    출력
    jaewon이 말하길,,, 케이크는 맛있다! 
    익명이 말하길,,, 케이크는 맛있다! 
    */
  • 基本ジェネレータは、クラス宣言の隣にあるconstructor()によって生成される.省略できます.かっこだけを書きます.
  • パラメータで渡された値はかっこの横の構造関数で直接生成され、値がなければ初期化値を書くことができます.
  • オブジェクトを生成する場合、Javaとは異なり、newを省略して書き出します.
  • 8-2. 親ジェネレータとinitジェネレータ
    class Person constructor(val name : String = "익명" ){
        init {
            println("주 생성자의 일부!, 객체 생성!")
    				println("person is ${name}")
        }
    
        constructor(name : String, age : Int) : this(name){
            println("my name is ${name}, age is ${age}")
        }
    }
    
    fun main(){
        val person = Person("jaewon")
        val person2 = Person()
        val sungmin = Person("sungmin",25)
    }
    
    /*
    출력
    주 생성자의 일부!, 객체 생성!
    person is jaewon
    주 생성자의 일부!, 객체 생성!
    person is 익명
    주 생성자의 일부!, 객체 생성!
    person is sungmin
    my name is sungmin, age is 25
    */
  • initジェネレータは、プライマリジェネレータが呼び出されるたびに呼び出されるジェネレータです.オブジェクトまたはサブクラスの作成者を呼び出すときに自動的に呼び出されます.
  • 部生成者が自主生成者に来るので、主生成者から受け取った値をthis()で伝達しなければならない.
  • 8-3. 継承と上書き
    open class Person constructor(val name : String = "익명"){
        init {
            println("주 생성자의 일부!, 객체 생성!")
        }
    
        open fun eatingCake(){
            println("${name}이 말하길,,,케이크는 맛있다!")
        }
    }
    
    class onePerson() : Person(){
        override fun eatingCake(){
            //super.eatingCake()
            println("${name}은 cake를 싫어해!")
        }
    }
    
    fun main(){
        val person = Person("jaewon")
        person.eatingCake()
    
        val person2 = onePerson()
        person2.eatingCake()
    }
    
    /*
    출력
    주 생성자의 일부!, 객체 생성!
    jaewon이 말하길,,,케이크는 맛있다!
    주 생성자의 일부!, 객체 생성!
    익명은 cake를 싫어해!
    */
    
  • コトリンではclassとmethodがfinalとして宣言されているため、openコマンドがなければ継承と上書きはできません.
  • 継承宣言方法class 자식클래스() : 부모클래스()