변수

LEEHEES·2022년 7월 10일
0

Kotlin

목록 보기
2/13
post-thumbnail

선언

일반적으로 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
profile
iOS 개발 공부

0개의 댓글