늦은 초기화 (lateinit) 인스턴스를 생성할 때 프로퍼티를 초기화하지 않고, 필요시 초기화하기 위해 사용한다. 값을 읽을 때 프로퍼티가 초기화되지 않으면 UninitializedPropertyAccessException 예외를 던진다. lateinit 프로퍼티의 조건 가변 프로퍼티로 정의해야 한다. 참조 타입, non-nullable type이어야 한다. (내부에서는 초기화되지 않은 상태를 표현하기 위해 널을 사용하기 때문) 선언과 동시에 초기화할 수 없다. 최상위 프로퍼티와 지역 변수에서도 사용할 수 있다. 2. 커스텀 접근자 프로퍼티는 커스텀 접근자를 통해 변수와 함수의 동작을 하나의 선언에 조합할 수 있다. 커스텀 접근자는 프로퍼티 값을 읽거나 쓸 때 호출되는 함수다. 커스텀 게터 class ..
널이 될 수 있는 타입과 널이 될 수 없는 타입을 구분한다. → 널 발생 여부를 컴파일 시점으로 옮겨주기 때문에 NullPointerException 예외를 방지할 수 있다. 기본적으로 코틀린의 모든 타입은 널이 될 수 없는 타입이다. → 널에 대한 검사를 추가로 수행할 필요가 없다. 널이 될 수 있는 타입(nullable type) 타입 뒤에 ?를 붙여 지정할 수 있다. ex) val s: String? = "abc" 널이 될 수 없는 타입(non-nullable type)의 상위 타입이므로, nullable type에 non-nullable type의 값을 대입할 수 있다. fun isLetterString(s: String?): Boolean { if(s.isEmpty()) return false ..
클래스 구조 class Person { var firstName: String = "" var familyName: String = "" var age: Int = 0 fun fullName() = "$firstName $familyName" fun showMe() { println("${fullName()}: $age") } } 위 클래스의 인스턴스마다 firstName, familyName. age라는 프로퍼티와 fullName(), showMe()라는 함수가 포함된다. cf) 파일명을 public 클래스의 이름과 동일하게 만들지 않아도 된다. 한 파일에 여러 public 클래스가 존재할 수 있다. 2. 생성자 주생성자 class Person(firstName: String, familyName: S..
문자열 문자열 템플릿 import java.util.Date fun main() { val name = readLine() println("Hello, $name!\n, Today is ${Date()}") } ${}의 중괄호 사이에 코틀린 식을 넣으면 문자열에 식을 넣을 수 있다. 간단한 변수 참조인 경우 중괄호의 생략이 가능하다. 2. 로우 문자열 val message = """ Hello, &name! Today is ${Date()} """.trimIndent() 큰따옴표 세 개로 둘러싸여 있는 로우 문자열을 사용하면 이스케이프 시퀀스를 사용하지 않고 문자열을 작성할 수 있다. 3. 문자열 비교 자바 코틀린 ==와 != 연산자는 참조 동등성을 비교한다. 실제 문자열 내용을 비교하려면 equals(..
변수 val timeInSeconds = 15 val 키워드 한번 초기화하면 다시는 값을 대입할 수 없는 불변 변수를 정의하는 키워드. 자바의 final 변수와 비슷하다. 2. var 키워드 val과 반대로 가변 변수를 정의할 때 사용하는 키워드. 3. 타입 추론 변수 타입을 지정하지 않아도 컴파일러가 코드의 문맥에서 타입을 도출해주는 기능. 4. 변수 타입을 명시하는 경우 val text: String text = "Hello!" 초깃값을 생략하고 다른 문장에서 변수를 초기화하는 경우 변수 타입을 명시해야 한다. 기본 타입 1. 타입 정수 타입: Byte, Short, Int, Long 실수 타입: Float, Double 문자 타입: Char 논리 타입: Boolean 2. 원시 타입, 참조 타입 원..
조건문 if 문 fun max(a: Int, b: Int) = if (a > b) a else b 자바의 삼항 연산자가 없는 대신 if 문을 식으로 사용할 수 있다. 2. when 문 if 문을 중첩하여 사용하기 보다 when 문을 통해 조건을 순차적으로 검사한다. fun hexDigit(n: Int): Char { when { n in 0..9 -> return '0' + n n in 10..15 -> return 'A' + n - 10 else -> return '?' } } 여러 개의 조건 -> 문, 하나의 else -> 문으로 이루어질 수 있다. 자바의 switch와 비슷하지만 값을 선택하는 것이 아닌 임의의 조건을 검사한다. (또한 자바의 폴스루를 지원하지 않음) 하나의 변수만을 비교한다면 wh..