코틀린은 안드로이드 애플리케이션 공식 개발언어이다. 안드로이드 애플리케이션은 자바와 코틀린으로 개발할 수 있다.
코틀린의 특징
- 코틀린 컴파일러는 JVM(자바 가상머신)에서 실행되는 자바 바이트 코드(클래스 파일)를 생성하므로,
자바와 완벽하게 호환되는 크로스 플랫폼을 지원
- 자바 애플리케이션이 실행 가능한 환경이면 코틀린 애플리케이션도 실행 가능
- 다음과 같은 애플리케이션 작성 가능
- 네이티브 애플리케이션
- 웹 브라우저에서 실행되는 자바스크립트
- 서버에서 실행되는 Http 서블릿
- 구글 안드로이드 애플리케이션
- 객체지향 프로그래밍 지원
- 함수형 프로그래밍 지원함
- 문법과 코드 간결
- 코틀린 개발 IDE : IntelliJ, Android Studio, Eclipse, Compiler
기본타입
- 코틀린에서 모든 것이 객체 : 멤버함수나 프로퍼티 호출할 수 있다
- Numbers(Byte,Short,Int,Long,Float,Double), Character(Char), Boolean, Array, String
- Char가 코틀린에서는 숫자형이 아니다
- Numbers
- 10진수 : 123
- 16진수 : 0x0F
- 2진수 : 0b00000010101001
- 8진수는 지원하지 않는다
- Long : 123L
- Double : 123.9, 123.3e10
- Float : 13.4f
- Underscores( _ ) : 숫자가 길어서 실수할 수 있어서 구분자를 주는 것
- val oneMillion = 1_000_000
- val creditCardNumber = 1234_5678_3456L
- Explicit Conversions
- 작은 타입은 큰 타입의 하위 타입이 아니다 -> 작은 타입에서 큰 타입으로 대입이 안된다(서로간에 상속관계가 없다)
모든 숫자 데이터 클래스는 Number라는 추상 클래스를 상속하고 있다
val a:Int =1
val b:Long = a //오류
val a:Int =1
val b:Long = a.toLong()
<타입 변환 함수들>
toByte() toShort() toInt() toLong() toFloat() toDouble() toChar()
- 산술 연산에서는 묵시적 변환이 이루어짐
val num = 1L + 3 // Long + Int => Long
- Characters
- char는 숫자로 취급되지 않음, 비교도 하면 안됨 ex> char c ==1 (오류)
변수 및 상수
- 클래스의 멤버 변수 및 전역 변수는 반드시 선언하면서 초기화해야 함
- 지역 변수의 경우, 선언 후 사용 가능하다(단, 초기화가 되어 있지 않으면 사용할 때 에러 발생함)
변수(Variable, mutable variable)
형식 : var variable:Type = value
var a: Int = 7
var b: Double = 10.5
상수(Value, immutable variable) => Java에서는 final 키워드에 해당한다
형식 : val variable:Type = value
val variable:Type = value
val a: Int = 7
val b: Double = 10.5
숫자 타입
val a = 100 // 자동 추론(Int) -> 생략 가능
val b:Long = a // 숫자 타입간 변환 자동으로 해주지 않음, Int타입에서 Long타입으로 변환 안된다. 꼭 명시적으로 형변환 해줘야함
val b:Long = a.toLong() // 변환 함수 사용
val b:Long = a + 1L // 표현식을 Long 타입으로 변환
val b:Long = a+3.5 // 에러난다
문자열 : String 타입
// Escape string
val s1 = "hello\nworld"
// Raw String -> 입력형태 그대로 출력한다 (""" """ 사용)
val s2 = """hello world"""
Raw String에는 trim이라는 기능을 사용할 수 있다.
trimIndent() -> 들여쓰기 했던것을 지우겠다.
trimMargin(">") -> 파라미터로 준 기호(여기서는 >)까지 trim하겠다.
String 타입을 숫자로 변환하고 싶으면 명시적으로 변환함수를 호출해주면 된다.
toInt() , toDouble()
변수나 상수 출력할때는 $기호를 사용하고 변수명을 주면 된다.
${표현식}--> 계산이 된다.
문자열 비교
== : java의 equals()와 동일
모든 변수는 null을 허용하지 않음
- 객체의 생성과 동시에 초기화해야 함
- Null을 허용하려면 물음표(?)를 추가해야 함
- 타입을 생략할 수 없음
var str:String? = "hihello"
str = null (가능)
val a:String //오류
val b:String? = null
var c:String // 오류
var d:String? = null
Variable Nullable
- Lateinit 키워드로 나중에 초기화 가능 -> 쓰기전에 초기화 꼭 해주기
- Var 변수에만 사용 가능
- Null 값으로 초기화할 수 없음
- 초기화 전에는 사용할 수 없음
- Int, Long, Double, Float 등 기본 데이터 타입에는 사용할 수 없음
lateinit var c: String
c="Hello"
println(c)
- Lazy로 늦은 초기화
- Val 에 사용하여 늦은 초기화
- 초기화 블록에 초기화에 필요한 코드 작성
- 처음 호출될 때 초기화 블록의 코드가 실행됨
- 마지막 줄에는 초기화할 값을 명시함
val str:String by lazy{
print("초기화")
"Hello"
}
이렇게 되면 처음에는
println(str) 하면 초기화Hello
그다음에 println(str) 하면 Hello출력됨
같은 String 타입이여도 Null값을 가질 수 있는 타입과 가질 수 없는 타입으로 구분이 된다.
두 타입은 같은 타입이여도 대입이 되지 않는다.
!!: Null값이 아님을 보증(!!)
- 변수 뒤에 !!를 추가하면 null값이 아님을 보증 -> 아닐 경우 에러
val name:String? = "greenjoa"
val name2:String = name //오류
val name3:String? = name // OK
val name4:String = name!! // OK
변수 및 상수: Variable Nullable
안전한 호출(?.)
- Null 값이 아닌 경우에만 호출
val str:String? = null
var upperCase = if(str!=null) str else null // null
upperCase.toUpperCase() // 에러
-> String값이 될거라고 예상했지만 지금은 null값이기 때문에 멤버함수 호출 불가-> if문으로 해서 해결
upperCase = str?.toUpperCase() // null -> str이 null값이 아니면 뒤에부분 실행해서 반환하고 아니면 그냥 str반환
엘비스(Elvis) 연산자 (?:) -> null일 경우 default값을 지정할때 사용
- Null이 아닌 기본 값을 반환하고 싶을 때 사용
val str:String? = null
var upperCase = str?.toUpperCase() ?:"초기화하시오" --> str이 null값인 경우 "초기화하시오"구분을 넣겠다
// 꼭 ?.이랑같이 쓸 필요는 없음
var upperCase = str?:"초기화하시오"
배열
Array클래스
- Array<String>과 같이 제너릭 타입으로 나타냄
- 배열은 크기를 변경할 수 없음
배열 생성 - arrayOf 함수
- val item: Array<Any> = arrayOf(1,"바나나",false)
//자바에서 object타입에 해당, 꺼낼때는 어떤 type인지 모르니까 typecasting해서 사용하자
- val item:Array<String> = arrayOf("사과", "바나나", "키위")
빈 배열 생성도 가능
// val arr = arrayOfNulls<Int>(10)
배열 생성 - Array 생성자 // 생성자에는 배열의 크기와 init이라고 하는 함수가 인자로 들어감, 각 원소는 init함수에 의해서 초기화 됨
val item2 = Array<String>(5) { i->(i*i).toString() } // 람다 함수
item2[0] = item[1]
for(fruit in item2){
println(fruit)
}
앞선 것은 제너릭 타입
기본 타입 요소를 저장하는 배열 클래스 // 이것도 array타입, 생성자 둘다 가능하다.
val item: IntArray = intArrayOf(1,2,3,4,5)
val item2: IntArray(5) { j->(j*j) }
for(num in item2){
println(num)
}
ByteArray, ShortArray, IntArray, LongArray, FloatArray,... 등등 사용가능
연산자
- 연산자와 연산자 오버로딩
: 내부적으로 연산자 오버로딩(overloading)한 함수를 사용해서 연산을 처리
a+b // a.plus(b) // a와b의 값을 더한다
=> 6개가 된다는 의미는 다른 타입과는 덧셈 연산이 안된다는것을 의미한다.
연산자 오버로딩을 클래스에 오버로딩해서 만들면 된다.
-단항 연산자
+a, -a, !a, ++a, a++, --a, a--
-복합 대입 연산자
a+=b
a-=b
a*=b
a/=b
a%=b
-비트 연산자 - 오버로딩하고 있지 않음
그냥 함수를 호출해서 사용한다.
8 shr 2
8 shl 4
infix라는 키워드를 가지고 있어서 연산자 처럼 사용할 수 있다.
- 논리 연산자
and, or, not 기호 연산자도 사용가능한데 기능은 살짝 다름
and 연산자는 단락평가를 하지 않는 연산
&&은 단락평가를 적용해서 연산을 한다
- 동등 비교 연산자
=== : 오버로딩 안됨(참조값이 같은지 판단)
in 연산자
- 특정 객체가 컬렉션에 저장되어 있는지 확인
범위(..) 연산자
- a..b : a에서 b까지의 범위 값이 생성 => a.rangeTo(b) 코드로 변환
val start = LocalDate.now()
val end = start..start.plusDays(15)
println(start.plusWeeks(1) in end) // 있으면 true 없으면 false -> 여기서는 true
- 인덱스 연산자
a[i] -> a.get(i)
- invoke 연산자 : 객체를 통한 함수 호출
invoke 오버로딩하면 클래스의 instance를 함수처럼 사용할 수 있다.
- 타입 확인 연산자 : is, !is
입출력
- 출력 : println 함수 사용
- 입력 : readline함수-> 한 라인을 입력받음
타입 바꾸고 싶으면 명시적으로 toInt() 이런거 쓰면된다.
아니면 Java패키지 import해서 java.util.Scanner쓰면 된다.
치환 연산자 사용하면 됨(스캐너 객체 생성에만 주의)
print("Enter text: ")
val stringInput = readLine()!!
println("You entered: $stringInput")
//자바의 Scanner 객체 사용(import java.util.Scanner)
val reader = Scanner(System.`in`)
print("Enter a number: ")
var integer:Int = reader.nextInt()
println("You entered: $integer")
난수 발생
// 1. Java의 Random 클래스 사용
// Java.util.random 클래스 import 해야 함
val num = Random().nextInt(10)
// 2. Kotlin에서의 사용
val num = (0..10).random()
'App > Android' 카테고리의 다른 글
[4] Kotlin - 클래스, 컬렉션 (0) | 2022.03.13 |
---|---|
[3] Kotlin : 제어문, 함수 (0) | 2022.03.11 |
[1] Android 소개 (0) | 2022.03.08 |
RecyclerView (0) | 2021.08.25 |
Fragment (0) | 2021.08.23 |