본문 바로가기
코틀린 문법

21. 변수의 다양한 사용방법

by 농농씨 2023. 6. 3.

참조: 유튜브 디모의 코틀린

코드테스트사이트:play.kotlinlang.org

단축키(맥북):

맥북 스크린샷 바로 클립보드에 붙여넣기

-control+command+shift+3 or 4(3은 전체화면, 4는 마우스로 지정한 영역, 4일때 스페이스바 누르면 창캡처가능)

화면에 분할해놓은 창끼리 이동

-command+'

한 창에서 탭끼리 이동

-command+shift+{/}

 

//변수에 대한 몇가지 주의할 내용과 좀 더 다른 방법으로 사용하는 법 알아보자
//var
//var은 한번 할당한 객체가 있더라도 다른 객체로 변경하여 할당할 수 있으며
//ex. var a=Person("유나",2003)
// a=Person("루다",1997)
//val은 한번 객체를 할당하면 다시 할당된 객체를 변경할 수 는 없음
//주의!
//val은 할당된 객체를 바꿀 수 없을 뿐이지,
//객체 내부의 속성을 변경할 수 없는 것은 아님!
//이때, 절대 변경이 불가능한 것도 있다~ 
//-->'상수'
//상수(constants)
//컴파일 시점에 결정되어 절대 바꿀 수 없는 값
//선언은 val 앞에 CONST를 붙여 만들게 됨
//ex. const val CONST_A=1234
//상수로 선언될 수 있는 것은 기본 자료형만 가능(string자료형 포함)
//런타임에 생성될 수 있는 일반적인 다른 클래스의 객체들은 담을 수 없다.
//상수는 클래스의 속성이나 지역변수 등으로는 사용할 수 없으며
//반드시 companion object안에 선언하여 '객체의 생성과 관계없이'
//클래스와 관계된 고정적인 값으로만 사용하게 됨
//ex. class Sample{
//  const val COSNT_A=1234
// }--->사용불가!
//   fun sample{
//     const val CONST_A=1234
//   }--->사용불가!
//   
//   class Sample{
//     companion object{
//       const val CONST_A=1234
//     }--->객체 생성과 관계없이 사용가능!
//   }
//상수의 이름 만들때는 의례적으로 대문자와 언더바(_)만 사용함 
//이를 통해 변수가 아닌 상수라는 점을 알림 (대부분의 언어에서 통용됨)


fun main(){
    val foodCourt=FoodCourt()
    //푸드코트의 객체 만들고 
    
    foodCourt.searchPrice(FoodCourt.FOOD_CREAM_PASTA)
    foodCourt.searchPrice(FoodCourt.FOOD_STEAK)
    foodCourt.searchPrice(FoodCourt.FOOD_PIZZA)
    //음식 이름 정의해둔 foodcourt내의 상수들을 searchPrice에 
    //하나씩 넣어봄 
}

class FoodCourt{//클래스 만들고
    fun searchPrice(foodName:String){
        val price = when(foodName)
        {
         FOOD_CREAM_PASTA->13000
         FOOD_STEAK->25000
         FOOD_PIZZA->15000
         else->0
        }
        //when사용하여 상수로 정의된 각각의 음식에 맞는 price를
        //변수에 반환받음
        println("${foodName}의 가격은 ${price}원입니다")
        //이제 이 가격을 println으로 음식 이름과 함께 출력
    }
    //함수 만들어서 음식이름받아서 가격 출력함
    //이때, 이 클래스를 사용하는 사람들은 푸드코트에 어떤 음식이 있는지
    //알 방법이 없음
    //"무슨 음식이 있는지 알고 물어보지?"
    //따라서 companion object를 선언하여 내부searchPrice()에서
    //사용할 음식 이름들을 '상수'로 선언해주도록 함
    
    companion object{
        const val FOOD_CREAM_PASTA="크림파스타"
        const val FOOD_STEAK="스테이크"
        const val FOOD_PIZZA="피자"
    }
}


//기능적으로, 굳이 왜 변수 사용하지 않고 상수를 별도로 사용할까?
//:변수의 경우 런타임시 객체를 생성하는데 시간이 더 소요되어 성능의 하락이 있기 때문
//따라서 늘 고정적으로 사용할 값은 상수를 통해 객체의 생성 없이 메모리에 값을
//고정하여 사용함으로써 성능을 향상시킬 수 있다는 장점 있음

//늦은 초기화
//코틀린에서는 변수 선언할 때 객체를 바로 할당하지 않는 경우에는
//기본적으로 컴파일이 되지 않음
//경우에 따라서는 변수에 객체를 할당하는 것을 선언과 동시에 할수 없을때도 있음
//이럴때는 var 앞에 lateinit(레잇-이닛)을 사용함
//일단 변수만 선언하고
//초기값의 할당은 나중에 할 수 있도록 하는 키워드
//*lateinit var 변수의 제한사항
// :초기값 할당 전까지 변수를 사용할 수 없음(에러 발생)
// :기본 자료형에는 사용할 수 없음(string클래스에는 사용가능)
//또한 lateinit변수의 '초기화'를 하였는지 여부를 확인할 때는 
// ::a.isInitialized
//  변수 이름 앞에 콜론을 두개 붙이고 .isInitialized 붙이면 초기화여부
//  확인하여 사용할수있으므로 오류 막을수있음
//ex. var a: Int 
//   "자료형만 지정해두고 객체는 나중에 할당하면 안될까?"-->에러

변수 초기화됐는지 여부 따라 값 출력

fun main(){
    
    val a = LateInitSample()
    //클래스의 객체 만들어 변수 a에 할당하고 
    
    println(a.getLateInitText())
    //함수 실행하여 출력
    a.text="새로 할당한 값"//text속성에 문자열 넣고
    println(a.getLateInitText())
    //함수 다시 실행해봄 
    
}

class LateInitSample{
    lateinit var text:String
    //내부에 lateinit var로 문자열변수인 text 만듦
    
    fun getLateInitText():String{
        //클래스 내부에 문자열 반환하는 함수 만들어서 
        //if 문 안에서 text초기화되면 그대로 반환하고
        //초기화안됐으면 "기본값"이라는 문자열 반환하도록 함
        if(::text.isInitialized){
            return text
        }
        else
        {
            return "기본값"
        }
    }
}

//초기화의 지연
//lazy delegate properties(지연 대리자 속성)
//변수를 사용하는 시점까지 초기화를 자동으로 늦춰줌
//lateinit과 달리 val 변수에 by라는 키워드 사용하여 
//lazy라는 람다함수 형태의 함수를 사용함
//코드에서는 선언시 즉시 객체를 생성 및 할당하여 변수를 초기화하는 형태를
//갖고있지만, 실제 실행시에는 val변수를 '사용'하는 시점에 초기화 과정을
//진행함으로써 코드의 실행시간을 최적화 할 수 있음 
//참고로, 람다함수로 초기화가 진행되므로 함수 안에 여러개의 구문이 들어갈 수 있으며
//맨 마지막 구문의 결과가 변수에 할당됨


fun main(){
    
    val number:Int by lazy{
        //val로 number라는 Int변수 만들고 
     //by lazy 뒤에 람다함수 만듦
     println("초기화를 합니다")
        //초기화 진행시점 확인하기 위해 문자열 출력하고 
        7 //number에 7을 초기값으로 넣음
    }
     
    println("코드를 시작합니다")
    println(number)
    println(number)
    //코드 처음 시작한뒤 number를 처음 출력할 때 
    //lazy함수를 통해 초기화가 진행되었음을 알 수 있으며
    //두번째 number출력할 때는 이미 초기화를 했기 때문에 
    //다시 초기화구문을 실행하지 않음 
}

//상수, 늦은 초기화, 초기화의 지연은 상황에 따라 변수를 사용하는 방법을 
//조금 더 세세하게 조절할 수 있다는 장점이 있다.




























'코틀린 문법' 카테고리의 다른 글

23. 코루틴을 통한 비동기 처리  (0) 2023.06.04
22. 비트연산  (0) 2023.06.04
20. 컬렉션함수(2)  (0) 2023.06.03
19. 컬렉션함수(1)  (0) 2023.06.03
18. Set과 Map  (0) 2023.05.31