fun main() {
/*
var a: Int
println(a) // 에러 발생
*/
var a: Int = 123
println(a)
}
프로그램 특성 상 변수에 null을 허용해야 할 때(값이 할당되지 않았음을 표현해야 할 때)
fun main() {
var a:Int? = null // null Pointer Exception이 발생할 수 있으므로 주의
}
lateinit
lazy
정수형
실수형
사용 예시
fun main() {
// 10진수 표현(기본)
var intValue:Int = 1234
var LongValue:Long = 1234L // L을 붙여 더 큰 메모리를 사용함을 표시해야 함
// 16진수 표현
var intValueByHex:Int = 0x1af // 0x 붙이기
// 2진수 표현
var intValueByBin:Int = 0b10110110 // 0b 붙이기
// 8진수 표기는 지원하지 않음
}
fun main() {
// 소수의 경우 기본은 Double
var doubleValue:Double = 123.5
var doubleValueWithExp:Double = 123.5e10
// float 형을 사용하면 뒤에 f를 붙여준다. 대문자여도 됨
var floatValue:Float = 123.5f
}
문자형
fun main() {
var charValue:Char = 'a'
var koreanCharValue:Char = '가'
}
Boolean
fun main() {
var booleanValue:Boolean = true
}
문자열
fun main() {
val stringValue = "one line string test"
val multiLineStringValue = """multiline
string
value
"""
}
var a:Int = 54321
var b:Long = a.toLong()
변환될 자료형을 개발자가 직접 지정해야 한다.
fun main() {
var intArr = arrayOf(1, 2, 3, 4, 5) // 1, 2, 3, 4, 5 가 들어있는 배열
var nullArr = arrayOfNulls<Int>(5) // 빈 배열
intArr[2] = 8 // 해당 인덱스에 값 할당 가능
println(intArr[4]) // 인덱스 값 사용 가능
}
변수나 함수를 선언할 때, 연산이 이루어질 때 자료형을 명시하지 않아도 코틀린이 자료형을 추론하는 것. 예를 들어 앞서 1장과 2장에서 문자열, 배열을 만들 때,
val stringValue: String = "문자열" // 얘가 아니라
val stringValue = "문자열" // 이렇게 씀
var intArr: Array<Int> = arrayOf(1, 2, 3, 4, 5) // 얘가 아니라
var intArr = arrayOf(1, 2, 3, 4, 5) // 이렇게 씀
변수가 선언될 때 할당된 값의 형태로 해당 변수가 어떤 자료형을 가지는지 추론이 가능하기 때문에 타입 추론이 가능하다.
타입 추론은 지금까지 알아본 대부분 자료형에서 가능하다.
fun main() {
var a = 1234 // Int
var b = 1234L // Long
var c = 12.34 // double
var d = 12.34f // float
var e = 0xABCD // Int
var f = 0b01010101 // Int
var g = true // boolean
var h = 'c' // character
}
⇒ 반드시 특정한 자료형으로 지정해야 하는 상황이 아니라면 타입 추론으로 코드량을 줄일 수 있다.
fun main() {
println(add(5, 6, 7))
}
// 입력값, 반환값 설정을 해준다.
fun add(a:Int, b:Int, c:Int): Int {
return a + b + c
}
// 반환값이 없는 경우
fun add(a:Int, b:Int, c:Int) {
return
}
함수가 단순한 역할을 하는 경우 단일 표현식 함수로 간단하게 표현할 수 있다.
// 단일 표현식 함수, 반환형은 추론되므로 생략 가능
fun add(a: Int, b: Int, c: Int) = a + b + c
fun main() {
var a = 7
if (a > 10) {
println("a는 10보다 크다")
} else {
println("a는 10보다 작거나 같다")
}
}
< ≤ > ≥ ==
좌측 변수가 우측 자료형에 호환되는지 확인하는 방법
하나의 조건을 여러 개의 값과 비교할 수 있다.
fun main() {
doWhen(1)
doWhen("Dimo")
...
}
// Any는 어떤 자료형이든 상관없이 호환되는 코틀린의 최상위 자료형
fun doWhen (a: Any) {
when(a) {
1 -> println("정수 1입니다.")
"Dimo" -> println("디모의 코틀린 강좌입니다.")
is Long -> println("Long 타입입니다.")
!is String -> println("String 타입이 아닙니다.")
else -> println("어떤 조건도 만족하지 않습니다.")
}
}
// print 해보는게 아니라 조건에 따라 값을 할당하고 싶다면?
fun doWhen (a: Any) {
var result = when(a) {
1 -> "정수 1입니다."
"Dimo" ->"디모의 코틀린 강좌입니다."
is Long -> "Long 타입입니다."
!is String -> "String 타입이 아닙니다."
else -> "어떤 조건도 만족하지 않습니다."
}
println(result)
}
// while
fun main() {
var a = 0
while (a < 5) {
println(a++) // 0, 1, 2, 3, 4 출력
}
while (a < 5) {
println(++a) // 1, 2, 3, 4, 5 출력
}
}
// do while
// 최소 한 번은 조건 없이 구문을 실행한 후 while로 조건을 확인함
fun main() {
var a = 0
do
{
println(a++)
} while (a < 5)
}
fun main() {
for (i in 0..9) {
print(i) // 줄을 떼지 않고 붙여서 출력할 때
// 결과는 0123456789
}
for (i in 0..9 step 3) {
print(i) // 0369
}
// 감소시키려면
for (i in 9 downTo 0 step 3) {
print(i) // 9630
}
// char 자료형에도 사용 가능
for (i in 'a'..'e') {
print(i) // abcde
}
}
변수 앞이나 뒤에 ++ — 등을 붙이는 경우
앞에 붙이는 경우
++a
—a
이미 계산된 값을 해당 구문에 적용
a++
a—
증가하거나 감소된 값을 해당 구문이 아니라 다음 구문부터 사용