[Kotlin] πŸ’β€β™€οΈ μ½”ν‹€λ¦°μ˜ νŠΉμ§•

leeehaΒ·2022λ…„ 6μ›” 15일
0

μ½”ν‹€λ¦°

λͺ©λ‘ 보기
3/28
post-thumbnail

좜처: https://www.boostcourse.org/mo001/lecture/333385

Statically Typed

기본은 정적 νƒ€μž… μ–Έμ–΄

  • 컴파일 μ‹œ λ³€μˆ˜μ˜ μžλ£Œν˜•(type)이 κ²°μ •λ˜κΈ° λ•Œλ¬Έμ— μ•ˆμ „ν•˜λ‹€.
  • 정적 νƒ€μž…μ˜ λ°˜λŒ€λŠ”? 동적 νƒ€μž… (Dynamically Typed)
    - 정적 νƒ€μž… μ–Έμ–΄: C, C++, Java, Kotlin, ...
    - 동적 νƒ€μž… μ–Έμ–΄: JavaScript, Python, Objective-C, PHP, ...

  • 단, Kotlin/JSμ—μ„œλŠ” 동적 νƒ€μž… 지원을 μœ„ν•΄ dynamic ν‚€μ›Œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.
  • μžλ£Œν˜•μ„ λͺ…μ‹œν•˜μ§€ μ•Šμ•„λ„ μžλ£Œν˜• 좔둠이 κ°€λŠ₯ν•˜λ‹€.

Inter-operable

Java와 100% ν˜Έν™˜ (Kotlin/JVM)

κ΄€λ ¨ 포슀트 클릭!

  • μ½”ν‹€λ¦° μ»΄νŒŒμΌλŸ¬λŠ” μžλ°” 쀑간 μ½”λ“œ(ByteCode)λ₯Ό 생성함.
  • 이미 μ‘΄μž¬ν•˜λŠ” μžλ°” 라이브러리 κ·ΈλŒ€λ‘œ 이용 κ°€λŠ₯함.
  • μžλ°”μ™€ μ½”ν‹€λ¦° μ„žμ–΄μ„œ 써도 됨.

Null Safety

NPE을 방지할 수 μžˆλŠ” μ•ˆμ „μ„±

포인터가 κ°€λ¦¬ν‚€λŠ” 곳을 λ”°λΌμ„œ κ°”λŠ”λ°, 그곳에 λ©”λͺ¨λ¦¬ μžμ²΄κ°€ κ·œμ •λ˜μ–΄ μžˆμ§€ μ•Šμ„ λ•Œ Null Pointer Exception이 λ°œμƒν•œλ‹€! 🀯

이런 상황을 λ°©μ§€ν•˜λ €λ©΄? 널이 κ°€λŠ₯ν•œ μžλ£Œν˜• (Nullable Type)κ³Ό λΆˆκ°€λŠ₯ν•œ μžλ£Œν˜• (Non-Null Type)을 κ΅¬λΆ„ν•œλ‹€!

var a: String? = null // nullable (aλŠ” λ¬Έμžμ—΄ν˜•μ΄μ•Ό? null μ“Έκ±°μ•Ό?) 
var b: String = "Hello" // non-null (bλŠ” λ¬Έμžμ—΄μ΄μ•Ό. null μ•ˆ 돼.) 
b = null // Error 
// 컴파일 λΆˆκ°€
var name: String? = null
val len = name.length // μ—λŸ¬: null κ°€λŠ₯μ„± μžˆλŠ” 경우 length에 μ ‘κ·Ό λΆˆκ°€
// 컴파일 κ°€λŠ₯, Safe Call μ‚¬μš©
var name: String? = null
val len = name?.length // name이 null이 아닐 κ²½μš°μ—λ§Œ length에 μ ‘κ·Ό 

Immutable

μƒνƒœλ₯Ό 바꾸지 μ•ŠλŠ” 'λΆˆλ³€μ„±' 제곡

  • val (value) = Immutable = Final variable = ν• λ‹Ή ν›„ λ³€κ²½ λΆˆκ°€
  • var (variable) = Mutable = Non-Final variable = μ–Έμ œλ“  λ³€κ²½ κ°€λŠ₯
val one: Int = 10 // Java: final int one = 20; (κ³ μ •) 
one = 12 // Error

var two: Int = 2
two = 5 // OK 
val mutableList = mutableListOf<Int>(1, 2, 3, 4) 
// .add() .remove() μ΄μš©ν•΄μ„œ μš”μ†Œ μΆ”κ°€, μ‚­μ œ κ°€λŠ₯ (κ°€λ³€μ„±) 

val immutableList = listOf<Int>(1, 2, 3, 4) 
// .add() .remove() μ΄μš©ν•΄μ„œ μš”μ†Œ μΆ”κ°€, μ‚­μ œ λΆˆκ°€λŠ₯ (λΆˆλ³€μ„±) 

μžλ°”λŠ” λΆˆλ³€μ„±μ„ μ œκ³΅ν•˜λŠ” μ»¬λ ‰μ…˜μ΄ μ—†μ—ˆμ§€λ§Œ, Java 9μ—μ„œλΆ€ν„° μ œκ³΅ν•˜κΈ° μ‹œμž‘ν–ˆλ‹€.
ex) List a = List.of("a", "b", "c");

즉, 버전에 λ”°λΌμ„œ 될 μˆ˜λ„ 있고 μ•ˆ 될 μˆ˜λ„ μžˆλ‹€. ν•˜μ§€λ§Œ 코틀린은 기본적으둜 λ³€μˆ˜λ₯Ό mutable, immutable 이 두가지 μƒνƒœλ‘œ κ΅¬λΆ„ν•œλ‹€!

Concise

μ½”λ“œμ˜ κ°„κ²°μ„±

  • μžλ°”μ²˜λŸΌ μž₯ν™©ν•˜μ§€ μ•Šμ€ 깔끔함! λ³΄μΌλŸ¬ν”Œλ ˆμ΄νŠΈ μ½”λ“œμ˜ μ΅œμ†Œν™”!
  • λ³΄μΌλŸ¬ν”Œλ ˆμ΄νŠΈ μ½”λ“œλŠ” κΌ­ ν•„μš”ν•˜κΈ΄ ν•œλ°, 반볡적으둜 μž‘μ„±ν•΄μ•Ό ν•΄μ„œ 번거둜운 μ½”λ“œλ₯Ό μ˜λ―Έν•œλ‹€.
    ex) μžλ°” 클래슀의 private 멀버 λ³€μˆ˜μ— μ ‘κ·Όν•˜κΈ° μœ„ν•œ getter, setterλ₯Ό μ½”ν‹€λ¦°μ—μ„œλŠ” 데이터 클래슀 μ‚¬μš©μœΌλ‘œ κ°„κ²°ν™” ν•  수 μžˆλ‹€.

Extension Functions

ν™•μž₯ ν•¨μˆ˜

클래슀 μƒμ†μ΄λ‚˜ λ””μžμΈ νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³ λ„ 클래슀의 ν™•μž₯ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ„œ κΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆλ‹€. 단, λ„ˆλ¬΄ 많이 μ‚¬μš©ν•˜λ©΄ κΈ°λŠ₯이 λ‚¨λ°œν•˜κ²Œ λ˜λ―€λ‘œ 가독성이 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€.

μ•„λž˜ μ˜ˆμ‹œμ²˜λŸΌ String 클래슀의 ν™•μž₯ ν•¨μˆ˜ lastChar()λ₯Ό λ§Œλ“€λ©΄, μˆ˜μ‹  객체둜 받은 λ¬Έμžμ—΄μ˜ λ§ˆμ§€λ§‰ 문자 '5'κ°€ λ¦¬ν„΄λœλ‹€.

Functional Programming

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°

  • ν•¨μˆ˜μ˜ 유기적 연결을 ν†΅ν•œ ν”„λ‘œκ·Έλž˜λ° 방식
  • ν•¨μˆ˜λ₯Ό 일급 객체 (First-class citizens)둜 μ‚¬μš©ν•  수 있게 λœλ‹€. 즉, ν•¨μˆ˜κ°€ κ°–λŠ” κΆŒν•œμ΄ λ§Žμ•„μ§„λ‹€.
fun add(a: Int, b: Int) = a + b
fun substract(a: Int, b: Int) = a - b

fun main() {
	// 일급 κ°μ²΄λŠ” ν•¨μˆ˜μ˜ 인자, λ°˜ν™˜κ°’, 
    // 심지어 μ•„λž˜ μ½”λ“œμ²˜λŸΌ 리슀트 같은 μžλ£Œκ΅¬μ‘°μ—λ„ 넣을 수 μžˆλ‹€! 
	val functions = mutableListOf(::add, ::substract) 
    
    println(functions[0])
    // fun add(kotlin.Int, kotlin.Int): kotlin.Int
    
    // functions[0]λŠ” add ν•¨μˆ˜ 
    println(functions[0](12,30))
    // 12+30 = 42 
    
    // functions[1]은 substract ν•¨μˆ˜ 
    println(functions[1](57,15))
    // 57-15 = 42 
}
  • λžŒλ‹€(Lambda)μ‹μœΌλ‘œ μ„ μ–Έλ˜μ§€ μ•Šκ³ λ„ 읡λͺ…μ˜ ν•¨μˆ˜ κΈ°λŠ₯을 식에 전달할 수 μžˆλ‹€.
fun calculator(a: Int, b: Int, sum: (Int, Int) -> Int): Int {
	return a + b + sum(a, b)
}

fun main(){
	val out = calculator(11, 10, { a, b -> a + b })
    // 		  calculator(11, 10) { a, b -> a + b } 와 동일 
    // 11+10+(11+10) = 42
    println(out)
}

이처럼 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ λ³΅μž‘ν•œ 식을 κ°„κ²°ν™” ν•  수 μžˆλ‹€λŠ” 게 κ°€μž₯ μ€‘μš”ν•œ νŠΉμ§•μ΄λ‹€.

마무리

이외에도 코틀린은 Coroutines (비동기 처리), DSL (Domain-Specific Language), Multiplatform, Higher-order Functions, OOP λ“± λ§Žμ€ νŠΉμ§•μ„ κ°–κ³  μžˆλ‹€! μ•žμœΌλ‘œ μ°¨μ°¨ μ΄λŸ¬ν•œ λ‚΄μš©μ— λŒ€ν•΄ μžμ„Ένžˆ 배우게 될 것이닀.

μš”μ•½

  • μžλ£Œν˜•μ— λŒ€ν•œ 였λ₯˜λ₯Ό 미리 μž‘μ„ 수 μžˆλŠ” 정적 μ–Έμ–΄μž…λ‹ˆλ‹€.
    코틀린은 ν”„λ‘œκ·Έλž¨μ΄ 컴파일될 λ•Œ μžλ£Œν˜•μ„ κ²€μ‚¬ν•˜μ—¬ ν™•μ •ν•˜λŠ” 정적 μ–Έμ–΄μž…λ‹ˆλ‹€. 즉 μžλ£Œν˜• 였λ₯˜λ₯Ό μ΄ˆκΈ°μ— λ°œκ²¬ν•  수 μžˆμ–΄ ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ΄ μ’‹μ•„μ§‘λ‹ˆλ‹€.

  • 널 ν¬μΈν„°λ‘œ μΈν•œ ν”„λ‘œκ·Έλž¨μ˜ 쀑단을 μ˜ˆλ°©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    컴퓨터 ν”„λ‘œκ·Έλž˜λ°μ— 관심이 λ§Žμ€ λ…μžλΌλ©΄ 널 포인터 μ˜ˆμ™Έ(Null Pointer Exception)을 ν•œλ²ˆμ―€μ€ κ²½ν—˜ν–ˆκ±°λ‚˜ λ“€μ–΄λ³Έ 적이 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. 널 포인터 였λ₯˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” 도쀑에 λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— μ–Έμ œ μ–΄λ””μ„œ μ–΄λ–»κ²Œ λ°œμƒν• μ§€ 아무도 μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€. μ˜€λž«λ™μ•ˆ ν”„λ‘œκ·Έλž˜λ¨Έμ˜ 골치λ₯Ό μ•„ν”„κ²Œ λ§Œλ“  주범이죠. ν•˜μ§€λ§Œ 코틀린은 널 포인터 였λ₯˜λ₯Ό 미리 μ˜ˆλ°©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    β–Ά 보톡 κ°œλ°œμžλ“€μ€ μ½”ν‹€λ¦°μ˜ 이런 νŠΉμ§•μ„ 'NPEμ—μ„œ μžμœ λ‘­λ‹€'라고 λ§ν•©λ‹ˆλ‹€.
    β–Ά NPEλŠ” Null Pointer Exception을 쀄여 λ§ν•œ κ²ƒμž…λ‹ˆλ‹€.

  • μ•„μ£Ό κ°„κ²°ν•˜κ³  νš¨μœ¨μ μž…λ‹ˆλ‹€.
    코틀린은 μ—¬λŸ¬κ°€μ§€ μƒλž΅λœ ν‘œν˜„μ΄ κ°€λŠ₯ν•œ μ–Έμ–΄μž…λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‹€λ₯Έ 언어보닀 훨씬 κ°„κ²°ν•˜κ³  효율적으둜 코딩을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°κ³Ό 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄ λͺ¨λ‘ κ°€λŠ₯ν•©λ‹ˆλ‹€.
    ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— μ €μž₯ν•˜κ±°λ‚˜ ν•¨μˆ˜λ₯Ό λ‹€λ₯Έ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κΈΈ 수 μžˆλŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°κ³Ό 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ λͺ¨λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    β–Ά 보톡 이런 νŠΉμ§•μ„ 'λ©€ν‹° νŒ¨λŸ¬λ‹€μž„ μ–Έμ–΄'라고 λΆ€λ¦…λ‹ˆλ‹€.

  • μ„Έλ―Έμ½œλ‘ μ„ μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ λ¬Έμž₯의 λ§ˆμ§€λ§‰μ— μ‚¬μš©ν•˜λ˜ μ„Έλ―Έμ½œλ‘ (;)은 μƒλž΅ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

profile
κΎΈμ€€νžˆ!

0개의 λŒ“κΈ€