해당 질문에 답하는 것은 쉽지 않았다. 필자는 프로그래밍 언어를 Java로 시작했고 한 학기 내내 사용했다. Java 특유의 쓸데없이 긴 문장도 손에 완벽히 익었을 터, 때문에 JetBrain이 "A modern programming language that makes developers happier." 라는 슬로건을 내걸어도 별 생각이 없었다. 나름 편하게 사용하던 Java를 버리고 코틀린을 사용할 필요를 못 느꼈기 때문이다.
위의 생각은 취업준비를 하며 바뀌었다. 지금까지 필자가 하던 안드로이드 앱 프로젝트의 크기는 개인 단위이며 코드의 분량도 얼마 되지 않는다. Java를 쓰던 Kotlin을 쓰던 별 차이가 없었다. Kotlin을 어떻게 사용해야 하는지 몰랐던 이유도 있다. 하지만 프로젝트의 단위가 개인을 넘어, 협업이 필요한 수준의 단위로 프로젝트의 크기가 커지면 어떻게 될까?
보다 가독성이 좋은 언어를 통해, 효율성과 유지보수성을 높이는 것이 절실해질 것이다.
그래야 일은 적게하고 퇴근은 빨리 하니까
위의 조건을 만족하고, 기존 안드로이드 개발을 담당하던 언어인 Java와도 100% 호환성을 가진 프로그래밍 언어가 있다.
코틀린이다.
- | Type system | Multi-Platform | OOP | FP | Type Inference | Nullable |
---|---|---|---|---|---|---|
자바(Java) | 정적 타입 | O | O | X | X(9 이하) | X |
코틀린(Kotlin) | 정적 타입 | O | O | O | O | O |
스코프함수 이해를 위한 고차함수, 람다 를 먼저 보고 오자.
1. 스코프함수에 객체의 인스턴스를 전달하고
2. 해당 인스턴스의 속성이나 함수를 "Scope 내에서 깔끔하게 분리하여" 작업한다.
- 결과
코드 가독성 및 유지보수성을 향상시킨다.- 특징
람다식을 사용한다.
인스턴스 생성 직후 변수에 담기 전 초기화를 수행할 때 유용
일반 람다 함수와 다르게 해당 인스턴스를 변수에 반환해준다.
apply 적용 전
var book1 = Book("5England 서사시", 10000)
book1.name = "할인판 " + book1.name
book1.discount()
apply 적용 후
var book1 = Book("5England 서사시", 10000).apply{
name = "할인판 " + name
discount()
}
book1.name = "초특가 " + book1.name
book1.discount()
var newPrice = book1.price
var newPrice = book1.run(
name = "초특가 " + name
discount()
price
}
a.run{ ~ }
with(a){ ~ }
with(a?.){}
일단 타임
그렇다면, 대체 왜 이들을 구분해 놓았는지 명확히 알아야 스코프 활용성을 높일 수 있을 것이다.
차이점
참조연산자 it
왜 also와 let은 참조연산자를 사용해야 하는가? :
같은 이름의 변수 및 함수가 scope 바깥에 중복되어 있는 경우의 혼란을 방지한다.
fun main() {
var price = 5000
var book1 = Book("5England 서사시", 10000).apply{
name = "할인판 " + name
price = 8000
}
book1.run{
println(name + ", " + price + "원")
}
<<출력>> 할인판 5England 서사시, 5000원
run함수가 scope 내 변수 price보다 main 함
수 내 변수 price를 우선시하고 있기 때문이다.
apply, with도 위의 문제를 발생시킬 수 있다.
따라서 위의 상황 시, 밑의 그림처럼 run이 아닌 let을 사용하면 된다.
- | apply | run | with | also | let |
---|---|---|---|---|---|
사용 목적(인스턴스를) | 초기화 | 멤버 사용 | 멤버 사용 | 초기화 | 멤버 사용 |
리턴값 | 인스턴스 | 마지막 코드 | 마지막 코드 | 인스턴스 | 마지막 코드 |
참조연산자 | this(생략 가능) | this(생략 가능) | this(생략 가능) | it | it |
val
var
Type Interface
int i = 5; //java
var i = 5 //kotlin Type Interface O
var i : Int = 5 //kotlin Type Interface X
상수
Late initialization
lateinit var lateNumber : Integer
Lazy initialization
val lazyNumber : Int by lazy{ 100 }
field : 필드(멤버 변수)
property : 필드(멤버 변수) + 접근자(getter & setter)
data class
data class Person(var name : String, var age : Integer)
class Person( _name : String ){
var name : String = nameStr
get() {
return this.name
}
set(newName : String) {
this.name = newName
}
}