본문 바로가기
쿤즈 Dev/Kotlin

[Kotlin] 코틀린 자료형 알아보기

by :)Koon 2022. 5. 3.

지난 포스팅에서 코틀린의 변수에 대해서 알아보았습니다.

2022.05.01 - [쿤즈 Dev/Kotlin] - [Kotlin] 코틀린 변수의 종류와 사용방법

 

[Kotlin] 코틀린 변수의 종류와 사용방법

지난 포스팅에서 intelliJ를 이용해서 코틀린 프로젝트를 생성하는 방법을 알아보았습니다. 2022.04.30 - [쿤즈 Dev/Kotlin] - [Kotlin] 프로젝트 만들기 (feat. Hello Kotlin) [Kotlin] 프로젝트 만들기 (feat. H..

koonsland.tistory.com

변경이 가능한 변수와 변경이 불가능한 변수가 있었어요. 그리고 변수를 선언하는 방법까지 알아보았습니다.

이번 포스팅에서는 변수 선언 시 함께 사용했던 자료형에 대해서 알아볼게요.


코틀린의 자료형은 참조형 자료형

자바에서는 기본형 자료형과 참조형 자료형이 있습니다. 예를 들면 기본형 자료형은 int, short, float, double과 같은 자료형입니다. 이 자료형들은 메모리의 스택 영역에 값이 바로 저장되는 자료형입니다. 이 외에 참조형 자료형은 C언어의 포인터와 비슷한 개념입니다.

2020.10.31 - [쿤즈 Dev/C] - [C언어] C언어의 꽃. 포인터를 알아보자!

 

[C언어] C언어의 꽃. 포인터를 알아보자!

그동안 C언어를 포스팅 해 오면서 키워드와 식별자, 변수와 상수, 제어문과 반복문, 배열을 차례대로 알아보았습니다. 그리고 많아 분들이 포기하는 부분중 하나인 포인터를 포스팅하려 합니다.

koonsland.tistory.com

참조형 자료형은 new 연산자를 이용해서 만드는 자료형이며 Integer, String, Date와 같은 자료형들입니다. 이러한 자료형들은 변수에 주소를 가지고 있습니다. 이 변수들은 스택에 저장되고 값은 주소를 저장합니다. 실제 값은 힙 영역에 저장되고 이 영역의 주소가 변수에 저장되는 것입니다.

 

자바에서는 두 자료형 모두를 사용 가능하지만 코틀린에서는 참조형 자료형만 사용 가능합니다. 그리고 컴파일 과정에서 코틀린의 컴파일러가 참조형 자료형을 기본형 자료형으로 대체하여 최적화를 진행합니다. 그래서 별도의 최적화는 고려하지 않아도 됩니다.


코틀린 참조형 자료형의 종류

코틀린에서 사용하는 참조형 자료형은 무엇이 있을까요? 코틀린에는 아래와 같은 자료형들이 있습니다.

  • 정수형 자료형 (Byte, Short, Int, Long)
  • 부호 없는 정수형 자료형 (UByte, UShort, UInt, ULong)
  • 실수 자료형 (Float, Double)
  • 논리 자료형 (Boolean)
  • 문자 자료형 (Char)
  • 문자열 자료형 (String)

그럼 자료형들을 하나씩 자세하게 알아볼게요.


정수형 자료형 (Byte, Short, Int, Long)

정수형 자료형에는 4가지 종류가 있습니다. 크기 순서대로 Byte, Short, Int, Long입니다. 각 자료형은 아래와 같은 크기를 가집니다.

자료형 크기 범위
Byte 1바이트(8비트) -2^7 ~ 2^7 - 1
Short 2바이트(16비트) -2^15 ~ 2^15 - 1
Int 4바이트(32비트) -2^31 ~ 2^31 - 1
Long 8바이트(64비트) -2^63 ~ 2^63 - 1

이러한 자료형들은 변수를 선언할 때 사용할 수 있습니다. 예를들어 보겠습니다.

package `02`

fun main(args: Array<String>) {
    val int1 = 127 // 범위는 Byte 자료형이지만 Int 형으로 추론
    val int2 = -32768 // 범위는 Short 자료형이지만 Int 형으로 추론
    val int3 = 123456 // Int 형으로 추론
    val long1 = 2147483648 // Long 형으로 추론
    val long2 = 123L // Long 형으로 추론
    val byte1: Byte = 127 // Byte 형으로 명시적 지정
    val short1: Short = 32767 // Short 형으로 명시적 지정
}

숫자를 자료형 없이 선언하는 경우는 대부분 Int 자료형으로 추론됩니다. 범위가 벗어나면 Long으로 자동 추론됩니다. 그래서 Byte형이나 Short형으로 사용하고 싶은 경우에는 반드시 자료형을 명시해야 합니다.


부호가 없는 정수형 자료형 (UByte, UShort, UInt, ULong)

부호가 없는 정수형이란 음의 부호를 사용하지 않는 경우입니다. 그래서 양수형 범위만을 표현하고 자료형 앞에 U를 붙여줍니다. U의 뜻은 unsinged의 앞글자 U를 의미합니다. 그렇다면 부호가 없는 정수형 자료형의 이점은 무엇일까요? 음의 정수가 없기 때문에 더 많은 값을 담을 수 있습니다. 각 자료형의 크기를 알아볼게요.

자료형 크기 범위
UByte 1바이트(8비트) 0 ~ 2^8 - 1
UShort 2바이트(16비트) 0 ~ 2^16 - 1
UInt 4바이트(32비트) 0 ~ 2^32 - 1
ULong 8바이트(64비트) 0 ~ 2^64 - 1

이러한 자료형들을 어떻게 사용하는지 예를들어 보겠습니다.

package `02`

fun main(args: Array<String>) {
    val ubyte: UByte = 128u
    val ushort: UShort = 65000u
    val uint: UInt = 343u
    val ulong: ULong = 3234156u
}

부호가 없는 정수형을 표현하고 싶을경우에는 반드시 자료형을 넣어주고 뒤에 u라고 명시해줍니다. 만약 명시해주고 자료형을 넣지 않으면 값이 할당되지 않습니다.


실수 자료형 (Double, Float)

실수 자료형은 말 그대로 실수입니다. 두 자료형의 크기를 알아볼게요.

자료형 크기 범위
Float 4바이트(32비트) 1.4E-45 ~ 3.4E38
Double 8바이트(64비트) 4.9E-324 ~ 1.7E308

수의 범위를 표현하는 방법을 간단하게 알아볼게요. 컴퓨터에서 실수는 부동소수점으로 표현합니다. 부동소수점은 실수를 가수부와 지수부로 나눠서 표현합니다. 예를 들어 볼게요.

3.14라는 숫자가 있습니다. 만약 0.314는 어떻게 표현할까요? 0.314는 3.14에서 소수점이 왼쪽으로 한자리만 움직이면 됩니다. 그래서 표현은 3.14E-1로 표현할 수 있습니다. 그럼 314는 어떻게 표현할까요? 3.14에서 소수점이 오른쪽으로 두 자리가 움직여야 합니다. 그래서 표현은 3.14E+2로 표현하지만 +기호는 생략합니다. 따라서 3.14E2로 표현할 수 있습니다.

 

부동소수점은 이 하나만으로도 많은 것들을 설명할 수 있으니 간단히 이렇게만 보고 넘어갈게요. 다음에 부동소수점으로만 포스팅을 하나 더 만들어 볼게요.

 

코틀린은 자료형을 명시하지 않으면 추론에 의해서 자료형이 정해집니다. 정수의 경우 Int로 자동으로 추론됩니다. 마찬가지로 실수의 경우는 Double로 자동 추론 됩니다. 소스코드로 예를 들어볼게요.

package `02`

fun main(args: Array<String>) {
    val double1 = Double.MAX_VALUE // Double로 자동 추론
    val float1: Float = Float.MAX_VALUE // Float로 명시

    println("double1: $double1")
    println("float1: $float1")
}

결과는 이렇습니다.

double1: 1.7976931348623157E308
float1: 3.4028235E38

부동소수점 표현방식으로 표현된 것을 볼 수 있습니다.


논리 자료형 (Boolean)

논리 자료형은 참, 거짓을 표현하는 자료형입니다. 그래서 값은 true 또는 false가 저장됩니다.

자료형 크기 범위
Boolean 1비트 true, false

논리 자료형은 하나뿐이기 때문에 true, false로 대입시 자동으로 Boolean으로 추론됩니다.

package `02`

fun main(args: Array<String>) {
    val bool1 = true // Boolean으로 추론
    val bool2: Boolean = false // Boolean으로 명시

    println("bool1: $bool1")
    println("bool2: $bool2")
}

문자 자료형 (Char)

문자 자료형은 이름 그대로 문자를 저장하는 자료형입니다. Character의 앞글자를 따서 Char 자료형이라 할 수 있습니다. 문자는 작은따옴표(')를 통해서 문자로 표기할 수 있습니다.

자료형 크기 범위
Char 2바이트(16비트) 0 ~ 2^15 - 1

문자는 한 글자에 2바이트를 가집니다. 컴퓨터가 문자를 저장하는 것에 대해서는 아스키코드를 조금 더 알 필요가 있습니다.

아스키코드 위키: https://namu.wiki/w/아스키%20코드

아스키코드에 관련해서도 다른 포스팅에서 조금 더 알아볼게요.

package `02`

fun main(args: Array<String>) {
    val char1 = 'a'
    var char2: Char = 'B'

    println("char1: $char1")
    println("char2: $char2")
}

문자는 반드시 한 글자씩만 저장할 수 있습니다. 그렇다면 문자열은 어떻게 저장할 수 있을까요? 문자열은 문자들의 집합입니다. 다만 조금 다른 게 배열의 형태로 저장하게 되는데요. 배열은 추후에 다시 알아보고 문자열을 저장하는 자료형부터 보도로 하겠습니다.


문자열 자료형 (String)

문자열 자료형은 문자열을 저장하는 자료형입니다. 그리고 문자열은 큰 따옴표(")를 통해서 문자로 표기할 수 있습니다. 예를 들어 볼게요.

package `02`

fun main(args: Array<String>) {
    val str1 = "Kotlin"
    val str2: String = "World!"
    
    println("$str1 $str2")
}

위 소스와 같이 문자열을 저장할 수 있습니다. 문자열이라는 표시로 큰 따옴표(")를 이용하면 자료형을 명시하지 않을 경우에는 자동으로 String 자료형으로 추론됩니다. 그리고 println() 내부에 변수의 값을 표현하는 방법은 $를 이용하는 것입니다.


지금까지 코틀린에서 사용하는 자료형에 대해서 알아보았습니다. 정수형(Byte, Short, Int, Long), 실수형(Float, Double), 논리형(Boolean), 문자형(Char), 문자열(String)이 있었습니다. 이제 각 변수들을 선언하고 필요한 자료형들을 모두 알아보았어요. 다음 포스팅에서는 자료형이 제대로 선언되었는지, 혹은 자료형과 값이 제대로 할당되었는지를 검사하는 방법을 알아보겠습니다. 도움이 되셨으면 합니다. 이상입니다.

댓글