일반적으로 var 을 사용하여 선언
val 을 이용하여 초기화한 경우 변경 불가능 (Java 의 final)선언 방법
var 변수명 : 자료형 = 초기값 (null 사용 불가)
var 변수명 : 자료형? = 초기값 (null 사용 가능)
정수형
0b : 2진수
0x : 16진수( 8 bit) Byte
(16 bit) Short
(32 bit) Int - 기본형
(64 bit) Long - 데이터 끝에 'L' 붙이기
실수형
지수 표기법 가능
(32 bit) Float - 데이터 끝에 'f' 붙이기
(64 bit) Double - 기본형
문자형
(2 Byte) - Char - UTF-16 BE
논리형
(1 bit) - Boolean - true / false
문자열
String
"..." - 기본
"""...""" - 작성한 모양대로 출력
반환 값 없음
Unit
암시적 형변환 불가능
명시적 형변환으로 사용
-> 변수명.to자료형()
정수
10, 2, 16 진수는 Int 가 기본
정수에 'L' 을 붙이면 Long 으로 인식
실수
Double 이 기본
실수에 'f' 를 붙이면 Float 로 인식
논리형
Boolean 이 기본
문자
Char 가 기본
전위
(++변수 / --변수)
증감이 적용된 상태로 문장 수행
후위
(변수++ / 변수--)
문장이 끝한 후 증감 적용
true / false 를 비교하여 true / false 값 도출
AND : &&
OR : ||
NOT : !
val 은 할당된 객체를 바꿀 수 없을 뿐, 객체 내부 속성을 변경 가능
상수
컴파일 시점에 결정되어 절대 변경 불가능한 값
const val 으로 선언상수로 선언될 수 있는 값은 String 을 포함한 기본 자료형만 가능하며
런타임에 생성될 수 있는 일반적인 다른 클래스의 객체들은 담을 수 없음클래스의 속성이나 지역 변수 등으로 사용 불가능
반드시 companion object 안에 선언하여
객체의 생성과 관계없이 클래스와 관련된 고정적인 값으로만 사용해야함이름은 의례적으로 대문자와 언더바를 사용한 표기법
☞
변수의 경우 런타임시 객체를 생성하는데 시간이 더 소요되어 성능의 하락이 있기 때문에
늘 고정적으로 사용할 값은 상수를 통해 객체 생성 없이 메모리에 값을 고정하여 사용하여
성능을 향상시킬 수 있는 장점이 있음
늦은 초기화 ( lateinit )
변수 선언 시, 객체를 바로 할당하지 않으면 컴파일이 되지 않음
변수에 객체를 할당하는 것을 선언과 동시에 할 수 없는 경우도 있음이런 경우, lateinit var 으로 변수를 선언하고
초기값의 할당을 나중에 진행할 수 있도록 하는 키워드※ 초기값 할당 전까지 변수 사용 불가능 ( 에러 발생 )
※ 기본 자료형에는 사용 불가능 ( String 에는 가능 )※ ::변수.isInitialized → lateinit 변수에 초기값이 할당 되었는지 확인 가능
지연 대리자 속성 ( lazy delegate properties )
변수를 사용하는 시점까지 초기화를 자동으로 늦춰주는 기능
val 변수 : 자료형 by lazy { 초기값 }코드에서 선언 시 즉시 객체를 생성 및 할당하여 변수를 초기화하는 형태를 갖고 있지만
실제 실행 시에는 변수를 사용하는 시점에 초기화하여 코드의 실행시간 최적화 가능람다 함수로 초기화가 진행되므로 여러 개의 구문이 들어갈 수 있으며
마지막 구문이 변수에 할당됨
fun main() {
_constant()
println()
println("=========================")
println()
_lateinit()
println()
println("=========================")
println()
_lazy()
}
fun _constant() {
val foodCourt = FoodCourt()
foodCourt.searchPrice(FoodCourt.FOOD_CREAM_PASTA)
foodCourt.searchPrice(FoodCourt.FOOD_STEAK)
foodCourt.searchPrice(FoodCourt.FOOD_PIZZA)
}
class FoodCourt {
fun searchPrice(foodName: String) {
val price = when (foodName) {
FOOD_CREAM_PASTA -> 13000
FOOD_STEAK -> 13000
FOOD_PIZZA -> 13000
else -> 0
}
println("$foodName : $price")
}
companion object {
const val FOOD_CREAM_PASTA = "크림파스타"
const val FOOD_STEAK = "스테이크"
const val FOOD_PIZZA = "피자"
}
}
fun _lateinit() {
val a = LateInitSample()
println(a.getLateIntitText())
a.text = "새로운 값"
println(a.getLateIntitText())
}
class LateInitSample {
lateinit var text: String
fun getLateIntitText(): String {
if (::text.isInitialized) {
return text
} else {
return "기본값"
}
}
}
fun _lazy() {
val number: Int by lazy {
println("초기화")
7
}
println("코드 시작")
println(number)
println(number)
}
//크림파스타 : 13000
//스테이크 : 13000
//피자 : 13000
//
//=========================
//
//기본값
//새로운 값
//
//=========================
//
//코드 시작
//초기화
//7
//7