본문 바로가기
언어/Kotlin&Java

[코틀린/Kotlin] 기초 #00_코틀린의 특징

by 옹구스투스 2021. 7. 9.
반응형

본문의 내용에 대한 강의는 아래의 링크에서 참고하실 수 있습니다.

https://www.boostcourse.org/mo001

 

Hello, 코틀린!

부스트코스 무료 강의

www.boostcourse.org

코틀린의 특징에 대해 알아보자!

코틀린은 IntelliJ IDEA의 개발사 JetBrains에서 자바를 보완하기 위해 만든 안드로이드 first 언어이며,

문법이 상당히 간결하고, 세미콜론도 필요 없다.//세미콜론(땀)이 없어서 시원하다ㅎㅎ

현재 안드로이드 앱 개발을 Java로만 하던 중, 신세대적인 Kotlin의 필요성을 느껴
Kotlin 공부를 시작했다. 그럼 Kotlin 언어의 특징에 대해 자세히 알아보자.

1.Statically Typed

-정적 타입 언어 // kotlin/JS를 사용할 때는 동적 타입 지원을 위해 dynamic 제공

-자료형을 명시하지 않아도 자료형 추론이 가능하다.

-컴파일 시 변수의 자료형이 결정되어서 안전하다.

//프로그램 실행 전, 이미 변수의 자료형이 결정되어 있으니 컴파일러에서 문제가 있으면 잡아낸다.

정적타입 : c,c++,java,kotlin...
동적타입 : JavaScript, python, objective-c,php...

2.Interoperable

-Java와 100% 호환 (Kotlin/JVM) //아래에서 설명하겠지만 Kotlin/JVM은 안드로이드와 서버 개발에 사용하는 형태다.

-코틀린 컴파일러는 자바 중간코드(ByteCode)를 생성한다.

//java와 kotlin은 ByteCode -> JVM -> Architecture로 다양한 아키텍처에서 활용이 가능하다

//kotlin은 최신의 문법을 사용하면서도, Java의 기술을 사용할 수 있다.

-이미 존재하는 자바이브러리를 그대로 이용한다.

-고로 Java와 Kotlin을 섞어서 쓰는 것이 가능하다 (코드0,1)

 

java 코드0

public class Customer {
    public static final String LEVEL ="BASIC";
    public static void login(){
        Systeem.out.println("Login");
    }
}

kotlin 코드0

//클래스로 덮지 않아도 됨
//메인은 진입점(top level)최상위 함수
fun main(){
    println(Customer.LEVEL)
    Customer.login()
}

java 코드1

public class MyClass{
    public void callKotlin(){
        System.out.println(HelloKt.world("안녕","하세요"));
        //코틀린의 파일명을 자바가 인식하는 클래스로 불러옴
    }
}

kotlin 코드1

//파일명 : Hello.kt
fun world(a: String, b: String) : String{
return "$a $b Kotlin!"
}

3.Null Safety

-NPE를 방지할 수 있는 안전성 //Null Pointer Exception

-널이 가능한 자료형(Nullable Type)과 불가능한 (Non-Null-Type)자료형으로 구분 코드(3,4,5)

 

코드3

var a: String? = null
var b : String = "Hello"
b= null //error
//String?과 String은 다른 자료형 String? == Nullable, String ==Non-Null

코드4

//컴파일 안 됨
var name: String? = null
val len = name.length // 에러 : null 가능성 있는 경우 length에 접근 불가

코드5

//컴파일 가능, 세이프콜(Safe Call) 사용
var name : String? = null
val len = name?.length //name이 null이 아닐 경우에만 length에 접근

4.Immutable

-상태를 바꾸지 않는 불변성 제공

-val(value) = Immutable = Final/Const variable = 할당 후 변경 불가 (코드6)

-var(variable) = Mutable = Non-Final/Const variable = 언제든 변경 가능 (코드6)

//되도록 val을 사용하고 바꿀 일이 있는 변수만 var 사용

-자바는 불변성을 제공하는 컬렉션이 없었지만 java9부터는 제공

ex) List a = List.of("a","b","c");

 

코드6

//val은 바구니만 담고 있는 거지 안에 있는 요소들은 변경 가능
val mutableList = mutableListOf<Int>(1,2,3,4)
mutableList = IntArrayOf(1,2,3)// error  바구니 자체를 변경하는 것은 불가
//add()나 remove()를 사용해 요소 추가 삭제 가능
val immutableList = listOf<Int>(1,2,3,4)
//add()나 remove()를 사용해 요소 추가 삭제 불가능

5.Concise

-코드의 간결성

-자바처럼 장황하지 않은 깔끔함, 보일러플레이트 코드의 최소화 (코드7)

//보일러플레이트 : 꼭 필요한데 매번 작성하기 귀찮은 것

 

java 코드7

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 String setCity(String city){
        this.city= city;
    }
    public String getCountry(){
        return country;
    }
    public String setCountry(){
        this.country = country;
    }
}

kotlin 코드7

kotlin
//알아서 게터, 세터 등의 필요한 함수를 만들어줌
data class Address(var city:String, var country:Country)

6.Extension Functions

-확장 함수

-클래스 상속이나 디자인 패턴을 사용하지 않고도 새로운 기능 확장 가능

//단, 너무 많이 사용하면 기능들이 남발하게 되므로 가독성이 떨어진다.

 

코드8

class Original {
    gun 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())

7.Functional Programming

-함수형 프로그래밍

-함수의 유기적 연결을 통한 프로그래밍 방식

// 객체가 아닌 함수의 유기적 연결 -> 클래스 없음

// 때에 따라 클래스도 사용할 수 있는 함수형 프로그래밍과 OOP의 성격을 띈 멀티패러다임 언어

-함수가 일급 객체(First-class citizens)로 사용할 수 있게 된다. //권한이 많다, 여기저기 사용될 수 있다.

-람다(Lambda)식을 통해 선언되지 않고도 익명의 함수기능을 식에 전달할 수 있다.

 

코드9

//add, substract, main은 최상위 함수
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
}
//즉 일금 객체는 함수의 인자, 반환값, 심지어 자료구조에도 넣을 수 있다.
//값에 해당되는 부분을 함수로 넣어버리는 것


//람다 : 이름이 없는 함수체계
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}와 동일
    println(out)
    //11 + 10 +(11+10)= 42
}

7.이외에 알아야 할 것들

코루틴 : 비동기 처리기법
dsl : domain s? language  언어를 만들어내는 것 //매우 편리함
Higher-order Functions : 고차 함수 //함수에 인자를 넣거나 등등의 원리
OOP : 객체지향
Multiplatform
Kotlin Multiplatform = (Kotlin/JVM + Kotlin/Native + Kotlin/js)
Common Code로 다양한 플랫폼에서 사용하게 만들 수 있음
kotlin/JVM == Android
kotlin/JVM == Server
kotlin/Native ==iOS
kotlin/JS ==Web

kotlin/JVM - 자바 가상 머신 상에서 동작하는 앱을 만들 수 있다.
kotlin/JS - 자바스크립트에 의해 브라우저에서 동작하는 앱을 만들 수 있다.
kotlin/Native - LLVM기반의 네이티브 컴파일을 지원해 여러 타깃의 앱을 만들 수 있다.

Kotlin/Native에서의 타깃
아직 알파버전으로 점진적으로 가능하게 끔 디벨롶중
UI를 제외한 비즈니스 로직만 공통으로 만들면 나머지 UI는 각각의 플랫폼에 맞게 사용하여 개발
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)

React Native가 가장 잘나가고, flutter도 치고 올라왔다.
kotlin의 멀티플랫폼은 아직 부족하다 

 

반응형

댓글