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은 정적 타입을 겨냥한 언어이다. 스마트 캐스팅, 사칙연산 등 몇 가지 경우를 제외하면, 형 변환(Type Casting)은 자동으로 일어나지 않는다. 필요하면 사용자가 직접 명시적으로 변환해야 한다. 3
/* 타입이 맞지 않으면 대입할 수 없다. */
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개를 그냥 나누면 소수점을 무시하고 정수 값을 반환한다. 실수 범위를 계산하려면 정수와 실수, 또는 실수와 실수끼리 나누어야 한다. 만약 더 정확한 부동소수점 연산이 필요하면 BigDecimal을 사용해보자. 4
val mistake = 3 / 2 // 정수 연산
val correct = 3 / 2.toFloat() // 부동소수점 연산, 2를 명시적으로 Float casting
println(mistake) // 출력: 1
println(correct) // 출력: 1.5
오버플로우
서로 다른 타입의 변수 2개를 사칙연산하면, 표현 범위가 큰 쪽으로 자동 형 변환된다. 하지만 같은 타입끼리 연산하면, 결과가 어떻게 됐든 형 변환은 일어나지 않는다. 만약 자신의 코드에서 사칙연산 결과 오버플로우가 발생한다면, 한쪽 변수를 더 큰 타입으로 바꾸어 해결할 수 있다.
실수 오버플로우는 실험해보지 않아서 잘 모르겠다. 잘 아는 사람은 알려주세요
문자는 숫자가 아니다
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 언어에서 참조 자료형을 취급할 때 가장 흔히 발생하는 런타임 오류이다. Null 값이 존재할 수 있는 변수를 처리하는 것은 보통 귀찮은 일이 아니다. 하지만 Kotlin은 이 문제를 유연하게 처리한다. 5 다른 포스팅에서 다룰 예정입니다.
- Primitive type, 프로그래밍 언어가 기본적으로 제공하는 자료형이다. 원시 자료형의 연산은 기계어 수준에서 하나의 명령어로 끝나기 때문에 빠르다. [본문으로]
- 하지만 가상 머신은 런타임 과정에서 특정 데이터를 원시 자료형으로 해석하기도 한다. [본문으로]
- 자세한 내용은 추후에 새로 포스팅할 예정이다. [본문으로]
- Floating point arithmetic, 컴퓨터가 소수점을 처리하는 방식이다. [본문으로]
- 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 |