코틀린 언어 소개 / 변수와 함수

2022. 12. 4. 01:15_Study/AndroidStudio

728x90

코틀린 언어 소개


본 자료는 강의 학습자료 입니다.

 

 

코틀린의 등장 배경

 

 

코틀린은 젯브레인스(JetBrains)에서 오픈소스 그룹을 만들어 개발한 프로그래밍 언어로 2017년 구글에서 안드로이드 공식언어로 지정하였다. JVM에 기반을 둔 언어로 자바소스와 굉장이 비슷하다. 따라서 큰 강점이 있다.

 

- 최신 언어 기법을 이용하면 훨씬 간결한 구문으로 프로그램을 작성할 수 있다.

- 코틀린은 널 안정성null Safety을 지원하는 언어이다.

- 코틀린은 자바와 100% 호환된다.

- 코루틴 coroutines 라는 기법을 이용시 비동기 프로그래밍을 간소화 할 수 있다.

 

 

코틀린 소스 -> 자바 바이트코드 -> 자바 가상머신

 

 

 

코틀린 소스를 테스트하는 방법

코틀린 소스를 테스트하는 방법 main()/ 함수 실행방법 (tistory.com)

fun main(){
	println("hello world")
}

 

링크참고

 


변수와 함수

 

변수 선언하기

변수는 val, var 키워드로 선언

val은 value의 줄임말로 초깃값이 할당되면 바꿀 수 없는 변수를 선언

var는 variable의 줄임말로 초깃값이 할당된 수헤옫 값을 바꿀 수 있는 변수를 선언

 

val 변수명: 타입 = 값

 

  • 타입 지정과 타입 추론
    • 변수명 뒤에는 콜론(;)을 추가해 타입을 명시
    • 대입하는 값에 따라 타입을 유추할 수 있을 때에는 생략
  • 초깃값 할당
    •  최상위에 선언한 변수나 클래스의 멤버 변수는 선언과 동시에 초깃값을 할당해야하며(전역변수로 선언), 함수 내부에 선언한 변수는 선언과 동시에 초깃값을 할당하지 않아도 됩니다.(field가 됨)
package com.example.ch3

fun main(){
    println("in main....")
    someFun()
}

val data1: Int // 오류 : 최상위에 선언 동시에 초깃값
val data2 = 10

fun someFun(){
    var data3: Int // 함수내부라서 가능
    println("data3: $data3") // 오류 : 값이 없음.
    data3 =10
    println("Data3: $data3")
}

class User {
    val data4: Int // 오류 : 클래스말고 함수내부만 가능
    val data5: Int = 10
}

 

 

  •  초기화 미루기 (늦은 초기화)
    • lateinit 키워드는 이후에 초깃값을 할당할 것임을 명시적으로 선언
    • var 키워드만 가능
    • String가능. Int, Long, Short, Float, Boolean, Byte 타입 불가
    • by lazy{} 형식으로 선언, 소스에서 변수가 최초로 이용되는 순간 묶은 부분이 자동으로 실행되어 그 결괏값이 변수의 초깃값으로 할당
  • by lazy 실행화면

 

package com.example.ch3

val data by lazy{
    println("lazy")
    10
}

fun main(){
    println("in main....")
    println(data+4)
    println(data+10)
}

 

  • 데이터 타입 : 코틀린의 모든 변수는 객체

토끼가 있는 두줄은 같은 객체이다.
같아서 30이 되었다.

 

Int, Short, Long, Double, Float, Byte, Boolean - 기초 타입 객체

Char, String - 문자와 문자열

변수 설정시 주의해야한다.

 

 - String 타입의 데이터는 큰따옴표나 삼중따옴표로 감싸서 표현

package com.example.ch3

fun main(){
    println("in main....")

    var str1 = "Hello \n world"
    var str2 = """
        Hello
        WORLD
    """.trimIndent()
    println(str1)
    println(str2)
}

 

 

문자 표현

 

오류가 뜨는 이유?

아스키코드처럼 if 문을 숫자로 변환하여 사용할 수 없다.

이것도 안 된다.
equals 함수를 사용해야 한다.

 

문자열 템플릿 : String 타입의 데이터에 변숫값이나 어떤 연산식의 결괏값을 포함해야 할 때는 $ 기호를 이용해야 한다.

 

package com.example.ch3

fun main(){
    println("in main....")
    fun sum(no: Int):Int{
        var sum =0
        for(i in 1..no){
            sum += i
        }
        return sum
    }

    val name: String = "kkang"
    println("name : $name, sum ${sum(10)}, plus : ${10+20}")
}

 

Any - 코틀린에서 최상위 클래스 : Any 타입 변수에는 모든 타입의 데이터 할당이 가능하다.

Unit - 데이터의 형식이 아닌 특수한 상황을 표현 : Unit 타입 변수 선언은 가능하나 의미는 없음

-  반환문이 없는 함수의 반환타입으로 주로 사용

-  함수의 반환 타입을 생략하면 자동으로 Unit이 적용된다.

 

 

Nothing : 의미 있는 데이터가 아닌 특수한 상황을 표현

- Nothing으로 선언한 변수에는 null 만 대입할 수 있음

- 함수의 반환타입이 Nothing 이면 반환은 하지만 의미 있는 값은 아니라는 의미

- 항상 null 만 반환하는 함수나 예외를 던지는 함수의 반환 타입을 Nothing 으로 선언

 

널 허용과 널 불허용 (nullable vs not null)

- 널 허용 변수: 타입 뒤에 ?를 붙여서 변수선언

- 널 불허용 변수 : 타입 뒤에 ? 없이 변수 선언

 

 

 

package com.example.ch3

fun main(){
    println("in main....")

    val data1: Nothing? = null
    val data10 : Nothing =null
    //val data2: Any = null // ? 없으면 any도 안되나봄
    val data3: Any? = null


    var data5 : Int =10
    //data5 = null // ? 없음

    var data6: Int? = 10
    data6 = null

    fun some1():Nothing?{
        return null
    }

    fun some2(): Nothing{
        throw java.lang.Exception()
    }

    fun some3(): Nothing{
        throw null // ? 없어서 오류
    }

    some1()
    some2()
}

nothing 이라도 ?가 없으면 null을 집어 넣을 수 없다.

nothing? = null

nothing = Exception() 

 

 

함수 선언하기

함수를 선언하려면 fun이라는 키워드를 이용한다.

반환타입을 선언할 수 있으며 생략하면 자동으로 Unit 타입이 적용된다.

함수의 매개변수에는 var나 val 키워드를 사용할 수 없으며 val이 자동으로 적용된다.

함수의 매개변수값을 변경할 수 없다.

 

fun 함수명(매개변수명 : 타입): 반환타입 {...}

 

함수의 매개변수에는 기본값 선언이 가능하다.

 

package com.example.ch3

fun main(){
    println("in main....")

    fun some(data1:Int, data2:Int =10): Int{
        return data1*data2
    }

    println(some(10))
    println(some(10,20))

}

 

매개변수명을 지정하여 호출하는 것을 명명된 매개변수 라고 하며, 이렇게 하면 함수 선언문의 매개 변수 순서에 맞춰 호출하지 않아도 된다.

 

 

컬렉션 타입

 

Array - 배열 표현

 

배열은  Array 클래스로 표현하며 배열의 데이터에 접근할 땐 대괄호를 이용해도 되며 set() 이나 get() 함수를 이용해도 된다.

val data1: Array<Int> = Array(3,{0})

 

기초 타입의 배열

- 기초타입이라면 Array를 사용하지 않고 BooleanArray, ByteArray, CharArray, DoubleArray, FloatArray, IntArray, LongArray, ShortArray 클래스를 이용할 수도 있습니다.

 

    val data2: BooleanArray = BooleanArray(3,{false})

 

arrayOf()라는 함수를 이용하면 배열 선언시 값을 할당할 수 있다.

기초타입 대상으로하는 함수를 제공한다. ex) booleanArrayOf()

package com.example.ch3

fun main(){

    val data1 = intArrayOf(10,20,30)
    val data2 = booleanArrayOf(true,false,true)
    val data3 = arrayOf<Int>(100,200,300)
}

 

 

List, Set, Map

- List : 순서가 있는 데이터 집합으로 데이터의 중복을 허용

- Set : 순서가 없으며 데이터 중복을 허용하지 않음.

- Map: 키와 값으로 이루어진 데이터 집합으로 순서가 없으며 키의 중복은 허용하지 않음

 

collection 타입은 가변 클래스와 불변클래스로 나뉘며

- 불변 클래스 : 초기에 데이터를 대입하면 더이상 변경할 수 없음

- 가변 클래스 : 초깃값을 대입한 이후에도 데이터를 추가하거나 변경할 수 있음 (mutable)

 

구분 타입 함수 특징
List List listOf() 불변
MutableList mutableListOf() 가변
Set Set setOf() 불변
MutableSet mutableSetOf() 가변
Map Map mapOf() 불변
MutableMap mutableMapOf() 가변

 

   var list = listOf<Int>(10,20,30)
    var mutableList = mutableListOf<Int>(10,20,30)

- Map 객체는 키와 값으로 이루어진 데이터의 집합

- Map 객체의 키와 값은 Pair 객체로 이용할 수도 있으며 'key to value' 형태로 이용할 수 있다.

 

  var map = mapOf<String, String>(Pair("one","hello"),"two" to "world")