Welcome! Everything is fine.

[Kotlin] 3강. 코틀린에서 Type을 다루는 방법 본문

Kotlin

[Kotlin] 3강. 코틀린에서 Type을 다루는 방법

개발곰발 2023. 11. 28.
728x90

* 인프런 강의 - 자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)을 듣고 정리한 내용입니다.

 

🔗 2강 내용

 

[Kotlin] 2강. 코틀린에서 null을 다루는 방법

* 인프런 강의 - 자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)을 듣고 정리한 내용입니다. 🔗1강 내용 [Kotlin] 1강. 코틀린에서 변수를 다루는 방법 * 인프런 강의 - 자바 개발자를 위한

3uomlkh.tistory.com

3강. 코틀린에서 Type을 다루는 방법

기본 타입

코틀린에서는 선언된 기본값을 보고 타입을 추론한다.

val number1 = 3 // Int
val number2 = 3L // Long
val number1 = 3.0f // Float
val number2 = 3.0 // Double

 

기본 타입간의 변환?

  • 자바 : 암시적으로 이루어질 수 있음
  • 코틀린 : 명시적으로 이루어져야 함

자바에서는 int(4byte)보다 long(8byte)이 더 크니까 암시적으로 타입 변경이 가능하다.

int numbe1 = 4;
long number2 = number1;

System.out.println(number1 + number2);

 

반면, 코틀린에서는 암시적 타입 변경이 불가능해 컴파일 단에서 Type mismatch라는 에러가 난다.

val number1 = 4
val number2: Long = number1 // Type mismatch
println(number1 + number2)

 

그럼 코틀린에서는 어떻게 타입 변경을 할까?

바로 to변환타입() 함수를 호출해 사용해야한다!

val number1 = 4
val number2: Long = number1.toLong()
println(number1 + number2)

 

그런데 nullable 변수라면 어떻게 처리해줘야할까?

2강에서 배운 내용 중 Safe Call과 Elvis 연산자를 적절히 활용해 처리할 수 있다.

타입 캐스팅

기본 타입이 아닌 일반 타입에 대한 캐스팅은 어떻게 할까?

아래 코드를 보면 자바의 instanceof를 대신하여 is를 사용하고, (Person)을 대신하여 as 키워드를 사용했다.

여기서 is는 반대로 !is로도 사용할 수 있다.(obj가 Person이 아니라면 true, 맞으면 false)

fun printAgeIfPerson(obj: Any) {
  if (obj is Person) { // obj가 Person이면 true, 아니면 false 반환
    val person = obj as Person // obj라는 변수를 Person 타입으로 간주
    println(person.age)
  }
}

 

그러나, 이런 키워드가 없어도 코틀린은 obj를 Person으로 인식한다. 이것을 스마트 캐스트라고 한다.

fun printAgeIfPerson(obj: Any) {
  if (obj is Person) {
    println(person.age) // 스마트 캐스트
  }
}

 

obj에 null이 들어올 수 있는 경우에는 어떻게 해야할까?

바로 as 키워드 뒤에 ?를 붙여 obj가 null이 아니라면 Person 타입으로 변환하고, null이라면 전체가 null이 되도록 한다.

따라서 person 변수를 사용할 때도 person 뒤에 ?를 붙여주어야 한다.

fun printAgeIfPerson(obj: Any?) {
  val person = obj as? Person
  println(person?.age)
}

Kotlin의 3가지 특이한 타입

Any

  • 자바의 Object 역할로 모든 객체의 최상위 타입이다.
  • 모든 Primitive Type의 최상위 타입도 Any이다.
  • null을 포함하고 싶다면 Any?로 표현할 수 있다.
  • Any에 equals, hashCode, toString이 존재한다.

Unit

  • 자바의 void 역할이다.
  • void와 다르게 Unit은 그 자체로 타입 인자로 사용 가능하다.
  • 함수형 프로그래밍에서 Unit은 단 하나의 인스턴스만 갖는 타입을 의미한다.

Nothing

  • 함수가 정상적으로 끝나지 않았다는 사실을 표현하는 역할
  • 무조건 예외를 반환하는 함수 / 무한 루프 함수 등

String Interpolation, String indexing

문자열 가공하기

코틀린은 자바와 같이 String.format()을 사용하거나 StringBuilder를 사용해 문자열을 가공하지 않고 $변수를 이용한다.

간단한 변수를 쓸 때는 다음과 같이 작성한다.

val name = "최태현"
println("이름 : $name")

단순한 변수가 아닌 긴 표현을 감쌀 때에는 ${변수}와 같이 중괄호로 묶어 사용한다.

val person = Person("최태현", 100)
println("이름 : ${person.name}, 나이 : ${person.age}")

자바에서는 여러 줄에 걸친 문자열을 작성할 때 StringBuilder와 함께 append를 사용해야하지만,

코틀린에서는 큰 따옴표 세 개를 사용해 다음과 같이 표현할 수 있다.

처음 알게  사실인데 아주 편리해 보인다..!

val name = "최태현"
val str = """
  ABC
  DEF
  ${name}
""".trimIndent()
println(str)

특정 문자 가져오기

자바에서 특정 문자를 가져오기 위해서는 다음과 같이 해야한다.

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

코틀린에서는 배열처럼 대괄호를 사용해 특정 문자를 가져올 수 있다.

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