변수

LEEHEES·2022년 7월 10일

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개의 댓글