다루는 내용
- 함수, 변수, 클래스, enum, 프로퍼티
- 스마트 캐스트
- 예외 던지기, 예외 잡기
1. 함수, 변수, 클래스, enum, 프로퍼티
1. 함수
- 함수 선언 fun
- fun max(a: Int, b: Int): Int { return if (a > b) a else b }
- 식이 본문인 함수 = , 반환타입 생략
- 타입 추론을 통해 반환타입을 분석한다.
- fun max(a: Int, b: Int): Int = if (a > b) a else b
2. 변수
- 변수 선언 키워드
- val(value) : 변경 불가능 (자바의 final)
- val 참조 자체는 불변일지라도, 그 참조가 가리키는 객체의 내부 값은 변경될 수 있다.
- val language = arrayListOf("java") language.add("kotlin")
- var(variable) : 변경 가능(mutable)
- 변수 타입은 고정돼 바뀌지 않는다.
- var answer = 42 answer = "no changed" // 컴파일 에러
기본적으로 모든 변수를 val 키워드를 사용하고, 꼭 나중에 필요할 때에만 var로 변경하자
- 변수 선언 방법에 두 가지가 존재한다.
- 초기화 식이 있는 경우 : 값 지정 → 타입 추론
- val step1 = 42 var step2 = 25
- 초기화 식이 없는 경우 : 변수 타입 지정 → **타입 지정**
- val step3 : Int
3. 클래스와 프로퍼티
- 자바의 클래스(Person)와 프로퍼티(name)
- public class Person { private final String name; public Person(String name) { this.name = name; } public String getName() { return name; } }
- 코틀린의 클래스와 프로퍼티
- class Person(val name: String)
그럼 프로퍼티를 어떻게 선언해야 할까?
class Person(
val name: String, // 읽기 전용 프로퍼티. private필드 / getter
var isMarried: Boolean // 쓸 수 있는 프로퍼티. private필드 / getter, setter
)
프로퍼티를 사용하는 방법
val person = Person("zero", true)
println(person.name)
person.isMarried = false
**커스텀 접근자** : 프로퍼티의 접근자를 직접 작성하기
class Rectangle(val height: Int, val witdh: Int) {
val isSqare: Boolean
get() {
return height == witdh
}
}
4. 선택 표현과 처리 : enum과 when
- enum 선언하기
- 값이 없는 enum
- enum class Color { RED, ORANGE, YELLOW }
- 값이 존재하는 enum
- enum class Color(val r: Int, val g: Int, val b: Int) { RED(255, 0, 0), YELLOW(255, 255, 0), ORANGE(255, 165, 0); // 세미콜론을 붙여야한다! fun rgb() = (r * 256 + g) * 256 + b }
- when 사용하기
- 분기 조건에 다른 객체를 사용할 수 있다.
- fun mix(c1: Color, c2: Color) = when(setOf(c1, c2)) { setOf(RED, YELLOW) -> ORANGE // setOf는 집합이기에 순서는 중요치 않다 else -> throw Exception("else Color") }
- Boolean 사용
- fun mixOptimized(c1: Color, c2: Color) = when { // 인자에 아무것도 없다 c1 == RED && c2 == YELLOW -> ORANGE else -> throw Exception("else Color") }
- fun getMnemonic(color: Color) = when(color) { Color.RED, Color.YELLOW -> "Richard" Color.ORANGE -> "Of" }
2. 스마트 캐스트
**타입 검사와 타입 캐스트를 조합한 것**
타입 검사 : is 를 통해 검사
타입 캐스트 : 원하는 타입으로 캐스팅
→ 스마트 캐스트는, is로 검사하고 캐스팅하지 않아도 해당 타입으로 선언된 것처럼 사용할 수 있다.
fun main(args: Array<String>) {
println(eval(Sum(Sum(Num(1), Num(2)), Num(4))))
}
interface Expr;
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr
fun eval(e: Expr): Int =
when (e) {
is Num -> e.value
is Sum -> eval(e.left) + eval(e.right)
else -> throw IllegalArgumentException("Unknown")
}
수에 대한 이터레이션: 범위와 수열
코틀린의 범위
- 폐구간(닫힌 구간) : until
- 끝을 포함 : .., downto
- 아래로 이동하기
- for (i in 10 downTo 1) { println(i) }
- 증가 값 바꾸기
- for (i in 10 downTo 1 step 2) { println(i) // 10 8 6 4 2 }
컬렉션에 대한 이터레이션
- key, value를 사용할 수 있다.
val treeMap = TreeMap<Char, String>()
for (c in 'A'..'F') {
treeMap[c] = Integer.toBinaryString(c.toInt())
}
for ((key, value) in treeMap) {
println("$key = $value")
}
in으로 범위의 원소를 검사한다. : when에서 사용해도 된다.
- in
- !in
3. 예외던지기, 예외 잡기
자바 코드와 가장 큰 차이는 throws 절이 코드에 없다.
try를 식으로 사용할 수 있다.
kotlin in action 책을 통한 공부입니다.
'공부 > Kotlin' 카테고리의 다른 글
4장. 클래스, 객체, 인터페이스 (0) | 2022.06.07 |
---|---|
3장. 함수 정의와 호출 (0) | 2022.06.07 |
1장. 코틀린이란 무엇이며, 왜 필요한가? (0) | 2022.05.28 |
[Kotlin] 문법 정리 - 2 (0) | 2022.05.04 |
[Kotlin] 문법 정리 - 1 (0) | 2022.05.02 |
댓글