Home Kotlin - Type
Post
Cancel

Kotlin - Type

코틀린에서 사용하는 전반적인 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
  • 문자열 가공 시 $ 변수와 “”” “"”를 사용 가능하다.
  • 문자열에서 특정 문자를 가져오는 방법은 대괄호를 사용한다.
This post is licensed under CC BY 4.0 by the author.