val username = "Kildong" // 자료형을 추론하여 String 으로 결정
var username // 자료형을 지정하지 않은 변수는 사용할 수 없음.
val init: Int // 사용 전 혹은 생성자 시점에서 init 변수를 초기화 해야 함.
val number = 10 // number 변수는 Int 형으로 추론
여기서 주의할 점은, var username과 같이 자료형을 지정하지 않은 변수는 사용할 수 없다는 점이다. 다음과 같이 끊어서도 사용할 수도 없다.
var username
username = "Kildong" // Compile Error!
변수 이름 생성 규칙
변수 이름은 123abc 와 같이 숫자로 시작하면 안 된다.
변수 이름에는 while, if 와 같이 코틀린에서 사용되는 키워드는 사용할 수 없다.
변수 이름은 의미 있는 단어를 사용하여 만드는 것이 좋다.
여러 단어를 사용하여 변수 이름을 지을 경우, 카멜 표기법(Camel Expression)을 사용하라.
클래스, 인터페이스 등은 쌍봉 낙타 혹은 파스칼 표기법(Pascal Expression)을 사용한다.
AnimalCategory
CarEngine
자료형 알아보기
기본형(Primitive Data Type)
가공되지 않은 순수한 자료형으로 프로그래밍 언어에 내장
int, long, float, double등
참조형(Reference Type)
동적 공간에 데이터를 둔 다음 이것을 참조하는 자료형
Int, Long, Float, Double 등
당연히 기본형이 성능이 더 좋다! 코틀린에서는 참조형만 사용하도록 하고 있는데, 사용 시 컴파일 과정에서 기본형으로 변환된다. 코틀린에서는 참조형을 선언해서 사용하지만, 컴파일 과정을 거치면 기본형 같이 사용한다.
기본형과 참조형의 동작 원리 이해하기
자바의 기본형과 참조형의 원리
int a = 77; // 기본형
Person person = new Person(); // 객체 참조형으로, person 객체를 위해 참조 주소(A12)를 가진다.
이미지 출처 : 코틀린 프로그래밍 기본 1 (부스트코스)
기본형 자료형은 스택(Stack) 영역에 쌓이게 되고, 참조형 자료형은 힙(Heap) 영역에 쌓이게 된다. 정적 자료형은 스택에, 동적 자료형은 힙에 쌓인다는 것을 기억하자!
코틀린에서는 코딩 시 참조형만 사용되며, 코틀린 컴파일러가 자동적으로 최적화한다.
컴파일 과정을 거친 후 기본형이 사용된다.
정수 자료형
음수가 사용되는 부호 있는정수 자료형
형식
자료형
크기
값의 범위
정수 자료형
Long
8 Bytes (64 Bits)
$-2^{63} ~ 2^{63}-1$
Int
4 Bytes (32 Bits)
$-2^{31} ~ 2^{31}-1$
Short
2 Bytes (16 Bits)
$-2^{15} ~ 2^{15}-1(-32,768~ 32,767)$
Byte
1 Byte (8 Bits)
$-2^{7} ~ 2^{7}-1(-128 ~ 127)$
부호 없는정수 자료형 (1.3버전 실험적)
형식
자료형
크기
값의 범위
부호 없는 정수형
ULong
8 Bytes (64 Bits)
$0 ~ 2^{64}-1$
UInt
4 Bytes (32 Bits)
$0 ~ 2^{32}-1$
UShort
2 Bytes (16 Bits)
$0 ~ 2^{16}-1(0 ~ 65,535)$
UByte
1 Byte (8 Bits)
$0 ~2^{8}-1(0 ~ 255)$
코틀린의 정수 자료형은 부호가 있는 것과 부호가 없는 것으로 나눌 수 있다.
숫자 크기에 상관 없이 기본은 모두 Int 형으로 추론된다.
자료형 사용 예
자료형 생략
val num05 = 127 // Int 형으로 추론
val num06 = -32768 // Int 형으로 추론
val num07 = 2147483647 // Int 형으로 추론
val num08 = 9223372036854775807 // Long 형으로 추론
접미사, 접두사 사용
val exp01 = 123 // Int 형으로 추론
val exp02 = 123L // 접미사 L을 사용해 Long 형으로 추론
val exp03 = 0x0F // 접두사 0x를 사용해 16진 표기가 사용된 Int 형으로 추론
val exp04 = 0b00001011 // 접두사 0b를 사용해 2진 표기가 사용된 Int 형으로 추론
작은 값의 사용
val exp08: Byte = 127 // 명시적으로 자료형을 지정 (Byte)
val exp09 = 32767 // 명시적으로 자료형을 지정하지 않으면 Short 형 범위의 값도 Int 형으로 추론
val exp10: Short = 32767 // 명시적으로 자료형을 지정 (Short)
부호 없는 정수 자료형
val uint: UInt = 153u
val ushort: UShort = 65535u
val ulong: ULong = 46322342uL
val ubyte: UByte = 255u
큰 수를 읽기 쉽게 하는 방법 (가독성 향상)
읽기 쉽게 하기 위해 언더 스코어(_)를 포함해 표현
val number = 1_000_000
val cardNum = 1234_1234_1234_1234L
val hexVal = 0xAB_CD_EF_12
val bytes = 0b1101_0010
실수 자료형
형식
자료형
크기
값의 범위
실수형
Double
8 Bytes (64 Bits)
약 $4.0E-324 ~ 1.7E+308$ (IEEE754)
Float
4 Bytes (32 Bits)
약 $1.4E-45 ~ 3.4E+38$ (IEEE754)
val exp01 = 3.14 // Double 형으로 추론 (기본)
val exp02 = 3.14F // 식별자 F에 의해 Float 형으로 추론
이미지 출처 : 코틀린 프로그래밍 기본 1 (부스트코스)
코틀린은 자료형을 명시하지 않으면Double 형으로 추론한다.
만약 Float 형으로 지정하고 싶으면 간략하게 식별자F를 실수 옆에 붙이는 방법을 사용하면 된다.
var doubleNum = 0.03 // Double 형으로 추론
var floatNum = 0.03F // Float 형으로 추론
실수의 개수는 무한하지만 메모리공간은 유한하다. 그래서 메모리에 모든 실수를 표현하기는 어렵다.
이러한 메모리의 단점을 극복하기 위해 실수를 표현할 때 부동 소수점(Floating-Point) 방식을 사용한다.
부동 소수점 방식은 실수를 가수, 지수로 나누어 표현하는 방식이다.
$3.14 × 10^{16} = 3.14E+16$
val exp03 = 3.14E-2 // 왼쪽으로 소수점 2칸 이동, 0.0314
val exp04 = 3.14e2 // 오른쪽으로 소수점 2칸 이동, 314
컴퓨터는 음수를 표현하기 위해 2의 보수라는 개념을 사용하고 있다.
컴퓨터의 연산기는 덧셈 기능의 회로만 있으며, 덧셈 기능을 뺄셈으로 구현하기 위해서 만들어진 규칙이다.
부동 소수점의 이해
32비트와 64비트의 부동 소수점 표현
이미지 출처 : 코틀린 프로그래밍 기본 1 (부스트코스)
Float형
1 Bit : 부호
8 Bits : 지수
23 Bits : 가수
Double 형
1 Bit : 부호
11 Bits : 지수
52 Bits : 가수
부동 소수점의 표현
$-12.375_{(10)}$ 의 표현
음수 : $-$
127 (bias) 기준으로 구분
절댓값 : $12.375$
$1100.011_{2}$
$1.100011 × 2^{3}$
정수부의 1 생략
$100011$을 가수부에 표현
$2^{3}$ 은 진수부에 다음과 같이 표현한다.
$127(bias) + 3 = 130_{(10)} = 10000010$
소수를 이진법으로 나타내는 방법은 다음과 같다. 참고 사이트 : https://woo-dev.tistory.com/93
IEEE 방식의 부동 소수점 제한
공간 제약에 따라 부동 소수점 연산의 단점이 존재한다.
fun main() {
var num: Double = 0.1
for (x in 0..999) {
num += 0.1
}
println(num) // 100.0.9999999999859
}
0.1을 1000번 더하면 100이 나와야 하지만, IEEE 방식의 부동 소수점 방식으로 계산을 할 경우 정확하지 않은 결과값이 출력된다.
정수 자료형과 실수 자료형의 최솟값과 최댓값 출력하기
MIN_VALUE또는 MAX_VALUE자료형 요소를 이용하여 자료형의 최솟값과 최댓값을 확인할 수 있다.