프로그래밍/Kotlin

[코틀린 Kotilin] 기본 문법 정리( 원시 문자열, 문자열 템플릿, 엘비스(Elvis) 연산자, Any 타입, Null Check, let)

pupu91 2022. 10. 19. 16:00
반응형

 

- 클래스 정의 없이 파일 생성 가능

- 클래스명이 파일명과 달라도 됨

- main 함수 작성 시 (args: Array<String>) 생략해도 동작에 문제 없음

- 콘솔에 출력하기 위해 print 또는 println 사용

- 세미콜론을 찍어도 오류는 나지 않지만, kotlin에서는 사용하지 않는 것을 권장

- 한 줄에 여러 명령을 쓰기 위해서는 세미 콜론 필요(ex println("얼른 끝내고"); println("안드로이드 해야지"))

 

 

변수 선언

선언 형식 : val or var 변수명 [:타입] = 값
최초 선언 시에 타입이 결정되고 변수는 한 번 타입이 결정 되면 동일한 타입의 값만 담을 수 있음

 

(1) 선언 후 초기화 : 반드시 변수명 옆에 콜론을 구분자로 붙여 타입을 지정해야 함

var 변수명 : 타입
변수명 = 값

ex)
var age:Int
agd = 20

 

 

(2) 선언과 동시에 초기화 : 타입이 생략 되어도 타입을 추론해서 자동으로 인식

var 변수명 = 값

ex)
var name = "둘리"
var age = 3

 

 

 

시 문자열과 문자열 템플릿

(1) 원시 문자열

      : """ """ 사용하면 문자열 안에 엔터, 스페이스,탭, 이스케이프 문자 사용 가능

fun main(args: Array<String>) {

    /* 일반 문자열 사용 */
    var str = "일반 문자열 안에는 \n\n문자열 안에 엔터나 스 페 이 스\t그리고 탭을 자유롭게 사용할 수 있으며\n" +
            "이스케이프 문자 사용도\n 가능하다"
    /* RawString 사용 */
    var raw = """원시 문자열 안에서는

	문자열 안에 엔터나 스 페 이 스 그리고 탭을 자유롭게 사용할 수 있으며
	이스케이프 문자 사용도
	가능하다"""
}

 

 

 

(2) 문자열 템플릿

      : 문자열 안에서 '$' (문자열 템플릿)을 활용해서 변수의 값을 바로 적용할 수 있음

fun main(args: Array<String>) {
  
  	var num1 = 10
    var num2 = 20
    
    var strWithNum = "Hello, $num1"
    println(strWithNum)
}

출력 결과
Hello, 10

 

 

: 문자열 템플릿을 활용할 때 $에 { }를 쓰면 표현식(연산 결과나 속성 값)을 쓸 수 있음

fun main(args: Array<String>) {
	
    var str2 = "\n\t Hello \t\n"
     
    var trimStr = "trimStr : $str2.trim()" //사용불가
    
    var trimStr = "trimStr : ${str2.trim()}" //{}사용하기
    println(trimStr)

    var sum = "sum : ${num1 + num2}"
    println(sum)

}

 

 

타입의 종류와 저장 가능 크기

fun main(args: Array<String>) {

    println("정수형 값의 최소/최대값")
    println("Byte min : ${Byte.MIN_VALUE} max : ${Byte.MAX_VALUE}")
    println("Short min : ${Short.MIN_VALUE} max : ${Short.MAX_VALUE}")
    println("Int min : ${Int.MIN_VALUE} max : ${Int.MAX_VALUE}")
    println("Long min : ${Long.MIN_VALUE} max : ${Long.MAX_VALUE}")

    println("실수형 값의 최소/최대값")
    println("Float min : ${Float.MIN_VALUE} max : ${Float.MAX_VALUE}")
    println("Double min : ${Double.MIN_VALUE} max : ${Double.MAX_VALUE}")

    println("문자형 값의 최소/최대값")
    println("Char min : ${Char.MIN_VALUE.code} max : ${Char.MAX_VALUE.code}")

    println("논리형 값의 최소/최대값")
    //println("Boolean : ${Boolean.MIN_VALUE} max : ${Boolean.MAX_VALUE}")
    // 에러 : 논리형은 저장 크기를 따로 알 수 없다
}

 

 

명시적 형변환

: 코틀린에서는 자동형변환이 적용되지 않으므로 명시적 형변환을 해주어야 함

fun main(args: Array<String>) {

    var byteValue: Byte = 65
    println(byteValue)

    /* Int, Short, Long, Float, Double 타입으로 각각 변환하는 메서드 호출 */
    var intValue: Int = byteValue.toInt()
    println(intValue)

    var shortValue: Short = byteValue.toShort()
    println(shortValue)

    var longValue: Long = byteValue.toLong()
    println(longValue)

    var floatValue: Float = byteValue.toFloat()
    println(floatValue)

    var doubleValue: Double = byteValue.toDouble()
    println(doubleValue)

    /* Char 타입으로 변환 */
    //var charValue: Char = byteValue.toChar()
    var charValue: Char = byteValue.toInt().toChar()
    println(charValue)

    /* 문자열을 기본 타입으로 변환 */
    var intString: String = "1234"
    var doubleString: String = "1.234"

    var stringToInt: Int = intString.toInt()
    var stringToDouble: Double = doubleString.toDouble()

    println(stringToInt)
    println(stringToDouble)

    var booleanString: String = "true"
    var stringToBoolean: Boolean = booleanString.toBoolean()
    println(stringToBoolean)

    /* 기본 타입을 문자열로 변환 */
    var num: Int = 123
    var intToString: String = num.toString()
    println(num)

    var wrongNumberString: String = "문자열"
    //var wrong: Int = wrongNumberString.toInt()
    /* 어떤 타입이던 뒤에 물음표를 붙이면 null 참조를 저장할 수 있다.
    * 코틀린에서는 null 체크를 위한 다양한 도구를 제공하는데
    * 여기서 사용한 물음표의 의미는 null이 될 수 있는 타입 확장이다. */
    var wrong: Int? = wrongNumberString.toIntOrNull()   //숫자로 변환하거나 실패할 경우 null 반환
    println(wrong)
}

 

 

반응형

Any 타입

: 모든 타입의 값을 대입할 수 있는 최상위 타입

  Any 타입의 변수에는 초기화 이후에도 어떤 종류의 값이든 대입 가능

fun main(args: Array<String>) {

    var anyValue: Any

    anyValue = 100
    // ::class.simpleName으로 코틀린의 타입을 확인할 수 있다 (::class => .getClass())
    println(anyValue::class.simpleName)

    anyValue = "Hello"
    println(anyValue::class.simpleName)

    anyValue = 1.234
    println(anyValue::class.simpleName)

    /* Any 타입 배열을 선언하면 모든 종류의 값을 저장할 수 있음 */
    var anyTypeArr: Array<Any> = arrayOf(1, 1.234, "Hello")
}

 

 

 

null 값 대입을 허용하는 타입으로 선언

   /* 기본적으로 null 값 대입을 허용하지 않는 타입(Int)으로 선언 */
    var num = 100
    /* null값 대입 불가 */
    //num = null

    /* null을 대입 받을 수 있는 Int? 타입의 변수 선언 */
    var a: Int? = 100
    /* null값 대입 가능 */
    a = null

 

 

 

Null Check

Null값이 입력 불가능한 타입은 바로 호출해도 되지만 Nullable한 타입은 호출 시 Null Check가 필요 

 

(1) let 함수를 이용한 null 타입 값 접근

let 함수 : 범위 함수로서 변수의 값이 null이 아닌 경우에 실행할 코드 블럭을 작성할 수 있게 도와주는 함수

  var c: String? = null
    c?.let {
        println(it.length)
    }
// it: value-parameter로 c가 null이 아닌 경우 c를 의미

출력 결과
null

 

 

 

(2) 안전호출 연산자(Safe-call Operator)를 이용하는 방법

'?' 와 ' . '을 붙여 null 일 경우 변수 값에 접근하지 않고 바로 null값을 반환 함

    var len: Int? = c?.length
    println(len)

출력 결과
null

 

 

(3) 엘비스(Elvis) 연산자(?:)를 이용하는 방법

연산자 왼쪽의 피연산자가 null이 아닐 경우 해당 값을 반환하고 null일 경우 오른쪽 피연산자를 반환 함

    var one = null ?: 1
    println(one)

    var two = 2 ?: 1
    println(two)

    var result = c?.length ?: 0
    println(result)

출력 결과
1
2
0

 

 

(4) ' !! ' 를 사용하는 방법

null 값이 아님을 보장하는 연산자(!!)를 사용해 null을 허용하지 않는 타입으로 변환

 var nullableStr: String? = null
 
//null을 가질 수 없는 타입이기 때문에 컴파일 에러 발생
//var str: String = nullableStr

//!!연산자를 이용하여 타입을 null 불가능한 타입으로 변경할 수 있지만
//여기에서는 컴파일 에러를 런타임 에러로 변경한 것 뿐으로 NPE이 발생한다
//var str: String = nullableStr!!

var nullableString2: String? = "Hello"
var str: String = nullableString2!!
println(str.length)     //String 타입은 속성에 별도의 연산자를 사용하지 않아도 안전하게 접근 가능

출력결과
5

 

 

(5) null을 반환하는 타입 변환 메소드

null을 허용하는 타입 ' ? ' toIntOrNull()을 형변환 실패시에는 null을 반환 받을 수 있도록 작성할 수 있음

var wrongNumberString = "숫자아님";
var wrong: Int? = wrongNumberString.toIntOrNull()
println(wrong)

출력결과
null
반응형