변명은 만개 결과는 한개

Kotlin 특징 본문

공부/Kotlin

Kotlin 특징

노마십가 2021. 3. 4. 00:55
728x90
반응형

본 게시글은 Acaroom x Boostcourse Live! 콬! LIVE 강의 - 코틀린 특징 영상을 보며 정리한 글입니다

 

Kotlin 특징

코틀린의 특징 #1 - Statically Typed

기본적으로 정적 타입 언어이다

  • 컴파일 시 변수의 자료형(Type) 이 결정되어 안전
  • 코틀린과 달리 Python 혹은 JavaScript 는 동적타입
# Python 코드(동적 타입)의 예
m = 13          # int
m = "hello"     # str
m = 13.0        # float
// Kotlin 코드(정적 타입)의 예
var m: Int = 13
m = 15          // Ok
m = "hello"     // Error
m = 15.0        // Error
  • 단, Kotlin/JS 를 쓸 때는 동적 타입 지원을 위해 dynamic 키워드 제공

  • 자료형(Type) 을 명시하지 않아도 자료형 추론이 가능

// Kotlin 자료형 추론의 예. 둘 모두 Ok
var m = 13
var m: Int = 13

코틀린의 특징 #2 - Interoperable

Java 와 100% 호환됨

  • 코틀린 컴파일러는 자바 중간코드(ByteCode) 생성
  • 이미 존재하는 자바 라이브러리를 그대로 이용
  • Java와 Kotlin을 섞어서 써도 됨

코틀린의 특징 #3 - Null Safety

NPE를 방지할 수 있는 안전성

  • 널이 가능한 자료형(Nullable Type)과 불가능한(Non-Null Type) 자료형을 구분한다
var a: String? = null
var b: String = "Hello"
b = null    // Error
// 컴파일 안됨
var name: String? = null
var len = name.length    // Error: null 가능성이 있는 경우 length에 접근 불가
// 컴파일 가능, 세이프콜(Safe Call) 사용
var name: String? = null
val len = name?.length    // name이 null이 아닐 경우에만 length에 접근
// 그렇기에, 상황에 따라(Java와 호환) 다르겠으나 보통 아래와 같이 Non-Null Type 으로 코딩하자
var name: string = "hello"
val len = name.length    // Non-Null Type 이므로 Error 발생하지 않음

코틀린의 특징 #4 - Immutable

상태를 바꾸지 않는 불변성 제공

  • val (Value) = Immutable = Final variable = 할당 후 변경 불가
  • var (Variable) = Mutable = Non-Final variable = 언제든 변경 가능

보통 코딩을 하며 var 을 쓰는 경우가 없다고 함.

기본적으로 val 을 쓰되, 필요한 경우 var 을 쓰는 습관을 들이도록 하자

val one: Int = 10    // Java: final int one = 10;
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");


코틀린의 특징 #5 - Concise

코드의 간결성

  • 자바처럼 장황하지 않은 깔끔함, 보일러플레이트 코드의 최소화

보일러플레이트 코드 : getter, setter 등과 같은 헬퍼 함수들을 작성하는것


코틀린의 특징 #6 - Extension Functions

확장 함수

  • 클래스 상속이나 디자인 패턴을 사용하지 않고도 새로운 기능 확장 가능
class Original {
    fun onlyOneFunction() {
        println("Only One")
    }
}

fun Original.myExtension(): String {
    return "Original 클래스에 마치 멤버 메소드가 추가된 느낌!"
}

fun main() {
    val originalObj = Original()
    val result = originalObj.myExtenstion()
    println(result)
}

// output: Original 클래스에 마치 멤버 메소드가 추가된 느낌!

단, 너무 많이 사용하면 기능들이 남발하게 되므로 가독성이 떨어진다

확장함수를 유용하게 사용하면 아래와 같이 수신 자료형과 수신 객체로 결과물을 쉽게 만들 수 있다

// String: 수신 자료형, this: 수신 객체
fun String.lastChar(): Char = this.get(this.length-1)
println("12345".lastChar())

// output: 5

코틀린의 특징 #7 - Functional Programming

함수형 프로그래밍

  • 함수의 유기적 연결을 통한 프로그래밍 방식
  • 함수가 일급 객체(First-class citizens)로 사용할 수 있게 된다
fun add(a: Int, b: Int) = a + b
fun subtract(a: Int, b: Int) = a - b
fun main() {
    val functions = mutableListOf(::add, ::subtract)

    println(functions[0])
    // fun add(kotlin.Int, kotlin.Int): kotlin.Int

    println(functions[0](12, 30))
    // 12+30 = 42

    println(functions[1](57, 12))
    // 57-15 = 42
}

이때 add, subtract, main최상위(Top level) 함수 라고 하는데, 이 최상위 함수가 일급 객체 로서 활용될 수 있다는 의미이다.

즉, 최상위 함수를 자료구조 안에 넣는 등 인자로서 사용 할 수 있으며 반환값으로도 사용 가능함을 이야기한다

  • 람다(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
}

일종의 이름이 없는 함수 체계


코틀린의 특징 #그 외에도..

  • DSL
  • Coroutines
  • Higher-order Functions
  • Multiplatform
  • OOP

... 등과 같은 특징이 존재함

728x90
반응형