티스토리 뷰

Java & Kotlin

[Kotlin] 변수와 자료형 (1)

터프남 2021. 4. 6. 15:37
728x90

이 글은 그동안 자바만 공부했던 내가 코틀린 기본서를 읽으면서 자바와의 다른 점과 코틀린에 대해서 알게 된 점에 대해서 작성

즉 전체를 아우르지는 않는다.. 나만 알아보게 쓴다는 말임..ㅠㅠ_ㅠ

목표

  • 변수 선언 방법
  • val과 var의 차이
  • 자료형 (정수형, 문자형)
  • 자료형 검사 is
  • 연산자

코틀린에서 변수 선언하기

코틀린에서 변수를 선언할 때는 val, var라는 키워드를 이용해서 선언할 수 있다.

val과 var이 차이점

val - 읽기 전용 변수로 선언 마치 자바에서 final로 선언한 것과 같다. 선언과 동시에 값을 초기화 해야하고 그 이후에 바꿀 수 없다.

val 변수 재할당

var - 최초에 값이 할당되었더라도 이후에 값을 변경할 수 있다. 가변

변수 선언 방법

val username: String = "코틀린"

차례대로 val은 선언 키워드 username은 변수명, 콜론(:) 다음에 나오는 거은 자료형이고 = 은 변수값 초기화이다.

그런데 코틀린에서는 아래와 같이 변수에 값만 할당해도 알아서 자료형을 지정해 준다.

val username = "코틀린"

이게 왜 가능하냐면 컴파일 단계에서 자료형을 추론할 수 있기 때문이다. 위와같이 선언할 시 username은 컴파일에서 String 자료형을 추론하므로 굳이 자료형을 변수 선언 시에 알려주지 않아도 된다.

Int형도 마찬가지이다.

val age: Int = 30

val age = 30 (자료형 생략가능)

그러나 자료형을 지정하지 않은 변수는 반드시 자료형을 추론할 값을 지정해야 한다.

인텔리제이 IDE에서는 자료형을 지정하지 않은 변수를 작성하면 아래와 같은 컴파일 오류가 난다.

인텔리제이 컴파일 오류

해석해보면 자료형을 지정해주거나 아니면 자료형을 추론할 수 있게 변수를 초기화 하라는 의미다.

코틀린 자료형

코틀린에서 자료형은 기본형 자료형을 사용하지 않고 참조형 자료형을 사용한다.

기본 자바에서는 기본형 자료형 (int, long, float, double)을 사용하고 String, Integer 등의 참조형을 모두 사용하지만 코틀린은 참조 형만 사용한다.  

자바를 사용한다면 기본형 int를 참조형으로 바꾸려면 Integer등으로 오토박싱 또는 언박싱을 해야 하지만 코틀린은 그럴 필요가 없다.

참조형으로 선언한 변수는 성능 최적화를 위해 코틀린 컴파일러에서 다시 기본형으로 대체된다.

따라서 코틀린에서는 참조형을 기본형으로 고려하는 등의 최적화를 신경쓰지 않아도 된다. 

(자바의 기본형과 참조형의 속도차이와 동작 원리는 구글에서 검색해서 알아보기 joebaak.blogspot.com/2017/05/primitive-type-reference-type.html )

정수 자료형

기본적으로 자바와 같음

출처 - https://acaroom.net/ko/blog/youngdeok/

그런데 자바와는 다르게 음의 부호를 사용하지 않는 정수 자료형이 있다.

출처 - https://acaroom.net/ko/blog/youngdeok/

자료형에 U를 붙인 자료형은 양수만 표현할 수 있는 정수 자료형이다.

정수 자료형과 실수 자료형의 최솟값과 최댓값을 알아보려면 아래와 같이 하면 된다.

fun main() {
    println("Byte min: " + Byte.MIN_VALUE + " max: " + Byte.MAX_VALUE)
    println("Short min: " + Short.MIN_VALUE + " max: " + Short.MAX_VALUE)
    println("Int min: " + Int.MIN_VALUE + " max: " + Int.MAX_VALUE)
    println("Long min: " + Long.MIN_VALUE + " max: " + Long.MAX_VALUE)
    println("Float min: " + Float.MIN_VALUE + " max: " + Float.MAX_VALUE)
    println("Double min: " + Double.MIN_VALUE + " max: " + Double.MAX_VALUE)

    var a: Byte = 127
    a = (a + 2).toByte()
    println(a)
}

자바와 마찬가지로 각 자료형에서 표현할 수 있는 최댓값과 최솟값을 넘어가면 오버플로우가 일어난다.

논리 자료형이나 문자 자료형은 책만 스윽 훑어봐도 알만한 정도이다.

문자열 자료형

문자열 자료형도 자바와 저장방식도 비슷하지만 표현방식에 있어서 새롭게 알게 되어서 정리

문자열 자료형도 여러 자료형과 마찬가지로 문자열 값만 변수에 대입해도 알아서 변수가 자료형 추론을 통해서 문자열인 것을 알 수 있다.

문자열 선언 및 할당 코드

fun main() {
    var str1: String = "Hello"
    var str2 = "World"
    var str3 = "Hello"

    println("str1 === str2: ${str1 === str2}")
    println("str1 === str3: ${str1 === str3}")

}

//결과
str1 === str2: false
str1 === str3: true

https://acaroom.net/ko/blog/youngdeok/%EC%97%B0%EC%9E%AC-%EC%BD%94%ED%8B%80%EB%A6%B0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EB%B3%80%EC%88%98%EC%99%80-%EC%9E%90%EB%A3%8C%ED%98%95

코드 본문에 있는 str1과 str3가 Heap 메모리에 있는 String Pool의 같은 문자를 참조하고 있는 것을 볼 수 있다. "Hello" 리터럴 문자를 이미 풀에 있기 때문에 저장되어있는 값을 활용하는 것이 더 효율적이기 때문이다. 

자바에서도 이와 비슷하게 되어 있다.

public static void main(String args[]){
    String s1 = "AAA"
    String s2 = "AAA"
    String s3 = "AAA"
    String s4 = "BBB"
}

위의 예제를 실행하게되면 "AAA" 문자열을 담고 있는 String 인스턴스가 하나 생성된 후, 참조 변수 s1, s2, s3는 모두 이 String 인스턴스를 참조하게 된다.

출처 - 자바의 정석 이미지

이때 자바의 "AAA"의 문자열들은 상수 저장소에 저장되는데 "AAA"와 같은 문자열 리터럴이 자동적으로 생성되어 저장되는 곳이다.

표현식과 $ 기호

기존 자바에서는 변수의 값이나 표현식을 문자열 안에 넣어 출력하려면 + 연산자를 통해서 해야하지만 코틀린은 $ 기호와 함께 변수나 표현식을 사용하면 된다.

var a = 1
var s1 = "a is $a" //String 자료형의 s1을 선언하고 초기화, 변수 a가 사용된다.

//결과
s1 = "a is 1"

문자열에 표현식 사용하는 코드

만약 변수가 아니라 표현식을 문자열에 포함시키려면 중괄호({})를 사용하면 된다.

fun main() {
    val a = 1
    val str1 = "a = $a"
    val str2 = "a = ${a + 2}"   //표현식을 문자열에 포함시키려면 중괄호를 사용하면 된다.

    println("str1 = $str1")
    println("str2 = $str2")

    val special = "\"Hello\", I have \$15"
    println("special = $special")
}

자료형에 별명 붙이기

변수의 자료형이 복잡한 구조를 가지면 자료형에 별명을 붙일수도 있다. 자바에서는 잘 모르겠지만 C언어에서 구조체를 정의할 때 별명을 붙이는 게 가능했는데 코틀린에서도 가능한가 보다.

자료형에 별명을 붙이려면 typealias라는 키워드를 사용하면 된다.

typealaias Username = String
val user: Username = "코틀린"

이제 Username은 String과 같이 사용된다. 지금은 예시를 위한 String이지만 사용자 정의로 만든 클래스나 특정 자료형을 별명을 붙여주면 좀 더 보기 쉬운 코드가 된다고 한다.. (아직은 잘 모르겠음)

참고

Doit 코틀린 저자님 블로그 bit.ly/3wFV9bY

Do it 코틀린! www.yes24.com/Product/Goods/74035266

 

 
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함