핀수로그
  • [kotlin] 코틀린 기초 문법 다지기 - 1
    2022년 06월 06일 17시 13분 40초에 업로드 된 글입니다.
    작성자: 핀수
    728x90
    반응형

    해당 강의를 들으며 작성된 것 입니다.

     

    [무료] 코틀린 3강으로 끝내기 feat. 안드로이드 개발 - 인프런 | 강의

    3강으로 짧게 끝내는 코틀린 문법! 코틀린 기초 문법과 안드로이드 기초 프로그래밍은 물론, 직접 안드로이드 앱도 만들어보세요!, - 강의 소개 | 인프런...

    www.inflearn.com

     

    함수

    파라미터와 리턴 타입이 없을 때

    fun helloWorld(){
    	println("hello world!")
    }

    자바의 void 와 같다.

    아무것도 리턴하지 않는 것처럼 보이지만 사실은 Unit을 리턴하고 있다.

    위에 쓰인 것 처럼 생략해도 무방하다.

    fun helloWorld() : Unit {
    	println("hello world!")
    }

     

    파라미터와 리턴 타입이 있을 때

    '변수 이름 : 변수 타입' 과 같은 형태로 작성한다.

     

    fun add(a: Int, b: Int): Int {
        return a + b
    }

     

    변수

    val 

    👉🏻 value

    👉🏻 바뀌지 않는 것을 의미한다. (final)

     

    var

    👉🏻 variable

     

    fun variable() {
        // 타입 생략해주어도 무방함
        val a = 10
        var b = 9
    
        // 선언만 먼저 할 경우에는 타입을 지정해주어야함
        val c : Int
        c = 10
    }

     

     

    String Template

    "my name is $name" 처럼 변수 뒤에 공백이 있는 경우

    {} 괄호를 생략해도 무방하지만

    띄어쓰기를 할 수 없는 경우는 {}를 붙여줘야 한다.

     

    "내 나이는 ${age}살 입니다." 같은 경우 말이다.

        val name = "spin"
        val lastName = "Kim"
        println("My name is ${name + lastName}. I'm 23.")
        // My name is spin Kim. I'm 23.

     

     

    $ 기호를 출력문 내에서 사용하고 싶다면
    \를 사용하면 됨 (이스케이프 문자)

        println("This is \$a")

     

    조건문

    if

    우리가 아는 기존의 if문

    또 코틀린에는 삼항 연산자가 없으므로 다음과 같이 사용할 수 있다.

    fun maxBy(a: Int, b: Int) = if (a > b) a else b

    when

    자바의 switch 와 비슷한 친구

    else 는 없어도 문제 없다.

      when (score) {
            0 -> println("this is 0")
            1 -> println("this is 1")
            2, 3 -> println("this is 2 or 3")
            else -> println("this is what")
        }

    복수 지정과 범위 지정도 가능하다.

      when (score) {
            in 90..100 -> println("you are genius")
            in 10..80 -> println("not bad")
            else -> println("okay")
        }

     

    리턴값으로도 가능하다.

    이때는 반드시 else 를 지정해주어야 한다.

     var b = when (score) {
            1 -> 1
            2 -> 2
            else -> 3
        }

     

    Expression 과 Statement

    👉🏻 무언가를 뚱땅뚱땅 해서 만들면 expression

    👉🏻 실행하도록 지시하는 것은 statement (명령을 내리는 것)

     

    👉🏻 코틀린의 모든 함수는 expression 의 성격을 가진다.

    (위에서 말했듯 리턴 값이 없는게 아니라 unit을 리턴함)

     

    👉🏻 자바의 void 는 statement

    자바에서는 statement 로 사용되었던 if문이 코틀린에서는 expression 으로 사용될 수 있다.

     

    Array

    배열은 기본적으로 mutable

    👉🏻 변경이 가능하다.

     

    배열 생성 및 초기화

    val array = arrayOf(1, 2, 3)

    타입이 달라도 상관없다.

    타입이 Any로 변경된다.

    Array<Any>

    val array2 = arrayOf(1, 2, "apple")

    선언만 먼저 할 경우 

     

    크기가 10인 배열을 생성한다.

    val arr = arrayOfNulls<Int>(10)

     

     

    List

    👉🏻 immutable 

    👉🏻 mutable

    로 나뉜다.

     

    immutable

    get 으로 읽어올 수는 있지만 변경은 할 수 없다.

    val list = listOf(1, 2, 3)
    //list[0] = 4 (x)

     

    mutable

    val mutableList = mutableListOf<Int>()
        mutableList.add(2)
        
    val arrayList = arrayListOf<Int>()
       arrayList.add(10)
        arrayList.add(20)

     

    반복문

    for

       val students = arrayListOf("joyce", "james", "jenny", "jane")
        for (name in students){
            println("$name")
        }
        
        for((index, name) in students.withIndex()){
            println("${index+1}번째 학생 $name")
        }
        var sum : Int = 0
        for (i in 1..10) {// 1부터 10까지
            sum += i
        }

    step n : n 씩 증가

    downTo n : n씩 감소

    in 1..10 : int i = 1 ; i <= 10 과 같음

    until 10 : int i = 1 ; i < 10 과 같음 

     

    while 

    은 우리가 아는 while 과 같다

     

    Nullable 과 NonNull

    자바의 Null Pointer Exception(NPE) 은 런타임에 일어나서 개발자가 잡아주기 쉽지 않다.

    잡아주기 위해서 일정 노력이 필요하다..수많은 if문들

     

    코틀린은 컴파일 시점에 이를 잡아낸다.

     

    타입을 생략하면 기본적으로 NonNull 이다.

     var name = "joyce"
     // var age : String = null (x)

    따라서 해당 작업에는 무리가 없다.

     var nameInUpperCase = name.uppercase(Locale.KOREA)

     

    ?

    Nullable 변수를 보자

    val nullName : String? = null

    같은 작업을 하려고 하면 아래와 같이 바꿔주라고 에러가 뜬다.

    nullName 이 null 이면 nullNameUpperCase 도 null이 된다.

    var nullNameInUpperCase = nullName?.uppercase(Locale.KOREA)

     

    ?:

    앨비스 연산자라고도 한다. (90도 돌려서 보면 ㅋㅋㅋㅋㅋ)

    디폴트 값을 주고자 할 때 사용한다.

    val lastName : String? = "jung"
    val fullName = name + " " + (lastName?: "No lastName")
    
     // null : joyce No lastName
     // not null : joyce jung

     

     

    !!

    하늘이 두쪽나도 null이 아닐 경우 사용

    null 이 아님을 보장하는 것

    근데 null이면 NPE를 일으키기 때문에 

    확실한게 아니면 사용하는 것을 자제하는 것이 좋다고 한다.

     

    fun ignoreNull(str: String?){
        val mNotNull : String = str!!
        val upper = mNotNull.uppercase()
    }

     

    let

    자신의 리시버 객체를 람다식 내부로 옮겨서 사용하는 것

     

    val email : String? = null
    val email : String? = pin@gmail.com
    email?.let{
        println("my email is $it")
        // not null : my email is pin@gmail.com
        // null : nothing
    }

     

     

    728x90
    반응형
    댓글