코틀린의 등장 배경
코틀린은 자바의 대체제로 자주 언급되는데요. 하지만 처음 개발될 당시엔 자바를 대체 하는것이 목표는 아니었습니다.
코틀린의 개발사 Jetbrains에서 개발을 주도하던 드미트리(Dmitry Jemerov)는 코틀린을 개발할 당시 스칼라를 제외한 언어들에는 찾고자 하는 기능이 존재하지 않았고, 스칼라는 컴파일 시간이 매우 느렸기때문에 아쉬움이 있었다고 말했습니다.
결국 코틀린을 통해 원하는 기능을 모두 지원하면서 자바만큼 빠르게 컴파일하는 것이 주요 목적이었던 것입니다.
그러다보니 코틀린은 다수의 유용한 기능을 제공하며, 아직 자바 만큼은 아니지만 빠른 컴파일 타임을 가진 언어로 개발되었습니다.
코틀린의 주요 장점
그럼 코틀린은 어떤 장점을 지니고 있을까요?
1. 간결한 구문
언어의 표현력이 높으면 코드가 간결해집니다. 작성할 코드가 적을수록 최종 애플리케이션에 슬그머니 자리를 잡는 버그가 줄어들고, 최종 코드의 유지 관리가 쉬워집니다.
Jetbrains 에서는 자바 코드 대비, 라인 수를 40% 줄일 수 있다고 합니다.
FAQ | Kotlin
kotlinlang.org
2. null-safety / 널 안전성
이건 개발자들이 가장 좋아하는 코틀린의 기능입니다.
코틀린의 타입 체계는 The Billion Dollar Mistake(10억 달러짜리 실수)라고도 알려진 null 참조가 코드에서 발생할 위험을 제거하는 것을 목적으로 하고 있습니다.
이러한 null-safety 는 코틀린의 컴파일러에서 지원하고 있으므로 null 값을 참조하는 문제가 줄어듭니다.
3. Java 상호 운용성
주요하게 사용되는 플랫폼과의 상호 운용성은 개발 생산성을 크게 높여줍니다.
코틀린을 사용하면 자바로 작성된 모든 프레임워크 및 라이브러리를 활용할 수 있습니다.
또한 모든 자바 코드를 코틀린으로 변환하지 않고도 기존 자바 프로젝트에 코틀린을 점진적으로 도입할 수도 있습니다.
4. Kotlin 코루틴
명령형 프로그래밍 모델을 사용하여 비동기 코드를 쉽게 작성할 수 있는 방법을 제공합니다.
코루틴은 많은 시스템 리소스를 절약하기 때문에 I/O 작업이 많은 고부하 서버측 애플리케이션을 개발하는 데 특히 유용합니다.
코루틴 지원이 Spring Framework에 추가되면서 서버측 개발자가 이 기능을 이용하기가 더 쉬워졌습니다.
Going Reactive with Spring, Coroutines and Kotlin Flow
<div class="paragraph"> <p>Since we announced <a href="https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0">Spring Framework official support for Kotlin</a> in January 2017, a lot of things happened. Kotlin was announced as
spring.io
코틀린 맛보기
Java ↔ Kotlin 코드 비교
코틀린 코드를 자바 코드로 디컴파일하여 보여주는 기능을 IntelliJ에서 제공합니다.
Tools → Kotlin → Show Kotlin Bytecode
Kotiln
fun main(args: Array<String>) {
val a = "10"
val b = 100
val sum = a.toInt() + b
println(sum)
}
data class Person(
val name: String,
val age: Int? = null
)
Java
public final class MainKt {
public static final void main(@NotNull String[] args) {
Intrinsics.checkNotNullParameter(args, "args");
String a = "10";
int b = 100;
int sum = Integer.parseInt(a) + b;
boolean var4 = false;
System.out.println(sum);
}
}
public final class Person {
@NotNull
private final String name;
@Nullable
private final Integer age;
@NotNull
public final String getName() {
return this.name;
}
@Nullable
public final Integer getAge() {
return this.age;
}
public Person(@NotNull String name, @Nullable Integer age) {
Intrinsics.checkNotNullParameter(name, "name");
super();
this.name = name;
this.age = age;
}
/* equals, copy, toString... */
}
코틀린 지원/실행 환경
코틀린은 기존 JVM과 연동된 기존 생태계 외에도 다양한 실행/프로그래밍 환경을 지원하기 위해 노력하고 있습니다.
- Kotlin/JVM
- Server-side app
- Android app
- Kotlin/JS
- Web frontend
- Kotlin/Native
- LLVM 컴파일러를 이용하여 특정 OS에서 바로 실행 가능한 머신 코드 생성
- Android ↔ iOS 크로스 플랫폼 개발 지원
- Data Science
코틀린의 특성
코틀린은 statically / strongly 타입의 언어로 분류됩니다.
또한 각 타입의 특징은 다음과 같습니다.
언어별 타입 정의
절대적인 정의는 아니며, 언어별로 반대 개념의 타입을 지원하는 정도가 다릅니다.
Statically typed (정적 타입)
- 변수의 데이터 타입이 컴파일 타임에 결정됨
- 최적화에 유리
- 예) 실행 전 스택 사이즈를 알 수 있는 점 등
- 관련 버그가 있는 경우 컴파일에 실패함
- 예) String 타입 변수에 Int 자료형 대입 등
Dynamically typed (동적 타입)
- 변수의 데이터 타입 체크를 런타임에 진행
Strongly typed (강타입)
- 다른 데이터 타입간의 변환/연산이 제한적
- Weakly typed 언어와 비교했을 때
- 코드를 보기 쉬울 수도 있음
- 버그가 적을 수도 있음
Weakly typed (약타입)
- 다른 데이터 타입간의 변환/연산이 유연
- 관련 키워드 : Implicit Conversion, Type Punning
statically typed 예시
변수 타입을 명시하지 않았으나, 타입 추론(type inference)을 통해 컴파일 타임에 x가 Double type 임을 자동으로 알아냅니다.
val x = 10.0 // -> Double
strong typed 예시
Int형과 Double형의 묵시적/암시적 변환(implicit conversion)이 불가합니다.
val y = (3 == 3.0) // (x) compile error
코틀린 코드 컴파일
Java 코드와 동일하게 컴파일시 class/jar 파일로 변환됩니다.
Java + Kotlin code
Java 코드와 Kotlin 코드가 혼용된 경우에는 다음과 같은 과정으로 컴파일이 진행됩니다.
- Kotlin 코드 컴파일
- .class 파일 생성
- .class 파일 내부 Java 코드 영역을 javac로 한 번 더 컴파일
- jar 파일로 변환
- JVM을 이용하여 실행
☕️ Networking
기술 직군의 기술적인 교류, 커리어 이야기, 직군 무관 네트워킹 모두 환영합니다!
위클리 아카데미 오픈 채팅방(비밀번호: 9323)
kakaotalk: https://open.kakao.com/o/gyvuT5Yd