본문 바로가기

Language/Kotlin

[Kotlin] 2장. 변수와 자료형, 연산자 2 - 변수와 자료형

728x90

변수 선언

 

Kotlin에서 변수 선언은 val , var 라는 키워드를 사용하여 선언할 수 있다.

  • val : 최초로 지정한 변수의 값으로 초기화 하고 더이상 바꿀 수 없음. 초기화 후 읽기 전용 변수가 된다.
  • var : 최초로 지정한 변수의 초깃값이 있더라도 바꿀 수 있음.

var로 선언한 value3의 경우 value4로 다시 변수 값을 초기화 하여 사용할 수 있지만, val로 선언한 value1,2의 경우 변수 값을 바꾸려고 하면 위와 같이 바꿀 수 없음을 알 수 있다.

 

변수를 선언할 때,

val value: String = "value1"
val value2: Int

와 같이 자료형을 명시하여 선언할 수 있지만,

val value3 = 3

과 같이 코틀린이 자료형을 추론하여 설정해주기 때문에 자료형을 명시하지 않아도 상관 없다.

 

단,

val value4 

와 같이 자료형이나 값을 설정하지 않은 변수는 사용할 수 없다.

 

자료형

기본 JAVA와 마찬가지로 자료형을 표현할 수 있다.

접두어 0x,0b를 붙여 16진수, 2진수를 만들고, 접미사 L, F 등을 붙여 Long, Float 타입으로 선언한다.

이때는 각각 자료형을 명시적으로 표시하지 않아도 되지만 명시적으로 자료형을 표시해야하는 경우가 존재한다.

 

이처럼 ByteShort의 경우 따로 자료형을 명시해주지 않으면 해당 자료형으로 사용이 불가능하다.

또한, 부호가 없는(Unsigned) 자료형을 사용할 때는 접미어 u를 붙여서 사용해야 한다.

위의 예제를 보면 exp3에서 UInt를 명시적으로 선언했지만 값에 u를 붙이지 않아 에러 표시가 떠있는 것을 확인할 수 있다.

 

*

Kotlin에서는 언더스코어(_)로 자릿값을 구분할 수 있다.

 

 

JAVA에서는 문자열에 다른 타입의 변수를 더할 때, "text " + value 와 같이 사용한다.

하지만, Kotlin에서는 같은 방법으로도 사용할 수 있지만 $ 기호를 사용하여 하나의 문자열로 선언이 가능하다.

 

str1, str2 모두 문자열에 Int 타입의 변수를 더하여 저장한 것이다. 

둘 다 a = 100000 과 같은 결과가 나오지만, str2와 같이 " " 안에 $변수명을 사용하여 하나의 문자열로 선언이 가능하다.

 

형식화된 다중 문자열

문자열에 줄바꿈 문자, 탭 등 특수문자가 포함되는 경우 """ 기호를 사용하여 문자열을 초기화 시키면 된다.

 

 

null을 허용한 변수

Kotlin에서는 변수에 null 값이 들어가는 것을 허용하지 않는다.

따라서 null 값을 허용하기 위해서는 ? 기호를 명시해주어야 한다.

 

이처럼 자료형에 ?를 붙이지 않으면 null 값이 들어갈 수 없지만 ? 를 붙여서 선언해주면 null 값이 들어가도 제대로 null 값이 출력되게 된다.

 

세이프 콜, non-null 단정기호, 엘비스 연산자

  • 세이프 콜 : ?. 을 붙여서 사용. 해당 값이 null값이어도 NPE가 발생하지 않고 null 그대로 출력함
  • non-null 단정기호 : !!. 을 붙여서 사용. 해당 값이 null이 아님을 단정하는 기호로, null이 들어가는 경우 런타임시에 NPE를 발생시킨다.
  • 엘비스 연산자 : 세이프 콜과 함께 쓰이는 것으로 세이프 콜에 ?:를 붙여서 사용. text?.length ?: -1 과 같이 사용하며 삼항 연산자 처럼 null이 아니면 왼쪽 length를 반환하고 null이면 -1을 반환한다.
text?.length ?: -1
==
if (text != null) text.length else -1

 

자료형 변환

Kotlin은 Java와 마찬가지로 자동으로 형변환을 시켜주지 않는다. 즉, int a = 10, double b = a 와 같은 형태가 불가능하다는 것이다.

따라서, 위와 같이 사용할때는 변환 메서드를 사용해서 타입을 바꾸어 주면 된다.

 

val a: Int = 1
val b: Double = a.toDouble()

val c = 1L + 4

위와 같이 int 타입을 double 타입에 넣기 위해서는 toDouble()을 사용하여 형변환 시켜 넣어주면 된다.

여기서 변환 메서드는 to자료형()으로 사용이 가능하다.(toInt, toByte, toChar, toShort ...)

 

3번째 코드를 보면, 자료형을 명시하지 않고 값을 초기화 시켜주는데 앞에는 Long 타입, 뒤에는 Int 타입 변수가 더해져서 들어간다. 이와 같은 경우는 자료형의 표현 범위가 큰 자료형으로 자동 형 변환되어 Long 타입 변수로 저장된다.

 

기본형과 참조형 자료형의 비교

단순 값만 비교할 때는 이중 등호(==)를 사용하고, 참조 주소를 비교하려면 삼중 등호(===)를 사용하면 된다.

  • 이중 등호(==) : 참조에 상관없이 값이 동일하면 true를 반환
  • 삼중 등호(===) : 값과 상관없이 참조가 동일하면 true를 반환.

스마트 캐스트

스마트 캐스트(Smart Cast)는 컴파일러가 자동으로 형 변환을 해주는 것으로, Number 같은 특수한 자료형이 스마트 캐스트를 지원한다.

 

 

위와 같이 Number 형으로 선언하는 경우, float, int, long 등의 여러 종류의 자료형 값으로 저장해도 변환 메서드를 사용하지 않아도 상관 없다.

is 키워드

is 키워드는 변수의 자료형을 알아내는데 사용한다.

is의 왼쪽 항의 변수가 오른쪽 항의 자료형과 같으면 true를, 아니면 false를 반환한다.

 

이와 같이 사용을 하면된다. !is의 경우 같지 않은 경우 true를 반환한다.

as 키워드

as 키워드를 사용하여 스마트 캐스트를 할 수 있다.

as는 형 변환이 가능하지 않으면 예외를 발생시키는 키워드 이다.

 

val x: String = y as String

 

위의 경우, y가 null이 아니면 String으로 형 변환되어 x에 할당된다. y가 null이면 형 변환을 할 수 없으므로 예외가 발생한다.

따라서, null 가능성까지 고려하여 예외 발생을 피하고자 하면 ? 를 사용하여 처리하면 된다.

 

val x: String? = y as? String

 

Any형

Kotlin의 Any형은 모든 클래스의 뿌리로 자료형이 특별히 정해지지 않은 경우에 사용하는 슈퍼클래스이다.

Number 형의 스마트 캐스트와는 다르게 Any는 Int, String, Float 등 모든 자료형으로 사용이 가능하다.

 

 

printMethod에서 Any 타입으로 받아서 사용하였고, x.javaClass를 사용하여 자료형을 확인해보면 각각 String, Integer, Float 타입으로 자료형이 변환된 것을 확인할 수 있다.

728x90