[Android Studio] 3장 - 코틀린 문법 정리 (2)

이상협·2022년 9월 3일
3
post-custom-banner

변수 선언

val

val 변수명: 타입 =

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

var

var 변수명: 타입 =

variable의 줄임말로 초깃값이 할당된 후에도 값을 바꿀 수 있는 변수

타입 지정

val data1: Int = 10
val data2 = 10

data1처럼 명시적으로 타입을 선언 할 수도 있고,
타입을 명시하지 않아도 선언한 값에 따라 자동으로 타입이 지정 됨

초깃값 할당

val data1: Int // 오류
val data2 = 10 // 성공

fun printData() {
	val data3: Int
    println("$data3") // 오류
    data3 = 10
    println("$data3") // 성공
}

class user {
	val data4: Int      // 오류
    val data5: Int = 10 // 성공
}

최상위에 선언한 변수 또는 클래스의 멤버 변수는 선언 동시에 초깃값을 할당해야 함

초기화 미루기

lateinit var data1: String // 성공
lateinit val data2: Int    // 오류
lateinit val data3: String // 오류

lateinit은 var만 사용 가능
Int, Long, Short, Double, Float, Boolean, Byte에는 불가능

val data4: Int by lazy {
	println("in lazy......")
    10
}

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

/*실행결과
in main......
in lazy......
10
*/

by lazy {}는 변수가 최초로 사용되는 순간 중괄호로 묶은 코드 부분이 실행되고, 중괄호 부분의 마지막 줄이 변수의 초깃값이 됨


데이터 타입

String

fun main() {
	val str1 = "Hello \nWorld"
    val str2 = """
    	Hello
        World
    """
    println("$str1")
    println("$str2")
}

/* 실행결과
Hello
World

	Hello
    World
*/

Unit (반환문이 없는 함수)

fun some(): Unit {
	println(10 + 20)
}

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

val data1: Nothing? = null

Nothing으로 선언한 변수에는 null만 대입 가능
데이터로서는 의미 X

널 허용과 불허용

var data1: Int = 10
data1 = null // 오류

var data2: Int? = 10
data2 = null // 성공

타입 뒤에 물음표를 추가하면 널 허용으로 선언


함수 선언하기

매개변수 변경 오류

fun some(data1: Int) {
	data1 = 20 // 오류
}

매개변수는 자동으로 val로 적용되며 변경 불가능

기본값 활용

fun main() {
	fun some(data1: Int, data2: Int = 10): Int {
    	return data1 * data2
    }
    
    println(some(10))
    printlne(some(10,20))
}

/* 실행결과
100
200
*/

매개변수에 기본값을 선언했다면 그 인자를 호출하지 않아도 선언문에서 명시한 기본값이 적용됨

매개변수명 지정 호출

some(data2 = 20, data1 = 10)

매개변수명을 지정 호출하게 되면 순서와 상관없이 지정 가능


컬렉션 타입

Array

val data1: Array<Int> = Array(3, { 0 }) /* data1 : {0, 0, 0} */
data1[0] = 10
data2[0] = 20
data1.set(2, 30)

/* data1 : {10, 20, 30}
   data1.size : 3
*/

배열의 데이터를 접근 할 경우 []를 이용해도 되고, set()이나 get()을 사용 가능

기초 타입의 배열

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

BooleanArray, ByteArray, CharArray, DoubleArray, FloatArray, IntArray, LongArray, ShortArray 클래스 사용 가능

val data1 = arrayOf<Int>(10, 20, 30)

arrayOf를 사용하면 배열 선언 시 값 할당 가능
arrayOf도 기초타입 배열 사용 가능


List, Set, Map

Collection 인터페이스를 타입으로 표현한 클래스

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

Set: 순서가 없으며 데이터의 중복 허용 X

Map: 키와 값으로 이루어진 데이터 집합으로 순서가 없으며 키의 중복 허용 X

가변클래스와 불변클래스

구분타입함수특징
ListListlistOf()불변
MutableListmutableListOf()가변
SetSetsetOf()불변
MutableSetmutableSetOf()가변
MapMapmapOf()불변
MutableMapmutableMapOf()가변

불변 클래스는 size()와 get() 함수만 사용 가능하지만,
가변 클래스는 add()와 set() 함수도 사용할 수 있음

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

map은 키와 값을 pair 객체로 표현 하거나 키 to 값으로 표현 가능


조건문과 반복문

if~else

if () {
	...
} else {
	...
}

if () {
	...
} else if () {
	...
} else {
	...
}

기존 문법과 동일

if - 표현식으로 사용

val result = if (data > 0) {
	true
} else {
	false
}

if 나 else 각 영역의 마지막 줄이 반환값에 해당

조건문 when

var data = 10
when(data) {
	is String -> println("string")
	10 -> println("10")
    20 -> println("20")
    in 20..30 -> println("20..30")
    else -> {
    	println("else")
    }
}

switch문과 유사

var data = 10
when {
	data <= 0 -> println(" <= 0 ")
    data > 100 -> println(" > 100 ")
    else -> println("else")
}

if 문처럼 조건만 명시해서 사용 가능

for와 while

var sum: Int = 0
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씩 감소
var data = arrayOf<Int>(10, 20, 30)
for(i in data.indices) {
	print(data[i])
    if (i !== data.size-1) print(",")
}

/* 실행결과
10, 20, 30
*/

컬렉션 타입 활용 예

var data = arrayOf<Int>(10,20,30)
for((index, value) in data.withIndex()){
	print(value)
}

withIndex()를 사용해 인덱스 가져오기

var x = 0
var sum1 = 0
while(x < 10) {
	sum1 += ++x
}

while 사용 예


참고

Do it! 깡쌤의 안드로이드 프로그래밍 with 코틀린 (개정판)
post-custom-banner

0개의 댓글