Notice
Recent Posts
Recent Comments
Link
반응형
변명은 만개 결과는 한개
Kotlin 특징 본문
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
반응형
'공부 > Kotlin' 카테고리의 다른 글
[Kotlin] Class companion object (0) | 2020.11.20 |
---|---|
[Kotlin] 클래스 init ( Class initializer ) (0) | 2020.11.19 |
[Kotlin] 클래스 상속 ( Class Inheritance ) (0) | 2020.11.19 |
[Kotlin] null (3) : 유용한 null 처리방법 (0) | 2020.11.18 |
[Kotlin] null (2) : null 예외처리 (0) | 2020.11.17 |