본문의 내용에 대한 강의는 아래의 링크에서 참고하실 수 있습니다.
https://www.boostcourse.org/mo001
코틀린의 특징에 대해 알아보자!
코틀린은 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의 멀티플랫폼은 아직 부족하다
'언어 > Kotlin&Java' 카테고리의 다른 글
[Kotlin/Java] Android Studio에서 테스트 환경 구축하기_1(수정) (0) | 2021.08.12 |
---|---|
[코틀린/Kotlin] 기초 #04_기본형 vs 참조형 (0) | 2021.08.10 |
[코틀린/Kotlin] 기초 #03_코틀린 입출력 (0) | 2021.08.09 |
[코틀린/Kotlin] 기초 #02_문자열( == vs ===) (2) | 2021.07.28 |
[코틀린/Kotlin] 기초 #01_변수와 자료형 (0) | 2021.07.27 |
댓글