728x90
728x170
코틀린(Kotlin) 한 눈에 알아보기
코틀린(Kotlin)
- IntelliJ IDEA의 개발사 JetBrains에서 2011년에 공개한 오픈 소스 프로그래밍 언어
- JVM 기반의 언어이며, Java와 유사하지만 더 간결한 문법과 다양한 기능을 추가하였다.
- Java와의 상호 운용이 100% 지원된다.
- JVM 바이트 코드가 기본이지만, Kotlin/Native 컴파일러를 사용하여 기계어로 컴파일할 수 있다.
- 안드로이드, 스프링 프레임워크, 톰캣, JavaScript, Java EE, HTML5, iOS, 라즈베리 파이 등을 개발할 때 사용할 수 있다.
- 2017년에 구글이 안드로이드의 공식 언어로 Kotlin을 추가하였다.
- 이는 오라클과의 Java API 저작권 분쟁의 여파로 보는 시각이 많다.
- 이름은 JetBrains의 R&D 센터가 위치한 상트페테르부르크 근처의 코틀린(Ко́тлин) 섬에서 따왔다.
내용 출처 : https://namu.wiki/w/Kotlin
코틀린의 사용 목적
- 안드로이드 앱 개발
- iOS 앱 개발
- Node.js로 운영되는 풀스택 웹 솔루션 제작
- 현대적인 언어, 요즘 뜨는 언어, Java 언어에 대한 싫증
- 데스크톱(Linux, Windows) 애플리케이션 제작
- 멀티 플랫폼 앱 개발
- Android Things (IoT) 애플리케이션 제작
코틀린의 특징
① Statically Typed
- 기본은 정적 타입(Statically Typed) 언어
- 컴파일 시 변수의 '자료형'이 결정되니 안전하다.
정적 타입(Statically Typed) 언어 : C, C++, Java, Kotlin, ... (프로그램 실행 전 자료형 결정)
동적 타입(Dynamically Typed) 언어 : JavaScript, Python, Objective-C, PHP, ... (프로그램 실행 후 자료형 결정)
# 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 키워드가 제공된다.
var m: dynamic = 13
- 자료형(Type)을 명시하지 않아도 자료형 추론이 가능하다.
var m = 13
m = 15 // ok
m = "Hello!" // error!
m = 15.0 // error!
② Interoperable
- Java와 100% 호환 (Kotlin/JVM)
- 코틀린 컴파일러는 자바 중간 코드(ByteCode) 생성
- 이미 존재하는 자바 라이브러리를 그대로 이용
- Java와 Kotlin을 섞어서 써도 된다.
// Java
public class MyClass {
public void callKotlin() {
System.out.println(HelloKt.world("안녕", "하세요"));
}
}
// Kotlin
fun world(a: String, b: String): String {
return "$a $b Kotlin!"
}
③ Null Safety
- 코틀린은 널 안전성(Null Safety)을 제공한다.
- NPE(Null Pointer Exception)를 방지할 수 있는 안정성
- 널이 가능한 자료형(Nullable Type)과 불가능한(Non-Null Type) 자료형을 구분한다.
var a: String? = null
var b: String = "Hello"
b = null // error
/* 컴파일 안 됨. */
var name: String? = null
var len = name.length // 에러 : null 가능성 있는 경우 length에 접근 불가
/* 컴파일 가능, 세이프콜(Safe Call) 사용 */
var name: String? = null
val len = name?.length // name이 null이 아닐 경우에만 length에 접근
④ Immutable
- 상태를 바꾸지 않는 불변성 제공
- val (Value) = Immutable = Final Variable = 할당 후 변경 불가
- var (Variable) = Mutable = Non-Final Variable = 언제 든 변경 가능
val one: Int = 10 // Java: final int one = 20;
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() 를 사용해 요소 추가/삭제 불가능
⑤ Concise
- 코드의 간결성
- 자바처럼 장황하지 않은 깔끔함, 보일러플레이트 코드의 최소화
public class Address {
private String city;
private Country country;
public Address(String city, Country country) {
this.city = city;
this.country = country;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public Country getCountry() {
return country;
}
public void setCountry(Country country) {
this.country = country;
}
}
- 위의 긴 자바 코드를 코틀린에서는 다음과 같이 한 줄로 작성할 수 있다.
data class Address(var city: String, var country: Country)
⑥ Extension Function
- 확장 함수
- 클래스 상속이나 디자인 패턴을 사용하지 않고도 새로운 기능 확장 가능
- 단, 너무 많이 사용하면 기능들이 남발하게 되므로 가독성이 떨어진다.
- 클래스 상속이나 디자인 패턴을 사용하지 않고도 새로운 기능 확장 가능
class Original {
fun onlyOneFunction() {
println("Only One")
}
}
fun Original.myExtension(): String {
return "Original 클래스에 마치 멤버 메서드가 추가된 느낌!"
}
fun main() {
val originalObj = Original()
val result = originalObj.myExtension()
println(result)
}
// String : 수신 자료형(Receiver Type)
// this : 수신 객체(Receiver Object)
fun String.lastChar(): Char = this.get(this.length - 1)
println("12345".lastChar()) // 5 출력
⑦ Functional Programming
- 함수형 프로그래밍
- 함수의 유기적 연결을 통한 프로그래밍 방식
- 함수가 일급 객체(First-Class Citizens)로 사용할 수 있게 된다.
- 일급 객체는 함수의 인자, 반환값 심지어 자료구조에도 넣을 수 있다.
- 람다(Lambda)식을 통해 선언되지 않고도 익명의 함수 기능을 식에 전달할 수 있다.
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, 15))
// 57-15 = 42
}
for 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
println(out)
}
⑧ Multiplatform
- Kotlin Multiplatform = (Kotlin/JVM + Kotlin/Native + Kotlin/JS)
- iOS → Kotlin/Native
- Android → Kotlin/JVM
- Server → Kotlin/JVM
- Web → Kotlin/JS
- 사용 가능한 플랫폼
- Kotlin/JVM : 자바 가상 머신 상에서 동작하는 앱을 만들 수 있다.
- Kotlin/JS : 자바스크립트에 의해 브라우저에서 동작하는 앱을 만들 수 있다.
- Kotlin/Native : LLVM 기반의 네이티브 컴파일을 지원해 여러 타깃의 앱을 만들 수 있다.
- Kotlin/Native 에서의 타깃
- iOS (arm32, arm64, emulator x86_64)
- MacOS (x86_64)
- Android (arm32, arm64)
- Windows (mingw x86_64)
- Linux (x86_64, arm32, MIPS, MIPS little endian)
- WebAssembly (wasm32)
⑨ ETC
- DSL
- Coroutines
- Higher-order Functions
- OOP
참고 사이트
728x90
그리드형(광고전용)
'Programming > Kotlin' 카테고리의 다른 글
[Kotlin] 널(Null) (0) | 2022.08.28 |
---|---|
[Kotlin] 자료형과 변수 (0) | 2022.08.27 |
[Kotlin] InteliJ IDEA 살펴보기 & main() 함수 (0) | 2022.08.26 |
[Kotlin] 자바 JDK 설치하기 / 환경 변수 설정하기 (0) | 2022.08.26 |
[Kotlin] 코틀린의 개요 (0) | 2022.08.24 |
보일러플레이트(Boilerplate) (0) | 2021.04.05 |
함수에서 다양한 인자의 개수를 전달받기 (vararg 키워드) (0) | 2021.03.15 |
프로그램의 메모리 영역 (0) | 2021.03.13 |