안녕하세요 Samuel 입니다.
Kotlin을 사용하는 이유를 한마디로 정의를 하자면 "상호운용성" 입니다. 자바를 사용중인 곳이라면, 거의 대부분 코틀린을 사용할 수 있습니다.
코틀린은 자바가 사용되는 모든곳 ( 서버, 안드로이드 등 )에서 모두 사용할 수 있습니다. 더욱더 중요한건 자바를 사용하면서, 같이 사용이 가능합니다. 자바에서 코틀린과의 차이점은
- 간결함
- 생산적
- 안전한 대체언어
라는 부분에서 그 특징을 가지고 있습니다.
그렇다면, 자바와 다른 코틀린의 특징들을 조금 더 깊게 살펴보겠습니다.
코틀린은 자바와 동일하게 함수형 프로그래밍 입니다.
모든 변수의 타입을 직접 명시 할 필요가 없습니다.
대부분의 경우, 코틀린 컴파일러가 문맥으로부터 변수 타입을 자동으로 유추할 수 있기 때문에 개발자는 타입 선언을 생략해도 됩니다.
var x = 1
컴파일러가 문맥을 고려해 변수 타입을 결정하는 이런 기능을 어려운 말로 "타입추론"이라고 부릅니다.
타입추론의 장점으로는
- 성능
- 실행 시점에서 메소드 추적이 불필요하여 메소드 호출이 더욱 빠릅니다.
- 신뢰성
- 컴파일러가 프로그램의 정확성을 검사하므로, 실행시 오류로 중단될 가능성이 적어집니다.
- 유지 보수성
- 처음 보는 코드도 다루기 쉽게 해당 객체가 어떤 타입에 속하는지 알 수 있습니다.
- 도구지원
- 해당 부분에서 IDE의 도움으로 안전하게 리팩토링이 가능합니다.
Java와의 차이점
val와 var
- val(값을 의미하는 value)
- 변경 불가능한, 참조를 저장하는 변수입니다.
- val로 선언된 변수는 일단 초기화하고 나면 재대입이 불가능 합니다.
- JAVA의 final 변수에 해당합니다.
- var(변수를 뜻하는 variable)
- 변경 가능한 참조를 저장하는 변수입니다.
- JAVA의 일반 변수에 해당합니다.
- 추천 : val 키워드를 사용해 불변 변수로 선언하고, 나중에 꼭 필요하면 var로 변경하십시오. 변경 불가능한 참조와 변경 불가능한 객체를 부수 효과가 없는 함수와 조합해 사용하면 코드가 함수형에 가까워 집니다.
- val 변수는 블록을 실행할때 정확히 한번만 초기화 돼야 합니다. 하지만 어떤 블록이 실행될 때 오직 한 초기화 문장만 실행됨을 컴파일러가 확인할 수 있다면 조건에 따라 val 값을 다른 여러 값으로 초기화 할 수 있습니다.
- val msg : String if (canPerformOperation()){ msg = "success" //연산수행 생략 }else{ msg = "fail" }
함수를 최상위 수준에 정의할 수 있습니다.
Java와의 차이점 JAVA와 다르게 꼭 클래스 안에 함수를 정의할 필요가 없습니다.
배열처리를 위한 별도의 문법이 존재하지 않습니다.
Java와의 차이점 JAVA에서는 배열을 위해 처리되는 문법들이 존재했지만, 코틀린에서는 자바와 달리 문법이 따로 존재하지 않습니다.
코틀린의 if는 문(statement)가 아닌 식(expression)입니다.
Java와의 차이점 JAVA에서는 모든 제어 구조가 문인 반면 코틀린에서는 루프를 제외한 대부분의 제어 구조가 식입니다. 코틀린에서는 제어구조를 다른 식으로 엮어 낼 수 있다면 여러 일반적인 패턴을 아주 간결하게 표현할 수 있습니다.
- 블록이 본문인 함수
// max -> 함수 이름
// a: Int, b:Int -> 파라미터 목록
// : Int -> 리턴타입
// return if(a > b) a else b -> 함수 본문
fun max(a: Int, b:Int) : Int {
return if(a > b) a else b
}
- 식이 본문인 함수
fun max(a: Int, b:Int) : Int = if(a > b) a else b
- 반환 타입을 생략
fun max(a: Int, b:Int) = if(a > b) a else b
반환타입 생략이 가능한 이유는 " 타입 추론 " 기능 때문입니다.
단, 식이 본문인 함수의 반환 타입만 생략이 가능합니다. 블록이 본문인 함수가 값을 반환한다면 반드시 반환 타입을 지정하고 return 문을 사용해 반환값을 명시해야 합니다.
그 이유로는 아주 긴 함수에 return문이 여럿 들어있는데, 이런 경우 반환 타입을 꼭 명시하고 return을 반드시 사용한다면 함수가 어떤 타입의 값을 반환하고 어디서 그런 값을 반환하는지 더 쉽게 알아볼 수 있기 때문입니다 !
- IntelliJ Tip
- Covert to expression body : 식 본문으로 변환
- Covert to block body : 블록 본문으로 변환
추가적으로 세미콜론 또한 필요하지 않습니다 !
Kotlin을 더욱 Kotlin스럽게
실용성
코틀린은 다른 프로그래밍 언어가 채택한 이미 성공적으로 검증된 해법과 기능에 의존합니다. 그렇기 때문에 언어의 복잡도가 줄어들고 이미 알고 있는 개념을 사용할 수 있게 되면서 상호운용성이 향상되었습니다.
상호운용성이 향상되면서 특정 패턴이나 패러다임을 강제하지 않으며 그 특징이 더욱 부각됩니다. 강조되는 부분은 IDE가 IntelliJ의 기반으로 개발을 하는 것을 추천을 하고자 합니다. 더 간결한 구조로 바꿀 수 있는 대부분의 코드 패턴을 IDE가 자동으로 감지해 수정하라고 제안합니다.
간결성
개발자가 작성하는 코드에서 의미가 없는 부분을 줄이기 위해 자바에서 존재하는 여러가지 번거로운 준비 코드를 코틀린은 묵시적으로 제공하기 때문에 간결한 특징을 가지고 있습니다.
또한 다양한 표준 라이브러리를 제공하기 때문에 반복되거나 길어질 수 있는 코드를 라이브러리 함수 호출로 대치할 수 있습니다.
안정성
JVM에서 실행하는 바탕으로 메모리의 안정성을 보장하고 버퍼 오버플로우(overflow)를 방지하며, 동적으로 할당한 메모리를 잘못 사용함으로서 발생할 수 있는 문제를 예방할 수 있습니다.
JAVA와는 다르게 코틀린 컴파일러가 타입을 자동으로 추론해주기 때문에 더 적은 비용으로 타입 안정성을 보장할 수 있습니다. Java와의 차이점
추가적으로 NPE(NullPointerException)을 실행시점에서 발생할 수 있는 연산을 금지 시킵니다.
// null 가능
val s: String? = null
// null 불가능
val s2: String = ""
위와 같이 ? 한글자로 컨트롤이 가능하며 적은 비용으로 조절할 수 있게 해줍니다.
상호운용성
상단에서 지속적으로 강조했던 특징입니다. JAVA에서 사용하는 모든 라이브러리를 그대로 사용할 수 있는 큰 장점입니다.
코틀린의 클래스나 메소드를 일반적으로 자바 클래스나 메소드와 똑같이 사용할 수 있습니다. 또한 자바와 코틀린 코드를 프로젝트에 원하는대로 섞어 쓸 수 있는 궁극적인 유연성을 발휘할 수 있습니다.
'책을 읽어봅시다 > Kotlin in Action' 카테고리의 다른 글
람다로 프로그래밍(1) (0) | 2022.03.03 |
---|---|
JAVA와 차이점 그리고 클래스, 객체, 인터페이스 (0) | 2022.03.02 |
Basic Kotlin (0) | 2022.02.21 |