코틀린
=> 자바의 가상 머신인 JVM에 기반을 둔 언어. 즉, JVM에서 실행할 수 있습니다.
자바의 확장자 => .java
코틀린의 확장자 =>. kt
확장자는 달라도. kt파일을 컴파일하면 자바 바이트 코드가 만들어집니다. 즉 JVM이 실행함
코틀린의 이점
표현력과 간결함(expressive and concise)
최신 언어 기법을 이용하면 훨씬 간결하게 프로그램을 작성할 수 있습니다. 자바 코드와 비교해보면 코틀리 코드가 훨씬 간결하다
안전한 코드(safer code)
널(null) 안정성을 지원, 객체지향 프로그래밍에서 객체가 널 상태일수 있으며 널 포인트 예외가 발생할 수 있음. 그래서 널 일 때를 고려하여 개발하여야 하지만 코틀린에서는 널 허용 널 불허용으로 구분하여 선언 따라서 널 관련된 곳은 컴파일러가 알아서 해결해줌
상호 운영성(interoperable)
코틀린은 자바와 100% 호환됨. 따라서 자바 클래스와 라이브러리를 혼용해도 됩니다. 반대로 자바에서도 코틀린을 사용할 수 있으며 서로 혼용 가능합니다
구조화 동시성(structured concurrency)
코 루틴이라는 기법을 이용하면 비동기 프로그래밍을 간소화할 수 있습니다. 따라서 네트워크 연동 DB 갱신 같은 작업을 할 때 프로그램을 더 간소화할 수 있음
변수 선언하기
val(혹은 var) 변수명 : 타입 = 값
val : value의 줄임말, 바꿀 수 없는 변수를 선언할 때 사용
var : variable의 줄임말, 값을 바꿀수 있는 변수를 선언할때 사용
타입을 명시할 수 있으며, 대입하는 값에 따라 추론할 수 있을 때는 생략합니다.
최상위에 선언한 변수나 클래스의 멤버 변수는 선언과 동시에 초깃값을 할당해야 하며, 함수 내부에 선언한 변수는 선언과 동시에 초깃값을 할당하지 않아도 됩니다.
val data1: Int // 오류
val data2 = 10 //성공
fun someFun(){
val data3: Int
println("data3 : $data3") // 오류
data3 = 10
println("data3 : $data3") // data3 : 20
}
class User{
val data4: Int // 오류
val data5: Int = 10 //성공
}
그렇지만 초깃값을 할당할 수 없는 경우 컴파일러에게 알려주어야 합니다. 그때 사용하는 것이 lateinit과 lazy 키워드입니다.
lateinit 키워드는 이후에 초깃값을 할당할 것임을 명시적으로 선언합니다.
lateinit var data1: Int//오류
lateinit val data2: String//오류
lateinit var data3: String//성공
- lateinit은 var 키워드로 선언한 변수에만 사용할 수 있습니다
- Int, Long, Short, Double, Float, Boolean, Byte 타입에는 사용할 수 없습니다
lazy 키워드는 변수 선언문 뒤에 by lazy {} 형식으로 선언되며 최초 이용되는 순간 중괄호 부분이 자동으로 실행되어 결괏값이 할당됩니다.
val data1: Int by lazy{
println("lazy")
10
}
fun main(){
println("main")//main
println(data1+10)//lazy\n20
println(data1+10)//20
}
데이터 타입
코틀린의 모든 변수는 객체입니다. 따라서 코틀린의모든 타입은 객체 타입입니다. 정수를 다루는 타입이 Int인데 Int는 기초 데이터 타입이 아니라 클래스입니다.
fun testFun(){
var data1: Int = 10
var data2: Int? = null // null 대입 가능
data1 = data1 + 10
data1 = data1.plus(10) // 객체의 메서드 이용가능
}
기초 타입 객체
정수 : Int, Short, Long / 실수 : Double, Float / 2진수 : Byte / 불리언 : Boolean
문자 : Char 작은 따옴표(')로 감싸서 표현 Number타입으로는 표현할 수 없음
문자열 : String 큰 따옴표(")나 삼중 따옴표(""")로 감싸서 표현. 큰 따옴표에서 줄 바 꾸이나 들여쓰기를 유지하려면 이스케이프 시퀀스를 입력해야합니다. 그렇지만 삼중따음표에서는 줄바꾸이나 들여 쓰기가 그대로 반영됩니다. String타입의 데이터에 변숫값이나 어떤 연산식의 결괏값을 포함해야 할 때는$기호를 이용하며 문자열 템플릿이라고 함
Any - 모드 타입이 가능한 코틀린의 최상위 클래스 따라서 Any타입으로 선언한 변수에는 모든 타입의 데이터를 할당할 수 있습니다.
Unit - 반환문이 없는 함수
특수한 상황을 표현하려는 목적으로 사용합니다. Unit타입으로 선언한 변수에는 Unit객체만 대입할 수 있습니다. 주로 함수의 만화 타입으로 사용합니다. 함수에서 반환문이 없음을 명시적으로 나타낼 수 있습니다. 또한 함수를 선언할 때 반환 타입을 생략하면 자동으로 Unit이 적용됩니다.
Nothing - null이나 예외를 반환하는 함수
Unit과 마찬가지로 특수한 상황을 표현하려는 목적으로 사용합니다. null만 대입할수있기 때문에 데이터로서는 의미가 없습니다. 주로 함수의 반환타입에 사용 합니다. 항상 null만 반환하는 함수나 예외를 던지는 반환타입에 사용합니다.
널허용과 불허용
null은 값이 할당되지 않은 상황을 의미합니다. 코틀린에서는 변수를 선언할때 null허용인지 불허용인지 명확하게 구분해서 선언해야 합니다. 이런한구분은 변수를 선언할때 타입 뒤에 ?로 표시 합니다. ?가 있으면 널허용 없으면 불허용을 의미합니다.
'안드로이드 > 깡샘의 안드로이드 앱 프로그래밍' 카테고리의 다른 글
코틀린 공부05 (0) | 2022.01.20 |
---|---|
코틀린 공부04 (0) | 2022.01.16 |
코틀린 공부03 (0) | 2022.01.15 |
코틀린 공부02 (0) | 2022.01.14 |
Kotlin책 - Doit 깡샘의 안드로이드 앱 프로그래밍 with Kotlin (0) | 2022.01.13 |