본문 바로가기
Kotlin

[Kotlin] 기초 문법 정리 - 자료형

by Saerong2 2020. 9. 7.

 

안녕하세요 VisionARy입니다.

이번 글에서는 코틀린의 자료형에 대해서 정리해보겠습니다.

 

 

# 기본 자료형과 참조 자료형

 자바의 자료형은 원시 타입과 참조 타입 두 가지로 나누어집니다

  • 원시 타입
    short, int, long, float, double 등의 기본 자료형으로 값 자체를 저장하는 자료형입니다
    언어 자체에 내장되어 있습니다
  • 참조 타입
    String, Date, ArrayList등 객체를 생성하고 메모리 영역을 할당한 후 이를 참조하는 자료형입니다

반면, 코틀린에서는 내부적으로 모든 자료형은 클래스로 만들어지며 객체로 표현합니다.

그 중에서도 숫자로 표현하는 모든 자료형은 Number클래스를 상속 받습니다. (byte, short, int, float 등)

기본 자료형을 객체로 사용하기 위해서 이를 클래스로 포장하는 것을 래퍼 클래스라고합니다.

자바에서의 원시 타입과 래퍼 클래스를 코틀린에서는 하나의 자료형으로 처리합니다.

 

따라서, 코틀린으로 코드를 작성하는 시점에서는 원시 타입과 래퍼 클래스를 구분하지 않지만 컴파일을 통해 둘 중에 더 효율적인 타입으로 변환이 됩니다.

예제 자바 (원시 타입) 자바(래퍼 클래스) 코틀린
  int java.lang.Integer kotlin.Int
  char java.lang.Character kotlin.Char
  ... ... ...

 

기본 자료형과 참조 자료형은 비교 방식에서도 차이가 있습니다

  기본 비교 참조 비교
문법 == ===
비교 방법 값을 비교합니다 주어진 값의 참조 주소를 비교합니다

이중 등호는 익숙한 문법으로 참조에 상관 없이 두 변수의 값이 같다면 true, 다르다면 false를 리턴합니다.

삼중 등호는 값이 같더라도 참조하는 주소가 다르다면 false 같다면 true를 리턴합니다

null을 허용하지 않는 변수는 참조형을 사용하더라도 내부적으로 기본형으로 값을 갖고 값이 스택에 저장됩니다.

그러나 null을 허용하는 변수는 기본형으로 변환되는 참조형일지라도 값을 힙에 할당하고 그것의 참조주소를 스택에 할당하여 저장합니다.

변수 a는 Int형으로, 컴파일을 통해 기본 자료형으로 바뀌어 스택에 128이라는 값이 저장됩니다.

변수 b는 Int?형으로, 128값은 힙에 저장되고 그것의 참조주소는 스택에 저장됩니다.

 

그런데 왜 세 번째 예제는 참조 비교결과가 true일까요?

신기하게도 코틀린에서는 저장되는 값이 -128~127의 값을 갖는다면 성능을 위해 이 값을 캐시에 저장합니다.

따라서 127이 캐시에 저장되고 a, b는 그 캐시의 주소값을 저장하고 있는 것이죠.

 

 

 

# 배열

코틀린에서 배열은 타입 인자를 갖는 Array클래스로 표현합니다

Array클래스의 생성은 arrayOf() 메서드를 이용해서 입력받은 인자로 구성된 배열을 생성할 수 있습니다.

이때, 자바의 원시 타입 자료형은 코틀린의 배열 클래스 타입 인자로 사용할 수 없습니다.

따라서 자바의 원시 타입 자료형을 인자로 갖는 배열을 표현하기 위해서 각 원시 타입 자료형에 대응하는 클래스를 제공합니다. 이 클래스 역시 {자료형}+arrayOf() 메서드를 이용해서 입력받은 인자로 구성된 배열을 생성할 수 있습니다.

예제 자바 코틀린
  byte[] kotlin.ByteArray
  int[] kotlin.IntArray

 

직접 배열을 구성하는 원소들을 인자에 넣는 방법 외에도 크기와 값을 설정해주는 방법도 있습니다.

IntArray(size, (Int)->Int) 메서드를 이용하는 것인데요. 

(참고로 코틀린의 컨벤션에서 메서드는 카멜 표기법(camelCase), 클래스는 파스칼 표기법(PascalCase)를 따릅니다)

크기가 5이고, 순서대로 1부터 5까지의 원소를 갖는 배열을 만들고싶다면 다음과 같이 작성할 수 있습니다.

 

 

 

# 명시적 형변환

코틀린은 C언어와 다르게 명시적으로 형변환을 해주어야 합니다. 이는 귀찮게 느껴질 때도 있지만 타입 미스매치 에러를 발생시켜 나중에 찾기 힘든 버그를 미연에 방지하는 것에 도움을 준다고 생각합니다.

위의 예제에서 Int 변수 a를 Long 변수 b에 대입하는 것은 에러를 발생시킵니다.

명시적으로 형변환을 해주기 위해 toLong()을 사용해주면 올바르게 작동하는 것을 볼 수 있습니다.

형변환 함수는 "to + 자료형()"의 형태로 사용할 수 있습니다.

 

 

 

# 타입추론

코틀린은 변수 선언시 타입을 명시해 줄 수 있지만, 값을 초기화 한다면 타입을 자동으로 추론해줍니다.

예를 들어 아래의 예에서 a는 127이라는 정수값을 갖기 때문에 기본적으로 Int로 타입 추론을 합니다.

또한 aa는 32-bit 자료형이 표현할 수 있는 범위를 넘는 값을 갖기 때문에 Long으로 타입 추론을 합니다.

참고로, "변수명 is 자료형" 의 형태로 변수의 자료형을 검사할 수 있습니다.

 

 

 

# 스마트 캐스트와 Any 자료형

스마트 캐스트는 컴파일러가 자동으로 형변환을 해주는 것을 말합니다.

대표적으로 숫자로 표현할 수 있는 모든 자료형의 슈퍼클래스인 Number 클래스가 있습니다.

Number형으로 선언된 변수는 저장되는 값에 따라 자동으로 정수형이나 실수형으로 변환이 됩니다.

 

Any는 이름처럼 코틀린의 모든 자료형의 슈퍼클래스로 어느 자료형과도 호환이 되는 최상위 자료형입니다.

따라서 어떠한 자료형이라도 모두 될 수 있기 때문에 언제나 변환이 가능합니다 (묵시적 형변환)

 

 

 

# 마치며

원래 계획은 쉬운 부분은 간단히만 정리하고 넘어가려고 했는데 예제를 만들어 보면서 생각보다 정리할 부분이 있었습니다. 다음 시간에는 변수에 대해서 정리해보도록 하겠습니다. 감사합니다.

 

댓글