EunGyeongKim

코틀린 특징 본문

기타 컴퓨터/kotlin

코틀린 특징

EunGyeongKim 2023. 5. 24. 22:54
  • 링크 :
  • 기본은 정적 타입 언어
    • 컴파일 시 변수의 자료형(type)이 결정되니 안전
    • 정적타입(statically typed)반대는?
      • 정적타입 : C, C++, JAVA, Kotlin,,,
      • 동적타입 : Javascript, python, objective-C, PHP
    • → 동적타입(Dynamically typed)
    • 단, kotlie/JS를 쓸때는 동적타입 지원을 위해 dynamic 제공
    • 자료형(type)을 명시하지 않아도 자료형 추론이 가능
  • interoperable
    • JAVA와 100% 호환(Kotlin / JVM)
      • 코틀린 컴파일러는 자바 중간코드(ByteCode)
      • 이미 존재하는 자바 라이브러리를 그대로 이용
      • Java와 kotlin을 섞어서 써도 됨
## JAVA

public class Customer{
    public static final String LEVEL = "Basic";
    
    public static void login(){
        System.out.println("login");
    }
}
## kotiln

fun main(){
    println(Customer.LEVEL)
    Customer.login()
}

java 보다 kotiln이 더욱 간편하게 코드를 쓸 수 있음.

 

## java

public class MyClass{
    public void callKotlin(){
        System.out.println(HelloKt.world("helld", "world!!"));
    }
}
//// kotlin 
// filename = 'Hello.kt'


fun world (a:String, b:String):String{
    return "$a, $b Kotlin !!"
}

 

  • null safety
    • NPE를 방지할 수 있는 안전성
      • Null point Exception
    • 널이 가능한 자료형(nullable type)과 불가능한(non-null type) 자료형을 구분
//// kotlin 

var a:String? null
var b:String = "hello"

b = null // Error!!

/* 컴파일 안됨*/
var name : String? = null
val len = name.length // Error : 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 = 언제든 변경 가능

 

//// kotlin 


val one : Int = 10 // Java: final int one = 20;
one = 12 // Error
var two : Int = 2
two = 5 // ok

val mutableList = mutavleListOf<Int>(1,2,3,4)
// .add()나 .remove()를 사용해 요소 추가 삭제 가능

val immutableList = listOf<Int>(1,2,3,4)
// .add()나 .remove()를 사용해 요소 추가 삭제 불가능

 

  •  Concise
    • 코드의 간결성 제공
      • 자바처럼 장황하지 않은 깔끔함, 보일러플레이트 코드의 최소화
// java

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;
    }
}

//// kotlin 

data class Address(var city:String, var country:Country)

 

  • Extension Functions
    • 확장함수
      • 클래스 상속이나 디자인 패턴을 사용하지 않고도 새로운 기능 확장 가능
        • 단, 너무 많이 사용하면 기능들을 남발하게 되므로 가독성이 떨어짐

 

//// kotlin 

class original {
    fun onlyOneFunction(){
        println("onle one!")
    }
}

fun original.myExtension(): String{
    return "original 클래스에 멤버 메서드 추가!!"
}

fun main(){
    val origianlObj = original()
    val result = origianlObj.myExtension()
    println(result)
}

 

  • Functional Programming
    • 함수형 프로그래밍
      • 함수의 유기적 연결을 통한 프로그래밍 방식
      • 함수가 일급객체(first-class citizens)로 사용할 수 있게 됨
        • 여기저기 사용가능
        • 권한이 많아짐함수형 프로그래밍 

  • 람다(lambda)식을 통해 선언되지 않고도 익명의 함수기능을 식에 전달할 수 있음
    • 람다 : 이름이 없는 함수 체계
      • 선언하지 않고도 함수의 기능을 식에 따라 사용 가능
//// kotlin 

fun 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)
}
//// kotlin 

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
}
  •  Multiplatform
    • DSL
    • Coroutines
    • Multiplatorm
    • higher-order functions
    • OOP

 

  • 다양한 플랫폼
    • 사용가능한 플랫폼
      • kotlin / JVM : 자바 가상머신상에서 동작하는 앱을 만들 수 있음
      • kotlin / JS : 자바스크립트에 의해 브라우저에서 동작하는 앱을 만들 수 있음
      • kotlin / Native : LLVM 기반의 네이티브 컴파일을 지원해 여러 타깃의 앱을 만들 수 있음
  • kotlin / Navtive에서의 타깃
    • iOS (arm32, arm64, emulator x86_64)
    • MacOS(x86_64)
    • Android(arm32, arm64) -> 주로 64에서 돌음
    • Windows(mingw x86_64)
    • Linux(x86_64, arm32, MIPS, MIPS little endian)
    • WebAssembly (wasm32) -> 웹엔진상에서 돌 수 있음

 

  • 비교문과 엘비스 연산자
    val len = if(str1 != null) str1.length else -1
    val len = str1?.length ?: -1
Comments