본문 바로가기
프로그래밍/kotlin

[kotlin] 코틀린 차곡차곡- 1. 코틀린의 변수와 타입

by 사바라다 2021. 5. 31.

안녕하세요. 오늘은 여러분들과 함께 코틀린(kotlin)에서 변수를 선언하고 사용하는 방법에 대해서 알아보는 시간을 가져보고자 합니다.

코틀린의 필드와 변수

코틀린에서 기본적으로 필드와 변수를 선언하는 방법은 아래와 같습니다.

  • 키워드(keyword) - 키워드는 변수 선언시 해당 변수가 변경가능 한지 여부를 결정하는 키워드입니다. 해당 값은 필수 값입니다.별도로 부르는 다른 말은 없는것으로 확인됩니다. kotlinlang_basic-syntax
    • val - 변경 불가능한(immutagble)한 변수로 지정하는 키워드입니다. 한번 할당하면 변경하지 못하는 특성을 가집니다.
    • var - 변경 가능한(mutable)한 변수로 지정하는 키워드입니다. 할당 된 값을 가능한 영역안에서 언제라도 변경할 수 있는 특성을 가집니다.
  • 변수 이름 - 키워드 다음에는 한칸을 띄우고 변수 이름을 가집니다. 해당 변수이름을 통해 개발자는 변수에 접근할 수 있습니다.
  • 변수 타입 - 변수 이름 뒤에는 : 을 붙이며 띄운 후 해당 변수의 타입을 지정합니다. 코틀린은 타입 추론(type inference)을 언어 차원에서 지원해주고 있습니다. 따라서 초기화 값이 있고 충분히 추론 할 수 있는 값에 대해서는 변수 타입은 선택 사항(Optional)입니다.
  • 초기화 값 - 변수는 선언과 동시에 초기화 해줄 수 있습니다. 해당값을 통해 변수 타입 추론가 이루어질 수 있습니다.
val name: String = "SABARADA"
print(name)

코틀린에서는 타입 추론을 지원하지만 일반적으로 명시적으로 타입을 지정하여 사용하는것을 개인 또는 팀의 컨벤션으로 가져가는 것이 맞을 것으로 보입니다. 왜냐하면 타입을 지정하면 코틀린이 추론한 타입과 사용하는 사람이 생각하는 추론 타입이 같은지 코딩 도중 검사가 됩니다. 따라서 만약 초기화 값이 function 이며 이 반환해주는 값이 변경되어 영향을 받았지만 타입추론으로 인하여 문제 없음으로 판단되지만 사실은 문제가 있는 불일치의 경우가 발생할 수 있을것으로 보입니다.

변수 키워드는 웬만하면 var보다는 val을 사용하는 것을 추천드립니다. 변수 변경가능성이 있다는 것은 해당 참조하는 대상이 변할 수 있다는 말이며 로직에 따라 이 값이 예상하지 못하는 경우가 생길 수 있다는 뜻입니다. 만약 val을 사용한다면 초기화한 값이 아무리 어려운 비즈니스 로직을 거치더라도 처음 초기화한 그 값을 가리키고 있다는 것을 확신할 수 있습니다. var은 변경 가능성이 있기때문에 이를 확신하지 못합니다.

코틀린의 타입

두번째로 코틀린 타입에 대해서 알아보도록 하겠습니다. 기본적으로 코틀린은 모든것이 객체입니다. 즉, java와는 다르게 원시 타입(primitive type)을 코딩할때 사용하지 않습니다. 컴파일 된 후 실제로 runtime 중에는 원시 타입이 사용됩니다. 즉, 코틀린으로 코딩할 때는 원시타입과 참조타입을 구분해서 사용할 필요는 없습니다.

Number Type

숫자를 표현하는 타입은 정수를 표현하는 타입과 소수까지 포현할 수 있는 Type 2가지가 있습니다.

아래 이미지는 정수를 표현할 수 있는 데이터 타입입니다.

val one: Int = 1
val threeBillion: Long = 3000000000
val oneLong: Long = 1L
val oneByte: Byte = 1

그리고 아래는 소수까지 표현할 수 있는 데이터 타입입니다.

val pi: Double = 3.14
val eFloat: Float = 2.718f

위 처럼 숫자를 표현하는 타입들은 기본적으로 JVM의 런타임상에서 원시 타입으로 변환되어 동작되게 됩니다. 하지만 예외적으로 참조 타입으로 변환되어 사용될 때가 있습니다.바로 Int? 과 같이 nullable로 선언했을 때입니다. 코틀린은 변수를 선언할 때 null을 허용한다면 ?를 이용하여 표현하도록 되어있습니다. 이에 관련해서는 추후에 다시 알아보도록 하겠습니다.

코틀린은 기존 Java와는 다르게 unsigned Type을 지원하려고 하고 있습니다. unsigned Type이란 음수값을 가지지 않는 타입이며 해당 타입리스트는 아래와 같습니다. 하지만 아직은 베타 버전이고 사용하기 위해서는 function에 @OptIn(ExperimentalUnsignedTypes::class)을 선언해야하고 실행할때도 -Xopt-in=kotlin.RequiresOptIn를 선언해주어야하는등 아직 안정적(stable)하지는 않다고 합니다.

  • UByte: 8-bit 양수, 범위 0 ~ 255
  • UShort: 16-bit 양수, 범위 0 ~ 65535
  • UInt: 32-bit 양수, 범위 0 ~ 2^32 - 1
  • ULong: 64-bit 양수, 범위 0 ~ 2^64 - 1

Booleans

Boolean 타입은 참 또는 거짓을 나타내는 변수 타입입니다.

  • || – OR 로직
  • && – AND 로직
  • ! - Not 로직

|| 과 && 는 Lazy Evaluation으로 전개됩니다. Lazy Evaluation 관련해서는 [Java] Java와 Lazy Evaluation을 참고해주시면 됩니다.

val myTrue: Boolean = true
val myFalse: Boolean = false

Characters

Char 타입은 문자 1개를 나타내는 변수 타입입니다. String 객체의 내부는 Char의 배열로 되어있습니다. 단일로는 아래와 같이 사용합니다.

val aChar: Char = 'a'

Strings

String 타입은 문자열을 나타내는 타입입니다. 기본적으로 아래와 같이 사용할 수 있습니다. 또한 String 타입은 변경불가능한 타입입니다. 따라서 값을 수정하거나 할 수 없고 값을 변경한다는 것은 새롭게 할당하는 것입니다.

val str: String = "abcd 123"

val str = "abcd"
println(str.uppercase()) // "ABCD"
println(str) // "abcd"

또한 String의 각 문자들은 배열의 형태로 접근하여 가져올 수 있습니다.

val str: String = "abcd 123"
print(str[0]) // 'a'

Arrays

코틀린에서 배열은 Array 클래스를 통해 표현되어집니다. arrayof() 함수를 이용하여 배열을 선언할 수 있으며 [] 또는 get / set 함수를 이용하여 접근할 수 있습니다.

val array: Array<Int> = arrayOf(1, 2, 3)
array[1] = 4
print(array[0]) // 1
print(array.get(1)) // 4
array.set(2, 5)
print(array.get(2)) // 5

추가로 원시타입 배열이 있습니다. 배열은 Int, Long 처럼의 값을 사용하여 순회하면 boxing 현상으로 인해 메모리 누수 및 오버헤드가 추가적으로 발생할 가능성이 있습니다. 따라서 이런 현상을 제거하기 위해 처음부터 원시타입으로 배열을 선언하여 사용하는 것입니다. ByteArray, ShortArray, IntArray 가 있으며 아래와 같이 사용할 수 있습니다.

val arr = IntArray(5) // [0, 0, 0, 0, 0]
val arr = IntArray(5) { 42 } // [42, 42, 42, 42, 42]
var arr = IntArray(5) { it * 1 } // [0, 1, 2, 3, 4]

마무리

오늘은 이렇게 코틀린의 변수와 타입에 대한 이야기를 해보았습니다.

다음 시간에는 코틀린에서 function에 대해서 알아보는 시간을 가져보도록 하겠습니다.

감사합니다.

참조

코틀린 인 액션 (Kotlin In Action)

코틀린을 다루는 기술 (The Joy Of Kotlin)

kotlinlang_basic-types

댓글