document
kotlin document
변수명 규칙
- 숫자 시작 불가
- keyword 불가
- variable : camelExpression
- file, class : UpperCamel
// varable
var camelCase
var numberOfBook
// class
class AnimalCategory
class CarEngine
변수 타입
assignmet를 통해 compile time typing 가능.
declation 시 explicit typing 필요
- strong & static typed + null 안전성
variable_type : 변수 타입
val(value) : immutable
var(variable) : mutable
variable_type variable: type = value
variable_type : 변수 타입
- 기본적으로 null 할당 불가
variable_type? : null 할당 가능하다고 선언
: : type 지정 선언
"" : double quotation(String)
'' : Char type
// type 선언
val username: String = "heeeeee"
// declation + explicit type
val int: Int
// assignment + implicit type
val username = "aaa"
data type
variable.javaClass : return javaClass
package org.example
fun main() {
var numEx: Number = 99.2345
println("numEx = $numEx type : ${numEx.javaClass}") // class java.lang.Double
numEx = 19
println("numEx = $numEx type : ${numEx.javaClass}") // class java.lang.Integer
numEx = 19L
println("numEx = $numEx type : ${numEx.javaClass}") // class java.lang.Long
numEx = 19F
println("numEx = $numEx type : ${numEx.javaClass}") // class java.lang.Float
}
Primitive type
- stack 저장
- byte, short, int, …
- compile time typing, explicit 선언 X
Int, Double : 기본 type
100L : Long type 선언
- 기본 type에서
byte를 넘어갈 시 범위에 맞게 추론
- rvalue 도 type checking 하는 듯?
_ : 정수 타입에서 무시됨(사용자 편의 범위 표시)
is
- is + 변수 → Boolean(implicit)
- 단 선언 시 explicit 선언 필요
| |
8비트(1byte) |
16비트(2byte) |
32비트(4byte) |
64비트(8byte) |
| 정수 |
Byte |
Short |
Int |
Long |
| 실수 |
|
|
Float |
Double |
| 문자 |
|
Char |
|
|
| 부울값 |
boolean |
|
|
|
// Int
val num_var = 210000
val int_var = 0x0F
val int_var = 0b000101
// Long
val long_var = 9223373548354135563541535
val long_var = 9_223_373_548_354_135_563_541_535
val long_var = 123L
val long_var: Long =321
// Byte
val byte_var: Byte = 123
// Double
val double_var = 3.14
// Float
val float_var = 3.14F
// Boolean
val isOpen = true
val isBool: Boolean
fun main() {
val name = "Kotlin";
var num = 0.1;
var numF = 0.1F;
for (x in 0..999) {
num += 0.1;
// numF += 0.1; // error
numF += 0.1F
}
println("num:$num")
println("numF:$numF")
}
>>>
num:100.09999999999859
numF:100.099045
부동 소수점
| 자료형 |
유효 소수 이하 자리 |
| Double |
15자리 |
| Float |
7자리 |
Reference type
- 기본 선언 type
- Byte, Short, Int, …
- 대문자 시작
- complie time
- Object
- 참조 타입
- Heap 저장
| 자료형 |
비트수 |
범위 |
기본값 |
| String |
고정 X |
제산 없음 |
null |
String
- String Pool : Heap, String 저장 공간
- 동일한 리터럴(literal value) : String 객체 공유
== : value 비교
=== : value + 참조(reference) 비교, alias
**package org.example
fun main() {
val strEx01: String = "str"
val strEx02 = "str_diff"
val strEx03 = "str"
println("$strEx01 == $strEx02 ${strEx01 == strEx02}")
println("$strEx01 == $strEx03 ${strEx01 == strEx03}")
println("$strEx01 === $strEx04 ${strEx01 === strEx03}")
}
>>>
str == str_diff false
str == str true
str === str true**
" ... $integer ...
- 문자로 인식
$integer 이후 문자 : 사이 공백 필요
- type conversion 방식?
package org.example
fun main() {
val strEx = "str"
val integerEx = 111
println("$integerEx")
println(integerEx)
println("$strEx expression $integerEx str")
}
>>>
111
111
str expression 111 str
Const
- 변하지 않는 값을 입력
- 읽기 전용 변수 val앞에 const 키워드
- local variable : const 선언 불가
const val foo = complexFunctionCall() //Not okay
val fooVal = complexFunctionCall() //Okay
const val bar = "Hello world" //Also okay
fun main() {
const val bar = "Hello world" //Not okay
}
| 특징 |
Kotlin val |
Kotlin const val |
C++ constexpr |
| 재할당 가능 여부 |
❌ |
❌ |
❌ |
| 값 확정 시점 |
런타임 가능 |
컴파일 타임 |
컴파일 타임 |
| 함수 결과 가능? |
✅ (런타임) |
❌ |
✅ (constexpr 함수) |
| 주 용도 |
읽기 전용 참조 |
컴파일 타임 상수 |
컴파일 타임 상수 |
NULL
null
- not null type : 기본적으로 허용 X
? (declation)
- reference variable
- null 값 허용 선언
?(safe call) : null값일 시 shortcut circuit 적용
!!(non-null assertion) : non null 명시
NIPE(NullPointerException) : 사용할 수 없는 null인 변수에 접근하면발생하는 예외
package org.example
fun main() {
var str: String?
str = null
println("str : $str")
println("str.length : ${str?.length}")
str = "null"
println("str.length : ${str?.length}")
println("str.length : ${str!!.length}")
}
>>>
str : null
str.length : null
// ?
ain.kt:11:32: warning: unnecessary safe call on a non-null receiver of type String?
println("str.length : ${str?.length}")
^
str : null
// !!
ain.kt:11:32: warning: unnecessary non-null assertion (!!) on a non-null receiver of type String
println("str.length : ${str!!.length}")
^
str.length : 4
- 함수형 언어 특징
var variable = if(condition) true_value else false_value : 조건문 할당
package org.example
fun main() {
var str: String?
str = null
// 조건식을 통해 null 상태 검사
var strLen = if(str == null) "null" else str.length
println("str : $str, lenth: $strLen")
}
>>>
Main.kt:8:21: warning: condition 'str == null' is always 'true'
var strLen = if(str == null) "null" else str.length
^
Main.kt:8:50: warning: unreachable code
var strLen = if(str == null) "null" else str.length
^
str : null, lenth: null
?:(엘비스 연산자)
variable?.method ?: "value" : return if(variable == null) null else variable?.method
package org.example
fun main() {
var str: String? = "aaa"
println("str : $str, lenth: ${str?.length ?: "is null"}")
str = null
println("str : $str, lenth: ${str?.length ?: "is null"}")
}
>>>
str : aaa, lenth: 3
str : null, lenth: is null
형변환
- 참조형만 사용(기본형 X)
- type widen X (strong typing)
- const variable : 형변환 가능
val a = 1
val v: Double = a // type error
val c: Int = 1.1 // type error
val d = 1L + 10 // Long type
variable.toType() : 원하는 type으로 변환
package org.example
const val int = 10
fun main() {
// val int = 10
val double: Double = int.toDouble()
val int2: Int = double.toInt()
println("int : $int") // int : 10
println("double : $double") // double : 10.0
println("int2 : $int2") // int2 : 10
}
Any
- 모든 클래스의 조상, class 상속으로 smart casting(overriding, overloading) 구현
- java, kotlin : 단일 상속 지원
- object의 root class
- 즉 모든 object는 Any를 자동 상속
- java :
java.lang.Object
package org.example
fun main() {
anyFunc(100) // anyPar is Int: 100 type: 100.javaClass
anyFunc("str") // anyPar is String: str type: str.javaClass
}
fun anyFunc(anyPar: Any){
if(anyPar is Int)
println("anyPar is Int: $anyPar type: $anyPar.javaClass")
if(anyPar is String)
println("anyPar is String: $anyPar type: $anyPar.javaClass")
}
Smart Casting
- implicit type
- Nunber type : interger, float, … 등 숫자 타입 저장을 위해 특수한 데이터 타입으로 스마트 캐스트
package org.example
fun main() {
var numEx: Number = 99.2345
var numEx: Any = 99.2345
println("numEx = $numEx type : ${numEx.javaClass}") // class java.lang.Double
numEx = 19
println("numEx = $numEx type : ${numEx.javaClass}") // class java.lang.Integer
numEx = 19L
println("numEx = $numEx type : ${numEx.javaClass}") // class java.lang.Long
numEx = 19F
println("numEx = $numEx type : ${numEx.javaClass}") // class java.lang.Float
}
is
- type checking
var1 is var2
var1 !is var2
package org.example
fun main() {
var numEx: Number = 99999
println(numEx is Int) // true
println(numEx !is Int) // false
}
as
- casting operation
variable as Type
- compile time checking X
- run-time error
- class 상속 관계 기반
variable as? Type : null-sage casting operation
package org.example
fun main() {
val obj: Any = "str"
val str = obj as String
println("str: $str, type: ${str.javaClass}") // str: str, type: class java.lang.String
val num: Any = 1111
val strval = num as? String
println("strval: $strval") // strval: null
// println("strval: $strval, type: ${strval.javaClass}")
}
>>>
val strval = num as String
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
at org.example.MainKt.main(Main.kt:9)
at org.example.MainKt.main(Main.kt)
예제
package org.example
fun main() {
typeRange("Int", Int.MIN_VALUE, Int.MAX_VALUE)
}
fun typeRange(type: String, min_value: Int, max_value: Int){
println("$type: ${min_value}, ${max_value}")
}
package org.example
fun main() {
val null_val = null
val str_val = "str"
safePrint(null_val as? String) // null
safePrint(str_val as? String) // str
}
fun safePrint(input: String?){
println("$input")
}
package org.example
fun main() {
val str = "str"
val num = 111
printType(str) // strval: str, type: class java.lang.String
printType(num) // strval: null, type: wrong type
}
fun printType(variable: Any){
val strval = variable as? String
println("strval: $strval, type: ${strval?.javaClass ?: "wrong type"}")
}