개발일지/코틀린(Kotlin)

코틀린(Kotlin) - 2

이건나이스가아니야 2024. 4. 3. 22:51

디모의 코틀린 강좌 참고 (링크)

 

주석 (C++이랑 같음)

// , /* */

 

구문 종료시 세미콜론 불필요

 

명칭 작성은

- 클래스는 대문자 (eg: Person)

- 변수,함수명칭은 소문자 (eg: calculateRoute)

 

변수 선언 방법

- val: final 키워드와 동일함

- var: 선언 후 변경 가능 

일반 선언
    var a_1:Int // 아무것도 선언하지 않아도 됨 대신 warning 표시 뜸
    val a_2:Int // const라고해서 에러 뜨지 않음. final 같은 느낌. 첫 초기화 이후 변경 불가능
    a_1=1
    a_1=2
    a_2=1
    //a_2=2 불가능

 

기본 자료형

기본 자료형
    var b_1:Byte = 127 // -128~127
    var b_2:UByte = 255u // unsigned
    var b_3:Short = 32767
    var b_4:UShort = 65535u // unsigned
    var b_5:Int = 1 //정수 기본형
    var b_6:UInt = 1u // unsigned
    var b_7:Long = 1
    var b_8:ULong = 1u // unsigned
    var b_9:Float = 1f //
    //var b_10:UFloat =1uf // 구문오류 -> 실수형은 unsigned가 없다.
    //var b_11:Float = 1.0 // 구문오류 -> float 타입에 리터럴값을 입력시 f를 붙여야한다.
    //var b_12:Double = 1.0f // 구문오류 -> 실수의 기본형
    var b_13:Double = 1.0 //실수의 기본형
    var b_14:Boolean = true
    //var b_15:Boolean = 1 // 구문오류 -> 불리언에 정수 못박음

 

리터럴 숫자 표현법

리터럴 숫자 표현 방법
    var c_1:Int = 1234 // 기본 10진수
    //var c_2:Int = 1234L // 구문 오류 -> L은 8바이트 정수형을 의미 형이 맞지 않음.
    var c_3:Long = 1234L 
    var c_4:Int = 0x1af // 16진수 입력 가능
    var c_5:Int = -0b1011 // 2진수 가능하고 음수 가능
    var c_6:UInt = 0b1011u // 2진수 양수

 

문자열

문자열
    var d_1:Char ='ㅁ'
    //var d_2:String = 'ㅁ' + 'ㅂ' // 구문 오류 문자는 추가가 안됨
    var d_3:String ="ㅋㅋ " //
    var d_4:String ="\\n으로도 줄바꿈 가능 \nㅇㅇ 근데 직관적으로 보자면 세개 박고 넘어간다.\"\"\"" +
            """ 이런식으로
                작성해도 된다 ㅇㅋ?
            """

d_4 출력 결과

 

형변환

- 명시적 형변환

    //형변환
    var e_1:Int = 54321
    //var e_2:Long = e_1 // 불가능 형변환 필요!
    var e_3:Long = e_1.toLong()

 

배열

- 정적인 배열

    //배열
    var f_1 = arrayOf(1,2,3,4,5) //선언 방법 하나 값을 채우면서 생성
    var f_2 = arrayOfNulls<Int>(5) // 꺽쇄는 제네릭
    f_2[0] =2

 

타입 추론

- c++의 auto

    //타입 추론  -> auto 같은 느낌
    var g_1 = "asdf" // 이경우 String이라는 자료형이지만 생략해도 우측 변수의 자료형을 통해 추측한다.
    //var g_2 // 구문 에러 -> 추론할 대상이 없기 때문에
    var g_3 = 1234 // Int
    var g_4 = 1234L // Long
    var g_5 = 12.45 // double
    var g_6 = 12.45f // float
    var g_7 = 0xAA // Int
    var g_8 = 0b11 // Int
    var g_9 = true // Boolean
    var g_10 = 'C' // Char

 

함수

// 일반 함수 선언 - 반환이 없는 경우
fun println4String(str:String){
    println(str)
}
// 일반 함수 선언 - 반환이 있는 경우
fun add(a: Int, b: Int, c: Int): Long{
    return a.toLong()+b.toLong()+c.toLong()
}
//간단한 함수의 경우
fun add2(a: Int, b: Int, c: Int):Long=a.toLong()+b.toLong()+c.toLong()
//간단한 함수의 경우 반환형을 생략할 수 있다.
fun add3(a: Int, b: Int, c: Int)=a.toLong()+b.toLong()+c.toLong()

 

비교 연산

//일반적인 If문과 비교연산들
var h_1= 7
if(h_1>10)
    println("성공")
else if(h_1==7)
    println("같음")
else if(h_1!=-1)
    println("-1 체크")
else if(h_1>=7)
    println("크거나 같다")
else
    println("실패")
 h_1= 11
if(h_1>10)
    println("성공")
else
    println("실패")

 

보다시피 일반적으로 사용하던 연산들은 다 된다.

 

자료형 체크

//자료형 체크 is !is
var h_2 = 7
/*
if(h_2 is Long)
    println("h2는 Long에요")
else
    println("h2는 Int에요")
 */
if(h_2 is Int) //형이 맞아야만 동작한다.
    println("h2는 Long에요")
else
    println("h2는 Int에요")
/*
if(h_2.toInt().toLong() is Int) //형이 맞아야만 동작한다.
    println("h2는 Long에요")
else
    println("h2는 Int에요")
 */
/*
// 동작하지 않는 구문
if(h_2 is 7)
    println("h2는 Int에요")
 */

 

영상에서는 형변환이 된다고 하는데? 안된다. 뭐 그래도 좋다. Any라는 불특정타입을 이용해서 파라미터에 따라 특정 자료형에 대해서만 동작하도록 할 수 있었음

 

When = (C++)Switch

fun doWhen(srcVal:Any){
    when(srcVal){
        1 -> println("정수 1입니다.")
        "Dimo" -> println("Dimo의 코틀린 강좌입니다.")
        is Long -> println("Long 타입입니다.")
        !is String -> println("문자열이 아닙니다")
        else -> println("어떤 조건에도 만족하지 않습니다")
    }
}

fun doWhen2(srcVal:Any){
    var res =when(srcVal){
        1 -> "정수 1입니다."
        "Dimo" -> "Dimo의 코틀린 강좌입니다."
        is Long ->"Long 타입입니다."
        !is String -> "문자열이 아닙니다"
        else -> "어떤 조건에도 만족하지 않습니다"
    }
    println(res)
}

 

Any = auto 같은 역할을 한다.