본문 바로가기
개발

TIL: 변수, 상수, array,list,String 연산

by kks950115 2023. 12. 1.
728x90

변수

 

var myName: String = "Burt.K"
var myAge: Int
var myName = "Burt.K"

 

코틀린은 변수를 선언할 때 타입을 변수명 뒤에  :(타입명)으로 입력한다. 

선언만 해놓을 때도 마찬가지인데 초기화값에 따라서 추론하기 때문에 타입을 굳이 명시하지 않아도 된다.

 

val myName: String = "Burt.K"
val myName = "Burt.K"

 

val은 value의 약자로 바뀌는 것이 고정적인거라서 수정이나 불가능하다.

 

상수

fun main() {
    println(ExamClass.CONST_VAL)
}

class ExamClass(){
    companion object{
        const val CONST_VAL = 100
    }
}

 

우리가 아는 불변하는 값이 상수다. 예)원주율

 

val과 const val은 어차피 둘다 못바꾸는데 왜 따로 있는걸까?

-> val은 런타임 시 값이 결정되지만 const val은 컴파일 시 결정된다. 그렇기 때문에 val은 상황에 따라서 바뀔수도 있지만 const val 은 그렇지 않다. 그냥은 못쓰고  사용하려면 companion object {} 안에 선언해줘야 쓸 수 있다.

 

array

var array = arrayOf(1,2,3) // 특정 값을 넣어서 배열을 생성하는 경우 
var array2 = Array(10,{0}) // 크기만 정해서 배열을 생성하는 경우

 

자바의 배열은  선언해놓으면 크기 수정이 불가능하지만 코틀린의 배열은 크기 수정이 가능한 객체이다. 

 

 

list

val list = MutableList<Int>(3, {i -> i})
val list = mutableListOf<Int>(0, 1, 2)

 

list는 수정이 가능한 객체와 읽을 수만 있는 객체로 구분된다. 

자바의 콜렉션은 모두 수정이 가능한데 굳이 둘로 나눈 이유는 코틀린은 함수로 된 언어라서 시스템에 대한 간섭을 막기 위해 분리한 것이라고 한다.

리스트와 배열은 각자 적용가능한 함수가 다르니 잘 구분하고 쓰자.

 

String 연산

var temp: String = "AB"
temp +"CD"

 

위 상황은 코딩을 하다보면 자주 나올 것이다.

string에 +연산을 하면  "AB"+"CD"="ABCD"로 나오기 때문에 AB의 자리에 CD가 합쳐진 것이라고 생각하기 쉽다.

하지만 내부적으로는 그렇지 않다. ABCD 를 새로 생성하고 이게 AB 자리라고 하는 것이다. String은 객체이기도 하니 사실상 string에 +-를 비롯한 반환타입이 객체인 여러 확장함수를 사용하여 대입할 때마다 객체를 하나씩 만들고 버리는 걸 계속 반복한다는 뜻이다 !!! 연산의 양이 적을 때는 상관없지만 10만개 100만개 이런 식으로 반복횟수가 엄청나다면 그만큼의 객체를 만들고 버려야하는거니 심각한 속도저하를 체감할 수 있을 것이다.

 

val str = StringBuilder()  //string을 자주 바꿔야한다면 stringbuilder!!!

 

이걸 방지하기 위해 연산이 일어날 때마다 해당 객체를 버리지 않고 계속 쓰면서 값을 추가하고 삭제하는 클래스가 있다.

바로 StringBuilder이다. 잦은 String 연산을 사용해야할 경우에는 Stringbuilder를 사용하도록 하자.

728x90
반응형

댓글