목차
이 글은 https://kotlinlang.org/docs/reference/ 의 공식문서를 참고해서 한글로 차근차근 공부하며 정리한 글입니다. 아무쪼록 도움이 되시길 바라겠습니다.
fun main(args: Array<String>) {
val age = 30
val name: String = "Seo Jaeryong"
println(name.length)
}
fun main(args: Array<String>) {
val age: Int = 30
a = 20 // error
}
fun main(args: Array<String>) {
var age: Int = 30
a = 20 // ok
}
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
fun maxOf(a: Int, b: Int): Int = if (a > b) a else b
fun maxOf(a: Int, b: Int) = if (a > b) a else b
throw NullPointerException()
호출!!
오퍼레이터 사용var a: String = "abc"
a = null // error
var b: String? = "abc"
b = null // ok
var b: String? = "abc"
b.length // error
b?.length // ok
// Java
String name;
if (bob != null) {
if (department != null) {
if (head != null) {
name = bob.department.head.name;
}
}
}
// Kotlin
var name: String = bob?.department?.head?.name ?: "" // ok
!!
operator (for nullable) NPE-lovers
.var b: String? = null
val l = b!!.length // ok, but throw an NPE if b is null
val aInt: Int? = a as? Int // return `null` if the attempt was not successful
val nullableList: List<Int?> = listOf(1, 2, null, 4)
val intList: List<Int> = nullableList.filterNotNull()
public (default)
: 전역 프로젝트에 공개private
: 같은 파일내에 공개protected
: Subclasses에 공개internal
: 같은 Module내에 공개Module이란?
- IntelliJ an IntelliJ IDEA module
- a Maven project
- a Gradle source set
- a set of files compiled with one invocation of the Ant task.
fun demo(x: Any) {
if (x is String) {
print(x.length) // x가 자동으로 String으로 형변환 된다.
}
}
fun demo1(x: String?) {
if (x != null) {
demo2(x) // x가 자동으로 NonNull String으로 형변환 된다.
}
}
fun demo2(x: String) {
print(x.length)
}
val items = listOf("apple", "banana", "kiwi")
for (index in items.indices) {
println("item at $index is ${items[index]}")
}
결과
item at 0 is apple
item at 1 is banana
item at 2 is kiwi
for (i in 0..10) {
print(i)
}
결과
012345678910
val items = listOf("apple", "banana", "kiwi")
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}
결과
item at 0 is apple
item at 1 is banana
item at 2 is kiwi
when (obj) {
1 -> "One"
"Hello" -> "Greeting"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // Note the block
print("x is neither 1 nor 2")
}
}
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
// 정의 방법
infix fun Int.shl(x: Int): Int {
...
}
1.shl(2)
1 shl 2 // can also be called like this
// ViewExt.kt
fun View.show() {
visibility = View.VISIBLE
}
fun View.hide() {
visibility = View.GONE
}
// SearchActivity.kt
var textView = findViewById(R.id.textView) as TextView
textView.show() // ok
textView.hide() // ok
class Invoice {
}
class Empty
class Person constructor(firstName: String) {
}
class Person(firstName: String) {
}
class Customer(name: String) {
init {
logger.info("Customer initialized with value ${name}")
}
}
class Customer {
constructor(name: String) {
logger.info("Customer initialized with value ${name}")
}
}
class Customer public @Inject constructor(name: String) { ... }
data class Customer(val name: String, var email: String)
open class Base(p: Int)
class Derived(p: Int) : Base(p)
abstract class Base {
abstract fun f()
}
class Derived() : Base() {
override fun f() {
// ...
}
}
불가능
class Outer {
private val bar: Int = 1
class Nested {
fun foo() = 2 // bar 참조 불가
}
}
val demo = Outer.Nested().foo() // == 2
가능
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar // bar 참조 가능
}
}
val demo = Outer().Inner().foo() // == 1
object
키워드를 사용하고 타입은 interface
나 abstract class
를 받는다.interface
: 이름 뒤에 ()를 붙이지 않는다. View.OnClickListener
abstract class
: 이름 뒤에 ()를 붙인다. SimpleOnQueryTextListener()
// interface
button.setOnClickListener(object : View.OnClickListener {
override fun onClick(view: View) {
// ...
}
})
// abstract class
searchView.setOnQueryTextListener(object : SimpleOnQueryTextListener() {
override fun onQueryTextSubmit(query: String): Boolean {
presenter.searchImage(query)
return false
}
})
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
뒤
에 오는 참조가 private으로 저장
된다.앞
에 오는 인터페이스의 메소드를 자동 생성
한다.interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
// b가 Derived내에 private으로 저장 됨
// Base의 메소드를 Derived내에 자동 생성한다.
// 그 메소드들은 b를 참조하여 실행한다.
class Derived(b: Base) : Base by b
fun main(args: Array<String>) {
val b = BaseImpl(10)
Derived(b).print() // prints 10
}
// class
data class Person(val name: String, val age: Int)
val (name, age) = Person("Jee-ryong", 30)
print("My name is $name and I am $age years old.")
// map
for ((key, value) in map) {
print("key is $key")
print("value is $value")
}
val lists: List<Int> = listOf(1, 2, 3) // read only
val lists: MutableList<Int> = mutableListOf(1, 2, 3) // read/write
val lists: ArrayList<Int> = arrayListOf(1, 2, 3) // read/write
// new instance
val map = mapOf("Korea" to 1, "Japan" to 2) // read only
val map = mutableMapOf("Korea" to 1, "Japan" to 2) // read/write
val map = linkedMapOf("Korea" to 1, "Japan" to 2)
val map = hashMapOf("Korea" to 1, "Japan" to 2)
val map = sortedMapOf("Korea" to 1, "Japan" to 2)
// use
map.put("London", 3)
map.get("Korea")
map["Korea"]
map.containsKey("Japan")
map.toList()
map.toMap()
map.toMutableMap()
map.toSortedMap()
// new instance
val set = setOf("Korea", "Japan")
val set = mutableSetOf("Korea", "Japan")
val set = hashSetOf("Korea", "Japan")
val set = linkedSetOf("Korea", "Japan")
val set = sortedSetOf("Korea", "Japan")
// use
set.add("London")
set.remove("London")
set.contains("London")
set.size
set.toList()
set.toMutableList()
set.toSet()
set.toHashSet()
set.toMutableSet()
set.toSortedSet()
for (i in 1..4) print(i) // prints "1234"
for (i in 1..4 step 2) print(i) // prints "13"
for (i in 4 downTo 1) print(i) // prints "4321"
for (i in 4 downTo 1 step 2) print(i) // prints "42"
for (i in 1 until 10) println(i) // prints "123456789"
(1..12 step 2).last // 11
===
, !==
)val a = Integer(10)
val b = a
a === b // true
a !== b // false
val a = Integer(10)
val b = Integer(10)
a === b // false
a !== b // true
==
, !=
)data class Person(val name: String, val age: Int)
val person = Person("Jae-ryong", 20)
val person2 = Person("Jae-ryong", 20)
person == person2 // true
person != person2 // false
val hobbies = arrayOf("Hiking", "Chess")
val hobbies2 = arrayOf("Hiking", "Chess")
assertTrue(hobbies contentEquals hobbies2) // passed
// 참고 - contentEquals는 미리 정의 된 infix함수이다.
public infix inline fun <T> kotlin.Array<out T>.contentEquals(other: kotlin.Array<out T>): kotlin.Boolean
// example
fun <T, R> List<T>.map(transform: (T) -> R): List<R> {
val result = arrayListOf<R>()
for (item in this)
result.add(transform(item))
return result
}
var ints = listOf(1,2,3,4,5)
val doubled = ints.map { value -> value * 2 }
it
을 사용하면 input 파라미터 생략가능ints.map { it * 2 }
_
로 선언 가능var map = mapOf("Korea" to "Seoul", "Japan" to "Tokyo")
map.forEach { _, value -> println("$value!") }
[Android] error: failed linking file resources. (0) | 2019.09.10 |
---|---|
[유용한 팁] AndroidManifest에 Gradle 빌드 변수 삽입하는 2가지 방법 (0) | 2018.08.19 |
JAR, AAR, DEX, APK 차이점 (0) | 2017.03.01 |
Android Studio에서 AIDL 사용하기 (2) | 2016.12.14 |
Drawable의 mutate함수 (0) | 2016.11.28 |