๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Android

[Chap 3] ์ฝ”ํ‹€๋ฆฐ ์‹œ์ž‘ํ•˜๊ธฐ

by nitronium102 2021. 11. 19.

์ฝ”ํ‹€๋ฆฐ ์–ธ์–ด ์†Œ๊ฐœ

์ฝ”ํ‹€๋ฆฐ์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

- ์ฝ”ํ‹€๋ฆฐ์ด๋ž€? JetBrains์—์„œ ์˜คํ”ˆ ์†Œ์Šค ๊ทธ๋ฃน์„ ๋งŒ๋“ค์–ด ๊ฐœ๋ฐœํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด.

- ์ž๋ฐ”์˜ ๊ฐ€์ƒ๋จธ์‹ ์ธ JVM์— ๊ธฐ๋ฐ˜์„ ๋‘” ์–ธ์–ด. 

์ฝ”ํ‹€๋ฆฐ์˜ ์žฅ์ 

1) ํ‘œํ˜„๋ ฅ๊ณผ ๊ฐ„๊ฒฐํ•จ(expressive and concise) : ์ž๋ฐ”๋ณด๋‹ค ๊ฐ„๊ฒฐํ•œ ๊ตฌ๋ฌธ

2) ์•ˆ์ „ํ•œ ์ฝ”๋“œ(safer code) : ์ฝ”ํ‹€๋ฆฐ์€ Null safety๋ฅผ ์ง€์›

-> ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ฐ์ฒด๋Š” ๋„ ์ƒํƒœ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๋•Œ NullPointerException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ

์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ๋ณ€์ˆ˜๋ฅผ nullable๊ณผ not null๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์„ ์–ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— null๊ณผ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ด๊ฒฐ

3) ์ƒํ˜ธ ์šด์šฉ์„ฑ(interoperable) : ์ฝ”ํ‹€๋ฆฐ์€ ์ž๋ฐ”์™€ 100% ํ˜ธํ™˜. ์ž๋ฐ”์™€ ์ฝ”ํ‹€๋ฆฐ ํ˜ผ์šฉ ๊ฐ€๋Šฅ

4) ๊ตฌ์กฐํ™” ๋™์‹œ์„ฑ(structured concurrency) : ์ฝ”๋ฃจํ‹ดcorutines์„ ์ด์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ„์†Œํ™” ๊ฐ€๋Šฅ

- ๋„คํŠธ์›Œํฌ ์—ฐ๋™์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐฑ์‹  ๋“ฑ์— ์‚ฌ์šฉ

 

์ฝ”ํ‹€๋ฆฐ ํŒŒ์ผ ๊ตฌ์„ฑ

- ํ™•์žฅ์ž๋Š” '.kt'

- package ์ด๋ฆ„์€ kt ํŒŒ์ผ์˜ ์œ„์น˜์™€ ์ƒ๊ด€์—†๋Š” ๋ณ„๋„์˜ ์ด๋ฆ„์œผ๋กœ๋„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ์ปดํŒŒ์ผ๋œ ํด๋ž˜์Šค ํŒŒ์ผ์€ ๋ณ„๋„์˜ ์ด๋ฆ„ ํด๋”์— ์ƒ์„ฑ๋œ๋‹ค. 

- ์ฝ”ํ‹€๋ฆฐ ํŒŒ์ผ๋ช…์„ ํด๋ž˜์Šค ํŒŒ์ผ๋ช…๊ณผ ๋‹ค๋ฅด๊ฒŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

- ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” ํด๋ž˜์Šค ์•ˆ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค ๋ฐ–์—๋„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.(ํŒŒ์ผ๋ช…+Kt๋กœ ์ปดํŒŒ์ผ)

- ๊ฐ™์€ package ์•ˆ์— ์„ ์–ธ๋œ ํŒŒ์ผ์€ import ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜

๋ณ€์ˆ˜ ์„ ์–ธ

1) val(value) : ์ดˆ๊นƒ๊ฐ’์ด ํ• ๋‹น๋˜๋ฉด ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š” ๋ณ€์ˆ˜

2) var(variable) : ์ดˆ๊นƒ๊ฐ’์ด ํ• ๋‹น๋œ ํ›„์—๋„ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ

val(var) ๋ณ€์ˆ˜๋ช…: ํƒ€์ž… = ๊ฐ’
val data1 = 10

 

ํƒ€์ž… ์ง€์ •๊ณผ ํƒ€์ž… ์ถ”๋ก 

๋ณ€์ˆ˜๋ช… ๋’ค์—๋Š” ์ฝœ๋ก (:)์„ ์ถ”๊ฐ€ํ•ด ํƒ€์ž… ๋ช…์‹œ ๊ฐ€๋Šฅ.

๋Œ€์ž…ํ•˜๋Š” ๊ฐ’์— ๋”ฐ๋ผ ํƒ€์ž… ์œ ์ถ” ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ƒ๋žต ๊ฐ€๋Šฅ.

var data1: Int = 10

 

์ดˆ๊นƒ๊ฐ’ ํ• ๋‹น

- ์ตœ์ƒ์œ„์— ์„ ์–ธํ•œ ๋ณ€์ˆ˜/ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ : ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊นƒ๊ฐ’ ํ• ๋‹น ํ•„์š”

- ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์„ ์–ธํ•œ ๋ณ€์ˆ˜ : ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊นƒ๊ฐ’ ํ• ๋‹นํ•  ํ•„์š” X

 

์ดˆ๊นƒ๊ฐ’ ๋ฏธ๋ฃจ๊ธฐ

๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ดˆ๊นƒ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ - ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ฆผ ํ•„์š”

1) lateinit : ์ดํ›„์— ์ดˆ๊นƒ๊ฐ’์„ ํ• ๋‹นํ•  ๊ฒƒ์ž„์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ

- ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊นƒ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ ๋ชจ๋“  ์œ ํ˜•์˜ ๋ณ€์ˆ˜ ์„ ์–ธ์—๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€

- var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

- Int, Long, Short, Double, Float, Boolean, Byte ํƒ€์ž…์—๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€

lateinit var data: String

2) lazy : ์†Œ์Šค์—์„œ ๋ณ€์ˆ˜๊ฐ€ ์ตœ์ดˆ๋กœ ์ด์šฉ๋˜๋Š” ์ˆœ๊ฐ„ ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์€ ๋ถ€๋ถ„ ์ž๋™ ์‹คํ–‰๋˜์–ด ๊ทธ ๊ฒฐ๊ด๊ฐ’์ด ๋ณ€์ˆ˜ ์ดˆ๊นƒ๊ฐ’์œผ๋กœ ํ• ๋‹น

- ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ ๋’ค์— by lazy { } ํ˜•์‹์œผ๋กœ ์„ ์–ธ

val data: Int by lazy{
	println("In lazy....")
    10
}

 

๋ฐ์ดํ„ฐ ํƒ€์ž…

์ฝ”ํ‹€๋ฆฐ์˜ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด = ์ฝ”ํ‹€๋ฆฐ์˜ ๋ชจ๋“  ํƒ€์ž…์€ ๊ฐ์ฒด ํƒ€์ž…(๊ธฐ์ดˆ ๋ฐ์ดํ„ฐ ํƒ€์ž… ํด๋ž˜์Šค) > ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘

- null๊ฐ’ ๋Œ€์ž…

- ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๊ฐ€๋Šฅ

var data1: Int = 10
var data2: Int? null // null ๋Œ€์ž… ๊ฐ€๋Šฅ
data1 = data1.plus(10) // ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ์ด์šฉ ๊ฐ€๋Šฅ

1. ๊ธฐ์ดˆ ํƒ€์ž… ๊ฐ์ฒด : Int, Short, Long / Double, Float / Byte / Boolean

- ๊ธฐ์ดˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•˜๋Š” ํƒ€์ž…

 

2. ๋ฌธ์ž์™€ ๋ฌธ์ž์—ด : Char, String

1) Char : ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํƒ€์ž…. ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋กœ ํ‘œ์‹œ. Number ํƒ€์ž…์œผ๋กœ ํ‘œํ˜„ ๋ถˆ๊ฐ€

2) String : ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•˜๋Š” ํƒ€์ž…

- ํฐ๋”ฐ์˜ดํ‘œ(")๋กœ ํ‘œํ˜„ํ•œ ๋ฌธ์ž์—ด : enter, tab ์œ ์ง€ํ•˜๋ ค๋ฉด \๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค ํ•„์š” ex) \n, \t

- ์‚ผ์ค‘๋”ฐ์˜ดํ‘œ(""")๋กœ ํ‘œํ˜„ํ•  ๋•Œ๋Š” ํ‚ค๋ณด๋“œ๋กœ ์ž…๋ ฅํ•œ ์ค„๋ฐ”๊ฟˆ์ด๋‚˜ ๋“ค์—ฌ์“ฐ๊ธฐ ๋“ฑ์ด ๋ฐ์ดํ„ฐ์— ๊ทธ๋Œ€๋กœ ๋ฐ˜์˜  

     -> ์‚ฌ์šฉ ์‹œ ๋‹ซ๋Š” ๋”ฐ์˜ดํ‘œ ๋’ค์— .trimIndent() ์ž๋™ ์ถ”๊ฐ€(๋ฌธ์ž์—ด ์•ž์— ๊ณต๋ฐฑ ์ œ๊ฑฐ)

- $๋ฅผ ์ด์šฉํ•ด ๋ณ€์ˆซ๊ฐ’ ํ‘œ์‹œ

 

3. Any : ๋ชจ๋“  ํƒ€์ž… ๊ฐ€๋Šฅ

์ฝ”ํ‹€๋ฆฐ์—์„œ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค. ๋ชจ๋“  ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ ํ• ๋‹น ๊ฐ€๋Šฅ

class User
var data1: Any = User()

 

4. Unit : ๋ฐ˜ํ™˜๋ฌธ์ด ์—†๋Š” ํ•จ์ˆ˜

Unit ๊ฐ์ฒด๋งŒ ๋Œ€์ž… ๊ฐ€๋Šฅ. ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋ฌธ์ด ์—†์Œ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ๋•Œ Unit ํƒ€์ž… ์‚ฌ์šฉ

๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ƒ๋žตํ•˜๋ฉด ์ž๋™์œผ๋กœ Unit ์ ์šฉ

fun some(): Unit {}

 

5. Noting : null์ด๋‚˜ ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

null๋งŒ ๋Œ€์ž… ๊ฐ€๋Šฅ.(๋ฐ์ดํ„ฐ๋กœ์„œ์˜ ์˜๋ฏธ X)

val data1: Nothing? = null
fun some1(): Nothing? { return null } // null ๋ฐ˜ํ™˜ ํ•จ์ˆ˜
fun some2(): Nothing { throw Exception } // ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ํ•จ์ˆ˜

 

6. ๋„ ํ—ˆ์šฉ๊ณผ ๋ถˆํ—ˆ์šฉ

๋„ ํ—ˆ์šฉ : ํƒ€์ž… ๋’ค์— ๋ฌผ์Œํ‘œ๋ฅผ ์ถ”๊ธฐ

๋„ ๋ถˆํ—ˆ์šฉ : ๋ฌผ์Œํ‘œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Œ

 

ํ•จ์ˆ˜ ์„ ์–ธํ•˜๊ธฐ

- fun ํ‚ค์›Œ๋“œ ์ด์šฉ

- ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” val์ด ์ž๋™์œผ๋กœ ์ ์šฉ. 

 

์ปฌ๋ ‰์…˜ ํƒ€์ž… : ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

1. Array : ๋ฐฐ์—ดํ‘œํ˜„

- ๋ฐฐ์—ด์˜ ํฌ๊ธฐ, ์ดˆ๊นƒ๊ฐ’ ์ง€์ • / ๋ฐฐ์—ด์˜ ํƒ€์ž…์€ ์ œ๋„ค๋ฆญ(์ด์šฉํ•˜๋Š” ๊ณณ์—์„œ ํƒ€์ž… ์ง€์ •)

<init>(size: Int, init: (Int) -> T) // Array ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž

2. ๊ธฐ์ดˆ ํƒ€์ž…์˜ ๋ฐฐ์—ด

- BooleanArray, ByteArray, CharArray, DoubleArray, FloatArray, IntArray, LongArray, ShortArray

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

- arrayOf() : ๋ฐฐ์—ด์„ ์„ ์–ธํ•  ๋•Œ ๊ฐ’ ํ• ๋‹น -> ๊ธฐ์ดˆ ํƒ€์ž…์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ___ArrayOf() ํ•จ์ˆ˜ ์ œ๊ณต

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

3. List, Set, Map(์ปฌ๋ ‰์…˜ ํƒ€์ž… ํด๋ž˜์Šค)

Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒ€์ž…์œผ๋กœ ํ‘œํ˜„ํ•œ ํด๋ž˜์Šค

  ์ˆœ์„œ ์ค‘๋ณต
List O O
Set X X
Map ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ X(ํ‚ค์˜ ์ค‘๋ณต)

1) ๊ฐ€๋ณ€ ํด๋ž˜์Šค : ์ดˆ๊นƒ๊ฐ’์„ ๋Œ€์ž…ํ•œ ์ดํ›„์—๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ -> size(), get() + add(), set()

2) ๋ถˆ๋ณ€ ํด๋ž˜์Šค : ์ดˆ๊ธฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ž…ํ•˜๋ฉด ๋” ์ด์ƒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ํƒ€์ž… -> size(), get()

๊ตฌ๋ถ„ ํƒ€์ž… ํ•จ์ˆ˜ ํŠน์ง•
List List listOf() ๋ถˆ๋ณ€
MutableList MutableListOf() ๊ฐ€๋ณ€
Set Set setOf() ๋ถˆ๋ณ€
MutableSet MutableSetOf() ๊ฐ€๋ณ€
Map Map mapOf() ๋ถˆ๋ณ€
MutableMap mutableMapOf() ๊ฐ€๋ณ€

- map : Pair ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜ 'ํ‚ค to ๊ฐ’' ํ˜•ํƒœ๋กœ ์ด์šฉ

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

 

์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ˜๋ณต๋ฌธ

1. ์กฐ๊ฑด๋ฌธ if-else if-else

- ํ‘œํ˜„์‹์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ(๊ฒฐ๊ด๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ„์‚ฐ์‹) - ์ด ๋•Œ else ์ƒ๋žต ๋ถˆ๊ฐ€๋Šฅ

var result = if (data>0){
	true // ์ฐธ์ผ ๋•Œ ๋ฐ˜ํ™˜๊ฐ’
} else {
	false // ๊ฑฐ์ง“์ผ ๋•Œ ๋ฐ˜ํ™˜๊ฐ’
}

 

2. ์กฐ๊ฑด๋ฌธ when

- ์กฐ๊ฑด์œผ๋กœ ์ •์ˆ˜๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ ์ง€์ • ๊ฐ€๋Šฅ

- is : ํƒ€์ž…์„ ํ™•์ธํ•˜๋Š” ์—ฐ์‚ฐ์ž

- in : ๋ฒ”์œ„ ์ง€์ • ์—ฐ์‚ฐ์ž(์–‘์ชฝ ํฌํ•จ)

when (data) {
	is String => println("data is String")
    	20, 30 => println("data is 20 or 30")
    	in 1..10 -> println("data is 1...10")
    	else -> println("data is not valid")
}

- ๋ฐ์ดํ„ฐ๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  ์กฐ๊ฑด๋งŒ ๋ช…์‹œ ๊ฐ€๋Šฅ

- ํ‘œํ˜„์‹์œผ๋กœ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

var result = when {
	data <= 0 -> "data is <= 0"
   		data > 100 -> "data is > 100"
    	else -> "data is valid"
}

 

3. ๋ฐ˜๋ณต๋ฌธ for, while

1) for๋ฌธ

- ์ฃผ๋กœ ๋ฒ”์œ„ ์—ฐ์‚ฐ์ž์ธ in์„ ์‚ฌ์šฉ(์–‘์ชฝ ํฌํ•จ)

for (i in 1..10) {} // 1๋ถ€ํ„ฐ 10๊นŒ์ง€ 1์”ฉ ์ฆ๊ฐ€
for (i in 1 until 10) {} // 1๋ถ€ํ„ฐ 9๊นŒ์ง€ 1์”ฉ ์ฆ๊ฐ€(10์€ ๋ฏธํฌํ•จ)
for (i in 2..10 step 2) {} // 2๋ถ€ํ„ฐ 10๊นŒ์ง€ 2์”ฉ ์ฆ๊ฐ€
for (i in 10 downTo 1) {} // 10๋ถ€ํ„ฐ 1๊นŒ์ง€ 1์”ฉ ๊ฐ์†Œ

- indices : ์ปฌ๋ ‰์…˜ ํƒ€์ž…์˜ ์ธ๋ฑ์Šค ๊ฐ’

- withIndex( ) : ์ธ๋ฑ์Šค์™€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ๊ฐ€์ ธ์˜จ๋‹ค

for ((index, value) in data.withIndex())

2) while๋ฌธ

๋Œ“๊ธ€