Programing/Android(Kotlin)

Kotlin(코틀린) 기본 문법 정리

hye3193 2023. 4. 1. 13:51

코틀린 언어의 특징

* 변수나 함수를 소스 최상위에 선언 가능

* 코틀린 변수는 var(가변), val(불변)으로 선언

* 코틀린의 모든 타입은 객체다

* List, Set, Map 타입은 가변과 불변으로 구분해서 사용

* if, when 조건문을 표현식으로 사용 가능


변수와 함수

변수 선언

var 변수명: 타입 = 값 (대입값으로 타입 유추 가능할 경우, 타입 선언 생략 가능)

* 최상위 선언한 변수는 초깃값 할당 필수, 함수 내부 선언 변수는 초깃값 필수X

 

기초 타입: Int, Long, Short, Float, Double, Char, Boolean, Byte

 

키워드

val (value): 초깃값 할당 이후 변경 불가

var (variable): 초깃값 할당 이후 변경 가능

 

초깃값 할당 미루기

lateinit: 변수 선언 맨 앞에 위치

* 기초 타입 객체(정수형, 실수형, boolean, byte)에는 사용 불가

lazy { }: 변수 선언 맨 뒤에 위치

* 변수 이용 시점에 중괄호 속 코드 실행, 마지막 줄 실행 결과가 초깃값으로 설정

 

타입

Any: 코틀린 최상위 클래스, 모든 타입의 데이터 할당 가능

Unit: 반환문이 없음을 명시적으로 나타낼 때 사용

Nothing: null이나 예외를 반환하는 함수

+) 타입 뒤에 ? 추가 시 널 허용(null값 대입 가능)

 

문자열 템플릿: $

ex. $변수명, ${10 + 20}

 

함수 선언

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

* 반환 타입 생략 시 자동으로 Unit 타입 적용

* 매개변수는 자동으로 val 키워드 적용, 함수 내에서 매개변수값 변경 불가, 매개변수에 기본값 설정 가능

 

함수 호출

함수명(매개변숫값) > 순서대로 할당

함수명(매개변수명 = 매개변숫값) > 지정한 대로 할당

 

배열(Array)

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

> <Int>: 정수 배열, <String>: 문자열 배열 …

> 첫번째 매개변수(3): 배열의 크기

> 두번째 매개변수({ 0 }): 초깃값 지정함수

* 기초 타입 데이터라면 Array<Int>, Array<Float> 대신 IntArray, FloatArray 등의 클래스로 이용도 가능

 

array0f(): 배열 선언 시 값 할당 가능

ex. val data1 = array0f<Int>(1, 2, 3)

* 마찬가지로 기초 타입 데이터라면 intArray0f() 등으로 사용 가능

 

컬렉션 타입 클래스

List: 순서 O, 데이터 중복 허용

Set: 순서 X, 데이터 중복 불허

Map: 키와 값으로 이루어짐, 키의 중복 불허(타입은 키와 값 두 개를 지정해야 함)

> Pair(키, 값) 또는 키 to 값 사용

* lisf0f(), set0f(), map0f() 함수는 불변(immutable) 클래스, size(), get() 함수만 제공

* mutableLisf0f(), mutableSet0f(), mutableMap0f() 함수는 가변(mutable) 클래스, add(), set() 함수까지 제공

 

데이터 접근

data1[1] = 15 ↔ data1.set(1, 15)

data1[0]  data1.get(0)

add(인덱스, 값)

set(인덱스, 값)


조건문과 반복문

코틀린에서 if~else 표현식 사용 가능

ex.

var data1 = 10

val result = if (data > 0){

    println("data > 0")

    true

} else {

    println("data <= 0")

    false

}

* true와 false는 각각 참일 때, 거짓일 때 반환값

* 표현식으로 사용할 경우 else 생략 불가능

 

조건문 when

ex.

var data = 10

when(data){

    10 -> println("data = 10")

    20 -> println("data = 20")

    else -> {

        println("data is not valid data")

    }

}

* 정수가 아닌 다른 타입 데이터도 사용 가능

+) 10, 20 대신

is String: data가 문자열 타입이라면(is: 타입 확인 연산자)

20, 30: data 값이 20 또는 30이라면

in 1..10: data 값이 1~10 사이의 값이면(in: 범위 지정 연산자)

* 데이터 명시((data)) 생략하고 조건만 명시 가능
* 표현식으로 사용 가능, 단 else 생략 불가능

 

반복문 for

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씩 감소
// *숫자 대신 컬렉션 타입 데이터 개수만큼 반복

for (i in 리스트명.indices): // 인덱스값을 i에 가져옴

for ((index, value) in 리스트명.withIndex()): // 인덱스와 실제 데이터값 함께 가져옴

 

반복문 while

조건이 참일때 중괄호 안 영역 반복 실행


클래스와 생성자

클래스 선언

class User{ }

 

오버라이딩(overriding): 상위 클래스의 변수나 함수를 같은 이름으로 하위 클래스에서 다시 선언

상위 클래스 선언 앞에 open 키워드 & 하위 클래스 선언 앞에 override 붙이기

 

데이터(data) 클래스

객체 비교 시, 객체 자체가 아니라 객체의 데이터를 비교

일반적으로 주 생성자에 val, var 키워드로 매개변수 선언하여 클래스의 멤버 변수로 활용

 

오브젝트 클래스

익명 클래스(anonymous class)를 만들 목적으로 사용

선언과 동시에 객체를 생성한다는 의미

val obj = object: Super(){
	var data = 10
    fun main(){
    	println(data)
    }
}

* object: 타입() 까지 입력해서 선언할 것 (보편적) 

 

컴패니언 클래스

멤버 변수나 함수를 클래스 이름으로 접근할 때 사용

객체를 생성하지 않고도 클래스 이름으로 특정 멤버 이용 가능(일반적으론 객체를 생성해서 접근)

// 일반적인 접근
class Myclass{
	var data = 10
    fun some(){
    	println(data)
    }
}

fun main(){
	val obj = MyClass() // 객체 생성
    obj.some() // 객체명으로 접근
}


// 컴패니언 클래스의 접근
class Myclass{
	companion object{
    	var data = 10
    	fun some(){
    		println(data)
    	}
    }
}

fun main(){
	MyClass.some() // 클래스명으로 접근 가능
}

람다 함수와 고차 함수

타입 별칭(typealias): 함수, 데이터 타입을 선언할 때 사용

typealias FunType = (Int, Int) -> Boolean

fun main(){
	val  someFun: FunType = {no1: Int, no2: Int -> no1 > no2}
}

 

람다 함수: 익명 함수 정의 기법, 함수를 간단하게 정의할 때 이용

// 람다 함수 선언
{ 매개변수 -> 함수 본문 }

// 선언과 호출 #1
val sum = {no1: Int, no2: Int -> no1 + no2}
sum(10, 20)

// 선언과 호출 #2
{no1: Int, no2: Int -> no1 + no2} (10, 20)

// 선언과 호출 #3
val sum: (Int, Int) -> Int = {no1: Int, no2: Int -> no1 + no2}

* 함수 본문의 마지막 표현식은 함수의 반환값

* 함수명으로 호출이 불가, 보통 변수에 대입하여 사용

* 매개변수 없을 경우, 생략 가능(화살표까지 생략 가능)

* 유추가 가능한 경우, 매개변수 혹은 변수 선언 시 타입 생략 가능

 

고차 함수: 함수를 매개변수로 전달받거나 반환하는 함수

fun some(arg: (Int) -> Boolean): () -> String{
	val result = if(arg(10)){
    	"valid"
    }
    else{
    "invalid"
    }
    return {"some result : $result"}
}
fun main(){
	val result = some({no -> no > 0})
    println(result())
}

// 실행결과
some result : valid