별의 공부 블로그 🧑🏻‍💻
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

 

참고 사이트

 

Hello, 코틀린!

부스트코스 무료 강의

www.boostcourse.org

728x90
그리드형(광고전용)
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️


📖 Contents 📖