코틀린에서 변수
가변 vs 불변
var number1 = 10L // 가변
val number2 = 10L // 불변
초기값을 지정해 주지 않는 경우?
var 일 때 오류 발생 - 컴파일러가 타입을 추론하기 어렵기 때문에
val 일때 오류 발생 - 최초에 값 지정해 줘야 한다.
val 컬렉션에는 element를 추가할 수 있다.
Primitive Type
- long은 primitive, Long은 reference type
- 코틀린은 구분이 없다
- 박싱 언박싱 때매 성능 이슈 없을까?
- 코틀린이 알아서 내부적으로 처리한다.
- 박싱 언박싱 때매 성능 이슈 없을까?
nullable 변수
- 위의 예시에서 long은 null이 안되지만 Long은 null이 들어갈 수 있다.
- 코틀린에서는?
var number3: Long? = 1_000L
- :타입? => null이 들어갈 수 있다는 의미
- 코틀린은 기본적으로 null이 들어갈 수 없게끔 설계해 줌
객체 인스턴스화
var person = Person("hyang")
- new를 붙이지 않아야 한다.
null을 다루는 방법
- Kotlin에서의 null 체크
- Safe Call과 Elvis 연산자
- 널 아님 단언!!
- 플랫폼 타입
func startWithA1(str: String?) : Boolean {
return str?.startsWith("A") ?: throw IllegalArgumentException("null")
}
Elvis 연산자 : 앞의 결과가 null이면 뒤의 값을 실행
fun startsWithA3(str: String?): Boolean {
return str?.startsWith("A") ?: false
}
널 아님 단언
- nullable type이지만, 아무리 생각해도 null이 될 수 없는 경우
- "얘는 무조건 null이 아니야" 이런 경우
- null필드가 들어올수 있지만, 사실 그런경우가 없다면 !!를 붙인다.
- 안붙이면 컴파일러 오류난다.
- 그렇지만 만약 null이 들어온다면 runtime 오류 난다. (컴파일 오류는 안남)
Kotlin Type
- 기본 타입
- 타입 캐스팅
- 3가지 특이한 타입
- String Interpolation, indexing
코틀린은 자바처럼 암시적 타입 변경이 불가하기 때문에 to변환타입()을 사용해야 한다.
var number1 = 3
val number2: Long = number1.toLong()
- 일반 타입은 어떻게 캐스팅할까?
fun printAgeIfPerson(obj: Any?) {
if( obj is Person) { // java의 instanceof와 같다
val person = obj as? Person // java에서 Person (obj)와 같다, as Person은 생략 가능
println(person?.age)
}
- instanceof의 반대도 존재 하나?
if( obj !is Person)
- 코틀린의 특이한 타입 3가지
- Any
- java의 object 역할
- primitive type의 최상위 타입도 Any
- Any 자체로는 null을 포함할 수 없어 null을 포함하고 싶다면, Any?
- Any에 equals / hashCode / toString 존재
- Unit
- java의 void와 동일한 역할
- void와 다르게 unit은 그 자체로 타입 인자로 사용 가능하다. (나중에 제네릭 다룰때 다시 나옴)
- 함수형 프로그래밍에서 Unit은 단 하나의 인스턴스만 갖는 타입을 의미, 즉 코틀린의 Unit은 실제 존재하는 타입이라는 것을 표현
- Nothing
- Nothing은 함수가 정상적으로 끝나지 않았다는 사실을 표현하는 역할
- 무조건 예외를 반환하는 함수 / 무한 루프 함수 등
Kotlin 예외 처리
try catch finally 구문
fun parseIntOrThrow(str: String): Int {
try {
return str.toInt()
} catch (e: NumberFormatException) {
throw IllegalArgumentException("주어진 ${str}는 숫자가 아닙니다")
}
}
- toType 으로 형변환 (toInt())
- new가 없음
- 포맷팅이 간결함
Checked Exception과 Unchecked Exception
fun readFile() {
val currentFile = File(".")
val file = File(currentFile.absolutePath + "/a.txt")
val reader = BufferedReader(FileReader(file))
println(reader.readLine())
reader.close()
}
- kotlin에서는 Checked Exception과 Unchecked Exception을 구분하지 않는다. 모두 UnChecked Exception이다.
- 즉 throws가 없다.
try with resources
fun readFile(path: String) {
BufferedReader(FileReader(path)).use { reader ->
println(reader.readLine())
}
}
- kotlin에서는 try with resources가 사라지고 use를 사용
코틀린 함수
- 함수 선언 문법
- default parameter
- named argument
- 같은 타입의 여러 파라미터 받기(가변 인자)
// 함수 선언 문법
fun max(a: Int, b: Int) = if (a > b) a else b
// default parameter
fun repeat(
str: String,
num: Int = 3,
useNewLine: Boolean
) {
for (i in 1..num) {
if (useNewLine) {
println(str)
} else {
print(str)
}
}
}
// named argument
repeat("Hello World", useNewLine = false)
- 장점 : builder를 직접 만들지 않고 builder의 장점을 가지게 된다.
- Kotlin에서 Java함수를 가져다 사용할 때는 named argument를 사용할 수 없다.
// 같은 타입의 여러 파라미터 받기 (가변 인자)
fun printAll(vararg strings: String) {
for (str in strings) {
println(str)
}
}
fun main() {
printAll("A", "B", "C")
val array = arrayOf("A", "B", "C")
printAll(*array)
}
자바 개발자를 위한 코틀린 입문
'Kotlin' 카테고리의 다른 글
[kotlin] kotest styles에 대해서 (0) | 2024.01.25 |
---|