포스트

Kotlin의 type 다루기


기본 타입


Java와 동인한 기본 타입

  • Byte
  • Short
  • Int ★
  • Long ★
  • Float ★
  • Double ★
  • 부호 없는 정수들


Java와 다른 내용

  • Java : 기본 타입 간의 변환은 암시적으로 이루어 짐
  • Kotlin : 기본 타입 간의 변환은 명시적으로 이루어 짐


Kotlin의 예시

1
2
3
4
val num1 = 4 // Int Type
val num2: Long = num1 // Type mismatch

println(num1 + num2)

위와 같이 num1Int Type이기 때문에 Long에 넣게 되면 컴파일 Type mismatch가 발생


해결 방법 (to 변환 타입)

1
2
3
4
val num1 = 3
val num2: Long = num1.toLong()

println(num1 + num2)

위와 같이 toLong()을 사용해 변환하면 해결된다.




타입 캐스팅


Java 예시

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());
    }
  }

Java에서 instanceof는 변수가 주어진 타입이면 true, 아니면 false


Kotlin 예시

1
2
3
4
5
6
fun printAgeIfPerson(obj: Any) {
    if(obj is Person){
        val person = obj as Person
        println(person.age)
    }
}

Kotlin에서는 instanceof 대신 is를 사용
타입 또한 (Person)가 아닌, as Person으로 사용


형변환 생략 가능

1
2
3
4
5
fun printAgeIfPerson(obj: Any) {
    if(obj is Person){
        println(obj.age)
    }
}

위와 같이 obj를 바로 사용 가능

  • 이런한 변환을 스마트 캐스트라고 부른다.
    • Kotlin 컴파일러가 컨텍스트를 분석해서 if에서 타입 체크를 해주면 같은 타입으로 간주


형이 같지 않은 경우

1
2
3
4
5
fun printAgeIfPerson(obj: Any) {
    if(obj !is Person){
        println(obj.age)
    }
}

즉, objPerson 타입이 아닌 경우를 !is로 확인할 수 있다.


null이 가능한 경우

1
2
3
4
fun printAgeIfPerson4(obj: Any?) {
    var person = obj as? Person
    println(person?.age)
}

objnull이 들어올 수 있는 구조라면 형변환 as를 사용할 때 as?를 사용해서 null사용 허용

  • 그렇게 되면 personperson.age으로 가져 올 수 없고, person?.age와 같이 safe call을 사용해야 한다.
  • tip).as?objnull이어도 null을 반환하고 Person이 아니어도 null을 반환한다.
    • 중요!!. 타입이 일치하지 않아도 예외가 아닌 null을 반환하기 때문에 주의 필요




Kotlin의 3가지 특이한 타입


Any

  • Java의 Object 역할 (모든 객체의 최상위 타입)
  • 모든 Primitive Type의 최상위 타입 (Java는 아님)
  • Any 자체로는 null을 포함할 수 없어 Any?를 사용해서 null을 포함
  • equals / hashCode / toString 존재

Unit

  • Java의 void와 동일한 역할 (타입 추론이 가능해서 생략 가능)
  • void와 다르게 Unit은 그 자체로 타입 인자로 사용 가능
  • 단 하나의 인스턴스만 갖는 타입을 의미 (실제 존재하는 타입)

Nothing

  • 함수가 정상적으로 끝나지 않았다는 사실을 표현
  • 무조건 예외를 반환하는 함수 / 무한 루프 등.
    • 자주 사용되는 타입은 아님.
      1
      2
      3
      
      fun fail(message: String): Nothing {
      throw IllegalArgumentException(message)
      }
      




String Interpolation, String indexing


  • 문자열에 ${변수}를 사용해서 값을 넣을 수 있다.
  • 주의!! 간단한 변수를 사용할 때만 사용하는 것이 좋다


Java의 경우

1
2
    val person = Person("김용준", 29)
    System.out.println(String.format("이름 : %s", person.name))

Java는 String.format을 사용해서 출력


Kotlin의 경우

1
2
    val person = Person("김용준", 29)
    println("이름 : ${person.name}")

${person.name}와 같이 ${변수}를 사용할 수 있다.


일반 적인 String의 경우

1
2
    val name = "김용준"
    println("이름 : $name")

$만을 사용해서 작성 가능


trimIndent 사용 예시

1
2
3
4
5
6
7
    val name = "김용준"
    val str = """
        ABC
        EFG
        ${name}
    """.trimIndent()
    println(str)

위와 같이 문자열에 개행하면서 자유롭게 사용할 수 있다.

  • 출력 예시
    ABC
    EFG
    김용준


Java 특정 문자 가져오기

1
2
String str = "ABCDE";
char ch = str.charAt(1);

Java는 위와 같이 charAt을 사용해서 특정 문자의 index를 사용해서 특정 문자를 가져옴


Kotlin의 특정 문자 가져오기

1
2
val str = "ABCDE"
val ch = str[1]

위와 같이 배열을 이용해서 index에 해당하는 특정 문자를 가져옴

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.