본문 바로가기

Android

Kotlin 문법1 - 변수/Scope

코틀린 문법

 

변수선언

nullable vs not nullable

val variable: Int? = 100

val variable2: Int = 100

--> ?가 되어 있는 변수는 null로 초기화할 수 있지만, ?가 없는 변수는 null로 초기화할 수 없습니다.

val 

- 초기에 값이 할당되면 나중에 변경할 수 없다. (변경시 컴파일 에러)

- 초기화만 가능하고 변경은 불가능 (Java => final 변수, 상수)

- 타입 선언 후 추후에 여러 상황에 따라 값을 초기화할 수 있음


 

fun main(args: Array<String>){

   val language: String = "Java"

   language = "Kotlin" // Compile Error



    val language2: String;
    val option: String = "J"
    if(option.contains("K"))
     language2 = "Kotlin"
    else
     language2 = "Java"
    
    println("language: " + language2) // Java 

}

var

- 초기화 이후에도 값을 변경할 수 있습니다. (가변변수)

- 초기화한 타입은 그대로 따라서 값을 넣어줘야 합니다. (String이면 String, Int면 Int)

- 자바에서 형변환 하듯 형변환이 가능합니다.

 

fun main(arge: Array<String>){

    var name1: String = "haams"
   // name1 = "seongho"
    
    println("name : $name1")

/*

* haams 결과가 나오고 위에 seongho 주석을 제거하면 seongho가 나옴 

* 단, 초기화한 부분이 (haams) redundant라는 이슈가 뜹니다. 

*/                                       

}

switch문은 when절로 진행하게 됩니다.

fun main(){

    var integerTest:Int
    integerTest = 30
    when(integerTest){
        in 1..10 -> println("1~9")
        !in 10..20 -> println("10~19 X")
        else -> println("otherwise")
    }

    when(integerTest){
        is Int -> println("Intger type")
        else -> println("Not Integer type")
    }

    for(i in 1..10){
        println("number : $i")  // number : 1 ~ 10까지 출력
    }

}

 

.. 으로 범위를 표시하고 이는 크거나 같고 작다를 의미합니다. (1~9)

in 연산자는 해당 범위안에 있는지 여부를 체크하는 것입니다. (= contains)

is 연산자로 해당 타입이 어떤 것인지 체크할 수도 있습니다.

 

다양한 코틀린 문법에 대해서는 해당 사이트에서 확인해보시면 될 것 같습니다.

https://kotlinlang.org/

 


let

-  non-null object를 선언할 때 쓰이는 스코프 함수

-  local-scope에서만 변수 선언할 때 쓰임

 

apply

-  Object Configuration // 객체 구성할 때 쓰임

 

run

-  Object Configuration & Computing results // 객체 구성 후 결과 계산

-  표현식이 필요로 할 때 진술, 설명 내용을 진행할 수 있음

 

also

-  추가적인 내용, 속성, 효과 정리

 

with

-  객체 호출 시 함수를 그룹핑하는 것

 


also 예제

fun getLottoNumber(): Unit {
        for(i in 1..7){
            Random.nextInt(45).also {
               println("Lotto Number : $it")
         }
        }   
    }

also는 실행변수를 it로 받습니다. (별다른 선언이 없는 경우)

 


let 예제

let은 non-null 객체에 대해서 선언하는 lambda 수행 변수로 코드 블록에 수행결과가 반환되는 특징이 있습니다.

 

val number: Int? = 20
    
 val sumNumber = number?.let {
       "${sum(10, it)}"
   }
 println("합계 : $sumNumber")

 

number는 null이 될 수 있는 변수입니다.  sumNumber는 number 변수가 null이 아닌 경우에 대해서 

let 함수를 수행합니다.

let은 코드 블록에 수행결과를 반환하므로 "${sum(10, it)}"의 결과는 20 + 10 = 30이 나오게 됩니다.

여기서 it로 number를 접근한 점을 체크하고 let 함수가 선언한 코드 블록 내에서 수행식에 따라 결과값이

반환되고 있다는 점을 확인하셔야 합니다.

 

?.let 접근이기 때문에 null은 배제한 상태로 진행됩니다.

 

with 예제

   var numberList = mutableListOf("One","Two","Three")
   var elementNumberInfo = with(numberList){
       "first element in numberList is ${first()} \n" +
       "last element in numberList is ${last()}"
   }
   
   println(elementNumberInfo)

Context Object로 함수를 호출할 때 필요하며 lambda 안에서는 this 리시버를 통해 접근할 수 있습니다.

with는 이러한 객체에서는 할 수 있는 것들이 무엇이 있다를 표현할 때 쓰이는 함수입니다.

with함수의 반환값은 lambda의 결과값입니다. 

with함수 내에 Class의 객체나 변수를 넣어서 표현할 수 있고, 객체가 들어간다면 해당 Class에서 사용하는 

객체 함수나 변수들을 this를 통해서 호출할 수 있습니다.

 

 

Run 예제

Run함수는 객체 구성과 함수 결과(Computing)를 한 번에 표현할 때 유효합니다.

apply함수와 동일하게 값을 구성할 때 쓰이긴 합니다. 

다만 값을 계산하거나 적용해서 무언가를 하려할 때 run 함수를 쓰게 됩니다.

with함수와 마찬가지로 반환값이 lambda의 결과값입니다.

단, with함수는 with(~~)로 쓰였기에 확장함수로 사용할 수 없지만

run함수는 .run { }으로 선언하기에 확장함수로 사용할 수 있습니다.

 

class MultiportService(var url: String, var port: Int) {
    fun prepareRequest(): String = "Default request"
    fun query(request: String): String = "Result for query '$request'"
}

fun main() {
    val service = MultiportService("https://example.kotlinlang.org", 80)

    val result = service.run {
        port = 8080
        query(prepareRequest() + " to port $port")
    }

    // the same code written with let() function:
    val letResult = service.let {
        it.port = 8080
        it.query(it.prepareRequest() + " to port ${it.port}")
    }
    println(result)
    println(letResult)
}

service.run { } 을 통해 lambda 범위 내 수행결과를 result에 넣습니다. (query 결과)

let함수를 통해서 it --> service를 가리키며 port와 query를 각각 접근하게 됩니다.

반응형

'Android' 카테고리의 다른 글

Firebase Messaging 관리  (2) 2023.01.17
Kotlin 문법2 - Class  (0) 2023.01.17
액티비티(Activity)  (0) 2023.01.17
Service & Thread  (0) 2018.03.13
구글 스토어에 등록하는 방법  (0) 2018.02.23