자료의 참조방식
코틀린에서 코딩 시 객체에 자료를 입력하는 것은 기본적으로 참조를 기본으로 합니다. 그러나 코드의 컴파일 단계에서는 기본형으로 대체됩니다.기본형(Primitive data type)과 참조형(Reference Data Type)을 어떤 차이가 있을까요?
기본형: 프로그램밍 언어에 내장되어 있는 형태로서 int, long, Double, Float등
참조형: String, Date와 같이 기본형을 조합하여 생성한 자료형태
그러나 위에서 소개한 것과 같이 코틀린은 코딩시 모든 자료를 참조형식으로 사용하지만 컴파일 단계에서 int, long, Double, float등은 기본형으로 전환되므로 이 참조형의 최적화를 별도로 고려할 필요는 없습니다.
자료형이 저장되는 메모리는 임시메모리인 stack과 동적메모리인 heap으로 구분됩니다.
참조 방식의 경우 생성된 객체의 값들은 heap에 저장되고 stack에는 그 값들이 저장된 주소만이 존재합니다. 그러므로 그 객체를 호출할 경우 값은 heap에 있는 부분을 호출하여 나타내게 됩니다.
x=3 이라는 객체를 선언하면 임시메모리인 stack에 이 객체를 위한 자리가 마련되지만 값(실제객체) 3은 동적메모리인 heap에 저장되고 stack에는 heap에 저장된 그 값의 주소가 저장됩니다. 그러므로 객체가 사용될 경우는 주소에 위치한 값을 소환하여 사용합니다.
코틀린에서 객체의 선언은 위와 같은 참조형식을 취하지만 일단 그 객체가 컴파일 되면 기본형으로 변환되어 값을 직접이용하게 됩니다. 결과적으로 자료의 저장 방식을 고려할 필요는 없습니다.
자료형의 종류
정수형
양수, 음수, 0을 포함하며 부호가 있는 자료와 부호가 없는 자료로 구분합니다.형식 | 자료형 | 크기 | 범위 |
---|---|---|---|
부호있는 정수형 | Long | 8바이트(64비트) | -263 ~ 263-1 |
Int | 4바이트(32비트) | -231 ~ 231-1 | |
Short | 2바이트(16비트) | -215 ~ 215-1 | |
Byte | 1바이트(8비트) | -27 ~ 27-1 |
각 자료형은 클래스로 구성되어 있으며 클래스의 멤버함수 즉, 메서드가 존재합니다.
각 자료형의 최대값과 최소값은 다음 메소드로 확인할 수 있습니다.
.MAX_VALUE: 최대값
.MIN_VALUE: 최소값
.MIN_VALUE: 최소값
val bigByte: Byte=Byte.MAX_VALUE
val smallByte: Byte=Byte.MIN_VALUE
println("bigByte: $ {bigByte} and smallByte: $ {smallByte}")
bigByte: 127 and smallByte: -128
val smallByte: Byte=Byte.MIN_VALUE
println("bigByte: $ {bigByte} and smallByte: $ {smallByte}")
bigByte: 127 and smallByte: -128
변수를 선언할 경우 자료형은 명시하지 않아도 됩니다. 이 경우 변수에 전달된 값으로 자료형을 추론합니다.
일반적으로 정수형은 Int로 추론하기 때문에 Long형을 생성하기 위해서는 자료형을 명시하거나 값과 함께 L을 같이 입력해 주어야 합니다.
자료형이 명시되지 않은 상태에서 입력되는 숫자가 Int의 범위를 초과할 경우 Long으로 인식합니다.
val c: Long= 123
c is Long
true
val b=123
b is Long
Incompatible types: Long and Int
val b=123L
b is Long
true
c is Long
true
val b=123
b is Long
Incompatible types: Long and Int
val b=123L
b is Long
true
변수에 16진법이나 2진법으로 값을 전달할 경우 각각 값의 접두어로 0x, 0b를 붙여 줍니다.
val c = 0x0F //16진법으로 전달
c
15
val b=0b1011 //2진법으로 전달
b
11
c
15
val b=0b1011 //2진법으로 전달
b
11
실수자료형
형식 | 자료형 | 크기 | 범위 |
---|---|---|---|
실수형 | Double | 8바이트(64비트) | 약 4.9E-324~ 1.8E308 |
Float | 4바이트(32비트) | 약 1.4E-45 ~ 3.4E+38 |
val a:Float=0.123F
a
0.123
a
0.123
실수의 갯수는 무한하지만 메모리 공간은 유한하기 때문에 모든 실수를 표현할 수 없습니다.
그러므로 많은 자리수를 가지는 경우 다음과 같이 표현됩니다.
다음은 3.14E+16의 표기에 대해 설명한 것입니다.
3.14 | E | +16 |
가수 부분, 소수점(없을 수도 있음) | E or e | 지수부분, + 또는 -로 +는 일반적으로 생략 |
예를 들어 0.00314는 3.14e-3 또는 0.314e-2와 같이 다양하게 나타낼 수 있습니다. 단지 소수점(.)의 위치가 바뀌고 있습니다. 그러므로 이러한 소수점을 부동소수점이라고 합니다.
val a=3.14e-3
a
0.00314
a
0.00314
예로 float의 경우 메모리의 크기는 32 bit로서 다음과 같이 분할되어 저장됩니다.
부호(1bit) + 지수(8bit) + 가수(23bit)
부호는 0 또는 1 → 1은 음수를 의미
부호는 0 또는 1 → 1은 음수를 의미
논리형
참(true)과 거짓(false)을 표현하며 조건을 검사할 경우에 많이 사용됩니다.
형식 | 자료형 | 크기 | 값 |
---|---|---|---|
논리형 | Boolean | 1비트 | true, false |
val a=3.1
val b=5.4
a > b
false
val b=5.4
a > b
false
문자자료형
문자(Char)를 표현하기 위한 자료형으로서 작은 따옴표(' ')로 값을 전달합니다.
형식 | 자료형 | 크기 | 값 |
---|---|---|---|
문자 | Char | 2바이트(16비트) | 0 ~ 215 |
val ch='a'
ch
a
ch
a
문자형의 값은 정수입니다. 그 정수 값이 아스키코드, 유니코드 표에 대응되는 문자를 표현합니다.
예를들어 문자 a는 문자로 저장되지 않고 정수 65로 저장됩니다.
그러므로 위 코드의 a 다음의 값은 b이며 이 값은 66입니다. 이것은 다음 표현과 같습니다.
66=65+1 → b=a+1
ch+1
b
b
또한 문자의 근원은 정수이므로 다음 메소드를 사용하여 숫자를 문자로 전환할 수 있습니다.
정수.toChar() 메소드를 적용합니다.
for(i in 65..90){
print("$ {i.toChar()}, ")
}
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
print("$ {i.toChar()}, ")
}
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
이와같이 문자와 숫자는 상호연결이 되어 있지만 문자형에 숫자를 직접 전달 할 수는 없습니다.
val code: Char=67
code
The integer literal does not conform to the expected type Char
code
The integer literal does not conform to the expected type Char
문자열 자료형
Char은 문자 하나만을 나타냅니다. 하나 이상의 문자와 문장등을 나타내기 위해서 String(문자열)을 사용합니다.
String은 여러문자를 결합한 형태로 여러 값들을 하나의 그룹에 담는 collection과 유사합니다. 즉, 문자열 객체는 여러 문자를 결합한 것으로 구성하는 각 문자가 원소가 됩니다.
Char은 기본자료형인데 반해 String은 참조자료형입니다.
문자열을 전달하기 위해서는 큰따옴표(" ")를 사용합니다.
val str="Kotlin"
str
Kotlin
for (i in str) {println(i)}
K
str
Kotlin
for (i in str) {println(i)}
K
o
t
l
i
n
str[1]
o
str[1]
o
댓글
댓글 쓰기