03.[코틀린 Kotlin 기본]

728x90

[03. 코틀린 시작하기]

[03-1. 코틀린 언어 소개]

[코틀린 Kotlin]

-코틀린 : 젯브레인스에서 오픈소스 그룹을 만들어 개발한 프로그래밍 언어.

-코틀린으로 안드로이드 앱 개발 가능한 이유는 자바 가상 머신 JVM 기반 언어이기 때문

      -코틀린 컴파일러가 (.kt) 파일 컴파일하면 자바 바이트 코드 만들어짐

      -, 코틀린 파일 컴파일하면 자바 클래스가 만들어지고 이를 JVM 이 실행함

[코틀린 개발 장점]

-표현 간결함

-널 안정성 지원 언어 : null허용/불허용 구분 선언하므로 널 안정성 확보

-상호 운용성 : 자바-코틀린 혼용가능. 호환가능

-구조화 동시성 : 코루틴 기법 사용시 비동기 프로그래밍 간소화 가능

[코틀린 파일 구성] : .kt 파일

-코틀린 파일명은 클래스명과 다르게 선언해도 O

-package(패키지) : 클래스 파일 위치/이름 파일 위치와 상관없어도 됨

-import(임포트) : 외부 파일 멤버(변수/함수/클래스) 사용을 위해 포함시킴

-코틀린 파일 컴파일하면 자동으로 파일명+Kt’ 이름의 클래스에 포함됨

-따라서, 자바에서 코틀린의 멤버 참조 시, 해당 클래스 이름으로 접근하여 사용 O

ex.) User.kt 파일 -> 컴파일 -> UserKt.class -> 자바에서 해당 클래스로 접근하여 사용

두 개의 다른 코틀린 파일이 있다고 가정.
한 파일에서 다른 파일의 멤버 참조를 원하는 상황.
1) 동일 패키지 소속 파일 멤버 참조 시 -> 별도의 import 없이 사용 O
2) 다른 패키지 소속 파일 멤버 참조 시 -> import로 사용할 멤버 지정 필요

[코틀린 소스 테스트 방법] : 간단 소스

-코틀린 언어로 작성된 간단한 소스 파일 실행을 원할 경우

[New -> Kotlin CLass/File -> File] -> 소스파일의 main() 있는 곳 실행


[03-2. 변수와 함수]

[변수 선언키워드 : val , var

val : 최초 할당된 초기값 변경 불가 변수. (불변)

var: 최초 할당된 초기값 변경 가능 변수. (가변)

val 변수명:타입 =
var 변수명:타입 =

 

[타입 지정과 타입 추론]

    1) 변수 명시적 타입 지정

           val data1: Int = 10

    2) 변수 자동 타입 지정 (대입값으로 타입 추론 가능할 경우 생략O)

          val data1 = “문자열

[초기값 할당]

-최상위 선언 변수/ 클래스의 멤버 변수 : 선언과 동시에 초기값 할당 필수

-함수 내부 선언된 변수 : 필수 X -> , 내부에서 이용할 변수에는 값 할당 후 사용해야 함

[초기화 미루기] : lateinit / lazy 키워드

-선언과 동시에 초기값 할당이 필수인 변수에 대해 그럴 수 없는 경우에 한해서 컴파일러에게 초기화를 미루겠다고 알려줘야 함

      lateinit 키워드:이후에 초기값 할당 명시적 선언

-var 변수에만 사용 가능

-Int/Long/Short/Double/Float/Boolean/Byte 등 기초 타입에는 사용 불가

lateinit var data3 : String

      lazy 키워드 : 변수 선언 뒤에   by lazy { } 형식 선언

-해당 변수 사용할 때 lazy로 선언된 { } 중괄호 내부가 자동 실행 되어 그 결괏값이 변수 초깃값으로 할당됨

-lazy 문의 { } 내부 여러 줄 작성된 경우 -> 마지막 줄 실행 결과를 초깃값으로 할당

val data4 : int by lazy {
    println(“in lazy .....”)
    10
}

 

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

[기초 타입 객체] : Int/Short/Long/Double/Float/Byte/Boolean

-기초 데이터를 객체로 표현한 타입

  ▷[문자/문자열 객체] : Char/ String

-Char(문자) : ‘ ’ 작은 따옴표로 감싸서 표현

-String(문자열) : “” 큰 따옴표 / “““ 삼중 따옴표로 감싸서 표현

<문자열 템플릿>
-String 타입 데이터에 변수값 or 어떤 연산식의 결과값 포함해야 할 경우.
                    즉, 문자열로 출력할 경우, 내부에 연산 결과값 넣거나 할 때 형식지정자 대신  $ 기호 사용함

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

  [Any 타입] : 모든 타입 할당 가능한 최상위 클래스

-Any타입으로 선언된 변수에는 모든 타입의 데이터 할당 가능

       ex. val data1: Any = 10

  [Unit 타입] : 함수 반환 타입이 없음을 명시적 지정

-보통 반환 타입 없는 함수는 타입 생략 O -> 이 경우 자동으로 Unit 적용됨

-명시적 지정 원할 경우 Unit 타입으로 반환 타입 명명

      ex. fun some() : Unit { ... }

  [Nothing 타입] : null/예외 반환하는 함수

-Nothing 타입 변수에는 null만 대입 가능

-함수 반환 타입이 Nothing 타입이면 의미없는 값을 반환하는 함수를 의미

ex. fun some() : Nothing { ...}

  [널 허용/불허용]

-null : 객체 생성됐으나 값이 할당되지 않은 경우 -> null

-코틀린은 모든 타입이 객체이므로, null을 가질 수 있기 때문에 널 허용/불허용 구분 필요

변수 선언 시 타입 뒤에 물음표(?) 여부로 구분

1) 널 허용 : 타입 뒤 물음표 O
ex. var data: Int ? = 10 (널 허용 변수)
2) 널 불허용 : 타입 뒤 물음표 X
ex. var data : Int = 100 (널 불허용 변수)

[함수 선언] : fun 키워드

-함수 매개변수에는 val 자동 적용되므로 따로 키워드 선언 X

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

-함수 안에서 매개변숫값 변경 불가능

-함수의 매개변수에 기본값 선언 가능

    ex. fun some(data1: Int, data2: Int = 10) : Int { ... } 로 선언한 경우

이후, 해당 함수 호출할 때 data2에 해당하는 인수 안줘도 기본값 적용된다.

[매개변수가 여러개일 경우 호출 방법]

    1) 순서대로 인자 전달

-some(10, 20)

    2) 매개변수명 지정하여 호출 : 명명된 매개변수

-이 경우 순서 안지켜도 됨

-some(data2 = 20, data1 = 10) 으로 호출 가능


[컬렉션 타입]

-여러 데이터 표현하는 방법

-Array/List/Set/Map

   [Array] : 배열 타입

-배열 내부 데이터 접근 시 1) [] 대괄호 사용

                                   2) set(). get() 함수 이용

val data1 : Array<Int> = Array(3, {0})
            //0으로 초기화한 3개 정수형 배열 선언

            //제네릭으로 내부 데이터 타입 선언 Array<Int>
            //Array 생성자로 값 지정
-> 첫 매개변수 = 배열 크기
-> 두 번째 매개변수 = 람다식 결과값을 초기값으로 지정.

 [기초 타입 배열]

-다만, 기초 타입 배열에 대해서는 각 기초 타입에 해당하는 배열 클래스를 이용할 수도 O

-BooleanArray/ByteArray/CharArray/DoubleArray/FloatArray/IntArray/LongArray...

val data1 : IntArray(3, {0})

-arrayOf() 함수 : 배열 선언과 동시에 값 할당 함수

val data1 = arrayOf<Int> (10, 20, 30) //크기 3인 배열 선언과 동시에 값 할당

-기초 타입 대상 arrayOf() 함수

ex. intArrayOf() / booleanArrayOf() /byteArrayOf() / byteArrayOf() / longArrayOf()

   [List/Set/Map] : 컬렉션 인터페이스 타입으로 표현한 '컬렉션 타입 클래스'

List 순서 O 데이터 중복 O 데이터 집합
Set 순서 X 데이터 중복 X 데이터 집합
Map 순서 X 키 중복 X 키와 값으로 이루어진 데이터 집합

-컬렉션 타입 클래스: 가변/불변 클래스로 나뉨

가변 클래스 :초기 대입한 데이터 변경 가능한 클래스 타입
불변 클래스 :초기 대입한 데이터 변경 불가한 클래스 타입

-가변 클래스 타입에 대해서만 add(), set() 함수 이용하여 데이터 조작 가능

-가변 클래스 : MutableList/MutableSet/MutableMap

     -listOf() 함수 : List 객체 만들고 매개변수에 초기값 대입함
     -MutableListOf() 함수 : List 객체 만든 후 내부 데이터 추가/변경 간으
     -setOf() 함수
     -MutableSetOf() 함수
     -mapOf() 함수
     -MutableMapOf() 함수

[03-3. 조건문과 반복문]

[조건문] : 조건에 따른 흐름 제어문

 [if-else]

-표현식으로도 사용 O (결과 반환하는 식)

-각 영역의 마지막 줄에 해당한느 결괏값을 반환

val result = if (data > 10) {
  println(“data > 10”)
  true  //이 조건식 참인 경우 반환값 
}else {
  printfln(“data > 0 && data <= 10) {
  false 
}

 [when ]

-표현식으로도 사용 O (결과 반환하는 식)

when (data) {
 “hello” -> println(“이 구문 실행”)
 “world” -> println(“이 구문 실행”)
  else -> {
     println(“data”)
   }​

[반복문]

 [for ]

for(i in 1..10) {
sum += I
}

-for(i in 1..10) {...} : 1부터 10까지 1씩 증가하며 반복

-for(i in 1 until 10) {...} : 1부터 9까지 1씩 증가하며 반복

-for(i in 2..10 step 2) {...} : 2부터 10까지 2씩 증가하며 반복

-for(i in 10 downTo 1) {...} : 10부터 1까지 1씩 감소하며 반복

    [indices] : 증감 조건에 컬렉션 타입 데이터 개수만큼 반복하게 설정도 가능

fun main() {  var data = arrayOf<Int>(10. 20, 30)
  for(i in data.indices) {
     print(data[i])
     if(i !== data.size – 1) printf(“,”)
  }
}

    [withIndex() 함수] : 컬렉션 타입 인덱스 + 데이터 함께 가져옴

fun main() {   var data = arrayOf<Int>(10,20,30)
   for((index, value) in data.withIndex()) {
     print(value)
     if(index !== data.size –1) print(“,”)
  }
}

 [while ] : 조건문 참인 동안 { } 내부 반복 실행

while (x < 10) {
   sum += ++x
}
[참고] : Do It 안드로이드 앱 프로그래밍 with 코틀린 

728x90