<함수 구조>
: 등호와 식으로 이뤄진 함수
fun max(a: Int, b: Int) : Int = if(a > b) a else b // 반환 타입 생략 가능
블록이 본문인 함수 : 본문이 중괄호로 둘러싸인 함수
변수 타입은 변수 이름 뒤에 선언
val answer: Int = 42
초기화 식을 사용하지 않고 변수를 선언하려면 변수 타입 반드시 명시(타입 추론 불가하기 때문에)
val answer: Int
answer = 42
val language = arrayListOf("Java")
language.add("Kotlin")
class Person(
val name: String, // 읽기 전용, 필드와 게터 만들어냄
var isMarried: Boolean // 쓰기 가능 프로퍼티, 필드 게터 세터 만들어냄
class Rectangle(val height: Int, val width: Int) {
val isSquare: Boolean
get() {
return height == width
}
}
패키지 - 같은 패키지에 속해있다면 다른 파일에서 정의한 선언일지라도 직접 사용 가능 -> 다른 패키지에 정의한 선언을 사용하려면 임포트 통해 불러오기
enum class Color (
val r: Int, val g: Int, val b: Int // 상수 프로퍼티 정의
) {
RED(255, 0, 0), ORANGE(255, 165, 0), YELLOW(255, 255, 0), GREEN(0, 255, 0),
BLUE(0, 0, 255), INDIGO(75, 0, 130), VIOLET(238, 130, 238);
fun rgb() = (r * 256 + g) * 256 + b
}
fun getWarmth(color: Color) = when(color) {
Color.RED, Color.ORANGE, Color.YELLOW -> "warm"
Color.GREEN -> "neutral"
Color.BLUE, Color.INDIGO, Color.VIOLET -> "cold"
}
fun mix(c1: Color, c2: Color) =
when(setOf(c1, c2)) {
setOf(RED, YELLOW) -> ORANGE
setOf(YELLOW, BLUE) -> GREEN
SetOf(BLUE, VIOLET) -> INDIGO
else -> throw Exception("Dirty color")
}
fun mixOptimized(c1: Color, c2: Color) = when {
(c1 == RED && c2 == YELLOW) || (c1 == YELLOW && c2 == RED) -> ORANGE
(c1 == YELLOW && c2 == BLUE) || (c1 == BLUE && c2 == YELLOW) -> GREEN
(c1 == BLUE && c2 == VIOLET) || (c1 == VIOLET && c2 == BLUE) -> INDIGO
else -> throw Exception("Dirty color")
}
스마트 캐스트 : 코틀린 컴파일러가 자동으로 타입을 변환해주는 기능
-> is 연산자를 사용해 변수 타입 검사하고 나면 캐스팅을 수행해줌(프로퍼티가 반드시 val이어야 함)
while (조건) { /*...*/ }
do { /*...*/ } while (조건)
수열: 어떤 범위에 속한 값을 일정한 순서로 이터레이션하는 경우
for((key, value) in 맵) { }
fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit(c: Char) = c !in '0'..'9'
fun recognize(c: Char) = when (c) {
in '0'..'9' -> "It's a digit!"
in 'a'..'z', in 'A'..'Z' -> "It's a letter!"
else -> "I dont' know..."
범위는 문자 뿐만 아니라 비교가 가능한 클래스라면 가능
println("Kotlin" in "Java".."Scalla") // true
println("Kotlin" in setOf("Java", "Scala")) // false
fun readNumber (reader: BufferedReader) {
val number = try {
Integer.parseInt(reader.readLine()) // 예외가 발생하지 않으면 이 값을 사용
} catch (e: NumberFormatException) {
null // 예외가 발생하면 null 값 사용
}