2. Kotlin 자료형

2020. 3. 2. 16:33소프트웨어 공학/코딩 공부

본 내용은 kotlinlang.org 공식 문헌과 기타 자료들을 바탕으로 필자가 학습한 내용을 정리한 것입니다.

필자의 허락 없이 글을 상업적 목적으로 인용, 수정, 재배포할 수 없습니다. 내용의 오류 지적은 덧글로 받습니다.

 

 

 


자료형의 종류

자료형(Data Type)은 프로그램이 다룰 수 있는 데이터의 종류를 구분한다. 아래는 Kotlin이 제공하는 자료형을 정리한 표이다.

형태 자료형 이름 크기 설명
정수 Byte 8 bits -128 (-2^7) ~ 127 (2^7-1) 범위 내 정수를 표현한다.
Short 16 bits -32768 (-2^15) ~ 32767 (2^15-1) 범위 내 정수를 표현한다.
Int 32 bits -2,147,483,648 ~ 2,147,483,647 범위 내 정수를 표현한다.
Long 64 bits -2^63 ~ 2^63-1 범위 내 정수를 표현한다.

실수 (부동소숫점)

Float 32 bits

표현 정확도는 Float의 경우 최대 10의 8승, 소수점 아래 6자리까지 보존되며, Double의 경우 최대 10의 11승, 소수점 아래 15자리까지 보존된다. 나머지 자릿수는 반올림 처리된다.

Double 64 bits
논리 Boolean 8 bits 논리 결과를 참 또는 거짓으로 표현한다.
문자 Char 16 bits UTF-16 단위로 한 문자를 표현한다.
String variable Char가 모여서 문자열을 표현한다.
배열 Array variable 한 자료형에 속하는 변수를 여러 개 저장할 수 있다.

 


상수 문자

변수에 값을 대입할 때 상수 문자(Literal Constant)을 사용한다. 자료형마다 작성 규칙이 있다.

/* 정수 리터럴 */
val integer = 1 // 정수만 쓰면 Int로 인식한다.
val autoLong = 3000000000 // Int 표현범위(2^31-1)보다 큰 값은 Long으로 인식한다.
val exLong = 1L // Long을 명시하려면 리터럴 끝에 L을 쓴다.
val asByte: Byte = 1 // 또는 변수 자료형을 Byte로 선언하고 대입해도 된다.

/* 실수 리터럴 */
val ordinary = 1.5732 // 실수만 쓰면 Double로 인식한다.
val exFl = 1.2f // Float를 명시하려면 f 또는 F를 쓴다.
val rounded = 1.675501332F // Float 형변환, 소수점 7자리 밑은 반올림된다. (1.6755013)
val avogadro = 6.022e23 // 부동소수점 표기법으로 아보가드로 수를 표현하였다.

/* 정수의 다른 표현 */
val hex = 0x0F // 16진수
val bin = 0b00001011 // 2진수 (바이너리)
val oct = ??? // 8진수 입력은 불가능하다.

 


원시 자료형

Kotlin이 Java와 극명한 차이를 보이는 부분은 바로 원시 자료형[각주:1]이다. 어떤 자료형이든지 객체로 볼 수 있다는 전제가 있기 때문에[각주:2], 원시 자료형 변수조차도 멤버 변수와 함수를 가질 수 있다!

 

형 변환

Kotlin은 정적 타입을 겨냥한 언어이다. 스마트 캐스팅, 사칙연산[각주:3] 등 몇 가지 경우를 제외하면, 형 변환(Type Casting)은 자동으로 일어나지 않는다. 필요하면 사용자가 직접 명시적으로 변환해야 한다.

/* 타입이 맞지 않으면 대입할 수 없다. */
val a: Short = 1
val b: Long = a // Error
/* 컴파일 성공 */
val a: Short = 1
val b: Long = a.toLong() // 명시적 형변환

숫자 자료형의 형변환 함수:

  • toByte(): Byte
  • toShort(): Short
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double
  • toChar(): Char

 

취급 주의

부동소수점 연산

정수 2개를 그냥 나누면 소수점을 무시하고 정수 값을 반환한다. 실수 범위를 계산하려면 정수와 실수, 또는 실수와 실수끼리 나누어야 한다. 만약 더 정확한 부동소수점 연산[각주:4]이 필요하면 BigDecimal을 사용해보자.

val mistake = 3 / 2       // 정수 연산
val correct = 3 / 2.toFloat()  // 부동소수점 연산, 2를 명시적으로 Float casting

println(mistake) // 출력: 1
println(correct) // 출력: 1.5

오버플로우

서로 다른 타입의 변수 2개를 사칙연산하면, 표현 범위가 큰 쪽으로 자동 형 변환된다. 하지만 같은 타입끼리 연산하면, 결과가 어떻게 됐든 형 변환은 일어나지 않는다. 만약 자신의 코드에서 사칙연산 결과 오버플로우가 발생한다면, 한쪽 변수를 더 큰 타입으로 바꾸어 해결할 수 있다.

실수 오버플로우는 실험해보지 않아서 잘 모르겠다. 잘 아는 사람은 알려주세요

meme

 

문자는 숫자가 아니다

Kotlin은 C언어와 다르게도 Char 자료형을 숫자와 비교할 수 없다. 하지만 간접적인 방법으로 Char를 캐스팅하면 된다.

/* 문자 c를 10진수로 변환하는 함수 */
fun toDecimal(c: Char): Int {
    if (c !in '0'..'9') {
        throw IllegalArgumentException("Out of range.")
    }
    return c.toInt() - '0'.toInt()
}

 


Nullable

자료형에 관계없이, 변수의 타입 끝에 ?가 붙지 않으면 Null 값을 절대 가질 수 없다.

val nullable: String? = "Hello notch!"
val notNull: String = "Hello world!"

nullable = null // OK
notNull = null // Error!

NullPointerException은 Java 언어에서 참조 자료형[각주:5]을 취급할 때 가장 흔히 발생하는 런타임 오류이다. Null 값이 존재할 수 있는 변수를 처리하는 것은 보통 귀찮은 일이 아니다. 하지만 Kotlin은 이 문제를 유연하게 처리한다. 다른 포스팅에서 다룰 예정입니다.

 

 

  1. Primitive type, 프로그래밍 언어가 기본적으로 제공하는 자료형이다. 원시 자료형의 연산은 기계어 수준에서 하나의 명령어로 끝나기 때문에 빠르다. [본문으로]
  2. 하지만 가상 머신은 런타임 과정에서 특정 데이터를 원시 자료형으로 해석하기도 한다. [본문으로]
  3. 자세한 내용은 추후에 새로 포스팅할 예정이다. [본문으로]
  4. Floating point arithmetic, 컴퓨터가 소수점을 처리하는 방식이다. [본문으로]
  5. Java에서 원시 자료형을 제외한 모든 타입을 일컫는다. e.g. String, Random, Object [본문으로]

'소프트웨어 공학 > 코딩 공부' 카테고리의 다른 글

3-3. Kotlin 클래스 추상화  (0) 2020.03.04
3-2. Kotlin 클래스 상속  (1) 2020.03.03
3-1. Kotlin 클래스 생성자  (0) 2020.03.03
3. Kotlin 클래스  (0) 2020.03.03
1. Kotlin 언어 개요  (2) 2020.03.02