1. 변수의 타입
val number1 = 4
// val number2 : Long = number1 //Type mismatch
//자바에서는 명시적으로 더 큰 타입으로 변경이 되었지만 코틀린에서는 안됨.
//따라서 toLong() 을 붙여줘야함
val number2 : Long = number1.toLong() //자바에서는 암시적으로 가능했지만
//코틀린에서는 명시적으로 적어주어야함
println(number1 + number2)
자바에서는 Int와 Long을 더해주면 암시적으로 더 큰 타입으로 변경되어 연산이 가능했다.
하지만 코틀린에서는 불가능하다!! ㅠㅠ
따라서 위의 코드와 같이 Int와 Long을 더해주려면 .toLong을 붙여주어 number1를 Long타입으로 변경해주어야한다.
그럼 만일 number2가 null을 허용하는 변수라면 어떻게 될까?
val number3 : Int? = 3
//만일 number3이 null이 될 수 있는 ?형태라면
// val number4 : Long = number3.toLong()
//이렇게 에러가 발생함. 따라서 safecall과 Elvis를 활용하여 null일 때 방지를 해주어야함
val number4 : Long = number3?.toLong() ?: 0L //이런식으로
number3는 null값을 허용할 수 있는 Int? 형태이다.
주석처리된 코드를 보면 단순히 number3.toLong()을 하면 코틀린에서 자동적으로 null을 허용할 수 있는 값이여서
에러처리가 된다.
따라서 전 강의에서 배웠던 safe call 과 Elvis를 활용하여 null일 때를 방지해주어야한다!!!
2. 타입캐스팅
fun pritnAgeIfPerson(obj: Any){
/*
is는 자바에서의 instanceof obj가 person이면 true를 반환
as Person은 (Person)이와 같음, 하지만 이는 생략가능
만일 is not을 의미로 사용하려면 !is 사용해주면 됨
*/
if(obj is Person){
val person = obj as Person //obj가 Person이면 Person으로 타입캐스팅이 됨
println(person.age)
}
}
자바에서는 instanceof를 통해 비교해주었고, 그 값이 true일 경우 (Person)obj 를 통해 타입캐스팅을 해주었다.
코틀린에서는 instanceof가 is로 대체되고, (Person)으로 타입캐스팅했던 것이 as Person으로 대체된다!!
하지만 이 때 주의할 점이 있다. 만일 obj값이 지금은 null이 허용이 안되지만 Any?형태로 null이 허용될 때는
마찬가지로 NPE에러를 방지하기 위해서 다음과 같은 작업이 필요하다!
fun pritnAgeIfPerson1(obj: Any?){
/*
위와 같은 코드인데, 만일 obj가 null이 될 수 있는 코드라면
당연히 null이 들어오면 NPE에러가 발생할 것이다.
따라서 as?를 붙여줌으로써 person이 null이 될 수 있다는 것을 표현해주고
person이 null이니까 person?.age로 이 값이 null이 될 수 있다는 것도 표현해준다.
*/
if(obj is Person){
val person = obj as? Person //null이 됨
println(person?.age)
}
}
Any? 로 인해 obj가 null이 될 수 있기 때문에 obj as? Person 형태로 적어주어야 하고,
이는 person이 null이 될 수 있다는 뜻도 되기 때문에 person?.age로 적어주어야 NPE에러를 방지할 수 있다!!
**
Any는 자바에서의 Object와 같음!!
any자체로는 null을 포함할 수 없어 any?로 표현해야함
unit은 자바에서의 void와 동일한 역할
Noting은 함수가 정상적으로 끝나지 않았다는 사실을 표현하는 역할
ex) 예외를 반환하는 함수/무한루프 함수
**
등 문자열을 다루는 방법들
//string interpolation
val person = Person("윤성식", 100)
val log = "제 이름은 ${person.name}"
val str = """
ABC
EFG
${person.name}
""".trimIndent()
//이렇게 하면 엔터가 자동적으로 출력됨
val str1 = "ABCDE"
println(str1[1])
//
'Kotlin > Basic' 카테고리의 다른 글
[Kotlin/Basic] 코틀린에서의 예외처리 (0) | 2022.08.13 |
---|---|
[Kotlin/Basic] 코틀린에서의 반복문 (0) | 2022.07.27 |
[Kotlin/Basic] 코틀린에서의 제어문 (0) | 2022.07.25 |
[Kotlin/Basic] 코틀린에서의 연산자 (0) | 2022.07.22 |
[Kotlin/Basic] 들어가며, val/var 차이, 코틀린에서의 null (0) | 2022.07.20 |