코틀린에서 사용하는 전반적인 Type에 대해 알아본다.
- 기본 타입
- Long, Int, Double, Float …
- 코틀린에서의 타입 캐스팅
- 코틀린의 3가지 특이한 타입
- String Interpolation, String indexing
Type
기본 타입
- 코틀린에서는 선언된 기본값을 보고 타입을 추론한다.
1
2
| val number1 = 3.0f // float
val number2 = 3.0 // double
|
- 자바에서는 기본 타입간의 변환이 암시적으로 이루어질 수 있지만 코틀린에서는 명시적으로 이루어져야 한다.
1
2
3
4
| val number1: Int = 4
val number2: Long = number1 (X)
val number2: Long = number1.toLong()
|
toLong()과 같은 변환 메서드를 사용하게 된다. 주의할 점은 연산에서 조금 더 주의해야 한다.
1
2
3
4
| val number1 = 3
val number2 = 5
val result = number1 / nubmer2.toDouble()
|
자바에서는 앞에 괄호를 통해 타입을 변환해주었지만 코틀린에서는 명시적으로 to변환타입을 이용해주어야 한다.
null 타입에서는?
1
2
| val number1: Int? = 3
val number2: Long = number1?.toLong() ?: 0L
|
변수가 nullable이라면 적절하게 처리해주어야 한다.
일반 타입
1
2
3
4
5
6
| public static void printAgeIfPerson(Object obj) {
if (obj instanceof Person) {
Person person = (Person) obj;
System.out.println(person.getAge())
}
}
|
위와 같은 자바 코드가 있다. 이를 코틀린에서는 어떻게 표현할까?
1
2
3
4
5
6
| fun printAgeIfPerson(obj: Any) {
if (obj is Person) {
val person = obj as Person
println(person.age)
}
}
|
- is
- Java instanceof
- obj !is Person 과 같이 반대의 경우도 존재.
- as
- Java의 (Person) obj
- as 생략 가능하다. (스마트 캐스트)
- if문에서 person임을 체크했기 때문에 캐스팅 없이 println(person.age) 바로 호출 가능하다.
1
2
3
4
| fun printAgeIfPerson(obj: Any?) {
val person = obj as? Person
println(person?.age)
}
|
- obj에 null이 들어올 수 있다면?
- Any?로 nullable임을 나타낸다.
- null이 들어온다면 person.age에서 NPE가 발생한다.
- as?를 통해 safe call처럼 person 자체의 결과를 null로 만들 수 있다.
- 따라서 출력시에도 person?. 으로 safe call 해주어야 한다.
코틀린만의 특이한 3가지 타입
- Any
- Java의 Obejct 역할 (모든 객체의 최상위 타입)
- 모든 Primitive Type의 최상위 타입도 Any이다.
- Any 자체로는 null을 포함할 수 없어 null을 포함하고 싶다면 Any?로 표현해야 한다.
- equals / hashCode / toString이 존재한다.
- Unit
- Java의 void와 동일한 역할
- void와 다르게 Unit은 그 자체로 타입 인자로서 사용 가능하다.
- 함수형 프로그래밍에서 Unit은 단 하나의 인스턴스만 갖는 타입을 의미한다. 코틀린의 Unit은 실제 존재하는 타입이라는 것을 표현.
- Nothing
- 함수가 정상적으로 끝나지 않았다는 사실을 표현하는 역할
- 무조건 예외를 반환하는 함수 / 무한 루프 함수 등
String interpolation / String indexing
1
2
3
| Person person = new Person("Lee", 30);
String log = String.format("이름은 %s이고 나이는 %d세 입니다.",
person.getName(), person.getAge());
|
1
2
3
4
| StringBuilder sb = new StringBuilder();
sb.append("이름은");
sb.append(person.getName());
sb.append("이고 ");
|
자바에서는 위와 같이 문자열을 가공한다.
코틀린에서는 어떻게 할까?
1
2
| val person = Person("Lee", 30)
val log = "이름은 ${person.name}이고 나이는 ${person.age}세 입니다."
|
- 달러 중괄호 + 변수를 사용하면 값이 들어가게 된다.
1
2
3
4
5
6
7
8
| fun main() {
val name = "Lee"
val str = """
ABC
DEF
${name}
""".trimIndent()
|
인덱싱
1
2
3
4
| fun main() {
val str = "ABC"
println(str[0])
println(str[2])
|
배열의 대괄호 처럼 문자열에 있는 특정 문자를 쉽게 가져올 수 있다.
정리
- 코틀린의 변수는 초기값을 보고 타입을 추론해준다.
- 기본 타입간의 변환은 명시적으로 이루어져야 한다.
- is, !is, as, as?를 이용해 타입을 확인하고 캐스팅한다.
- Any, Unit, Nothing
- 문자열 가공 시 $ 변수와 “”” “"”를 사용 가능하다.
- 문자열에서 특정 문자를 가져오는 방법은 대괄호를 사용한다.