자료형은 변수에 입력한 자료가 문자이냐, 정수이냐, 실수이냐에 따라 달라진다.
1, 2, 3과 같은 정수에서는 Int, "Hello"와 같은 경우 문자열, 1.2, 3.6 과 같이 실수형인 경우 Float, Double 등이 있다.
변수를 선언할 때에는 두가지 방법이 있다. C나 C++에서는
#include<stdio.h> // C++인 경우 #include<iostream>
// using namespace std;
int main() {
int a;
float b;
double c;
char str[10];
return 0;
}
위와 같이 선언하지만 Kotlin에서는
fun main() {
val a:Int = 4
val b:Float = 1.5F
val c:Double = 2.6
val str:String = "Hello"
var d:Int = 4
var e:Float = 1.5F
var f:Double = 2.6
var string:String = "Hello"
}
위와 같이 선언한다. val 혹은 var 과 같은 선언 키워드를 입력해주고, 뒤에 앞으로 사용할 변수이름을 넣어준다.
그리고 콜론 뒤에 자료형을 넣어주고 초기 값을 설정해주면 된다.
즉, 선언키워드 변수이름: 자료형 = 초기값
형태로 선언해주면 되는 것이다.
여기서 하나 의문이 들수도 있다. val 과 var은 무슨차인가??
val은 value의 약자로 불변형 변수를 선언하는 것이고, var는 variable의 약자로 가변형 변수를 선언할 때에 사용한다.
하지만 꼭 위와 같이 선언하지 않아도 된다. 변수를 선언하는 방식은 다양하게 존재한다.
fun main() {
val username = "JJangGu"
val num = 10
}
위와 같이 선언해도 무방하다. 여기서 username과 num은 대입된 정보의 자료형을 추론하여 결정한다.
참고로 변수 이름에 대고 Ctrl + Shift + p 를 누르면 자료형을 확인해 볼 수 있다.
변수를 선언하고 변수 이름을 설정해줄 때 몇 가지 주의해야할 사항들이 있다.
- 예약된 키워드(while, for, if 등..)을 사용하면 안된다.
- 의미가 담긴 이름으로 짓기.
- 변수명이 길다면 카멜 표기법을 사용하기.
카멜표기법은 단어가 변경되는 시점에서 대문자로 표현해주는 표기법으로 일반 변수나 함수이름 등에 적용할 수 있다.
예를 들어 numberOfBooks나 myFirstNumber과 같이 표현해주면 된다.
ps) 참고로 파스칼 표기법도 존재한다. 파스칼 표기법은 클래스 명이나 인터페이스 등에서 적용할 수 있다. 파스칼 표기법은 AnimalCategory나 CarEngine처럼 카멜표기법과 유사하지만 변수 이름의 맨 앞글자를 대문자로 표현해 주었다는 점에서 차이점이 있다.
정수 자료형에서 음수표현이 가능한 자료형은 다음과 같다.
자료형 | 크기 | 값의 범위 |
Long | 8byte(64bit) | -2^63~2^63-1 |
Int | 4byte(32bit) | -2^31~2^31-1 |
Short | 2byte(16bit) | -32,768~32,767(-2^15~) |
Byte | 1byte(8bit) | -128~127(s2^7~) |
또 음수표현이 불가능한 자료형은 다음과 같다.
자료형 | 크기 | 값의 범위 |
ULong | 8byte(64bit) | 0~2^64-1 |
UInt | 4byte(32bit) | 0~2^32-1 |
UShort | 2byte(16bit) | 0~2^16-1(0~65535) |
UByte | 1byte(8bit) | 0~2^8-1(0~255) |
추가로 실수 자료형의 크기와 값의 범위는 다음과 같다.
자료형 | 크기 | 값의 범위 |
Double | 8Byte(64bit) | 약4.9E-324~1.7E+308 |
Float | 4Byte(32bit) | 약1.4E-45~3.4E+38 |
자료형은 다음과 같이 사용할 수 있다.
- 자료형 생략
- val num = 127 -> int형으로 추론
- val num = -32768 -> int형으로 추론
- 접미사, 접두사 사용
- val num = 123 -> int형으로 추론
- val num = 123L -> 접미사 L을 통해 Long형으로 추론
- val num = 0x0F -> 접두사 0x를 통해 16진법으로 표현된 int형으로 추론(0F = 0000 1111 = 15)
- val num = 0b00001011 -> 접두사 0b를 통해 2진법으로 표현된 int형으로 추론(0000 1011 = 11)
- 작은 값의 사용
- val num:Byte = 127 -> 명시적으로 자료형을 byte로 지정
- val num = 32767 -> 명시적으로 자료형을 지정하지 않으면 short형 범위의 값도 int형으로 추론
- val num:Short = 32767 -> 명시적으로 자료형을 short형으로 지정
- 부호가 없는 정수 자료형
- val num:UInt = 153u
- val num:UShort = 65535u
- val num:Ulong = 46322342uL
- val num:UByte = 255u
- 실수 자료형
- val num = 3.14 -> 기본적으로 double형으로 추론
- val num = 3.14F -> 식별자 F에 의해 float형으로 추론
- 논리 자료형 (True or False)
- val isTrue = true
- val isOpen: Boolean -> 선언만 한 경우에는 자료형을 반드시 명시해 주어야 한다.
- 문자 자료형
- val ch = 'c' -> char로 추론
- val ch = :Char -> 선언만 한 경우에는 자료형을 반드시 명시해 주어야 한다.
ps) 공부를 하다 보면 자릿수가 큰 수를 다룰 경우도 있을 텐데 쉽게 쓰고 읽는 방법이 있다. 그것은 바로 읽기 쉽게 4자리 마다 언더바를 이용해서 자릿수를 구분해주는 것이다.
- val num = 1_0000_0000
- val num = 1234_1234_1234_1234
- val num = 0xAB_CD_EF_12
- val num = 0b1101_0010
이번에는 문자열에 대해서 다뤄보고자 한다. 문자열은 String으로 선언된다.
fun main() {
var str1:String = "Hello"
var str2 = "world"
var str3 = "Hello"
}
위와 같이 문자열을 선언해줄 수 있다. 이 때 동적 공간안에 String Pool이라는 공간에 선언한 문자열이 들어가게 되는데 일단 선언하고 이 공간에 들어가게 되면 값을 변경할 수 있는 var 로 선언했을 지라도 값을 변경할 수가 없게 된다.
즉, var로 선언된 변수의 참조 주소는 바꿀 수 있지만 일단 선언되어 생성된 메모리 공간에 들어간 값은 변경할 수 없다.
코틀린에서는 문자열을 출력할 때에 $ 기호를 이용하여 출력한다.
fun main() {
var a = 1
val s1 = "a is $a"
var b = 1
val str1 = "b = $b"
val str2 = "b = ${b + 2}"
println("s1: $s1")
println("str1: \"$str1\", str2:\"$str2\"")
}
결과:
s1: a is 1
str1: "b = 1", str2:"b = 3"
문자열에서 사용할 수 있는 비교 연산자가 있다. == 와 === 인데, == 는 단순히 값만 비교를 하고, === 는 값과 함께 참조까지 비교한다. 자바에서는 == 으로 참조까지 비교할 수 있다.
fun main(){
var str1:String = "Hello"
var str2 = "world"
var str3 = "Hello"
println("str1 === str2: ${str1 === str2}") // false
println("str1 === str3: ${str1 === str3}") // true
}
위에서 str1과 str3는 변수명이 다를 지라도 같은 값을 가지고 있기 때문에 같은 참조를 가리킨다.