Kotlin/변수와 자료형

yellow·2021년 4월 6일
0

Kotlin

목록 보기
2/13

📌 변수 (가변형, mutable)

❗ 변수를 선언하는 방법

자료형을 명시하지 않고 선언

var 변수명 =
  • 타입 추론(Type inference)

  • 이 경우에는 값을 보고 이 변수의 자료형이 무엇인지 알아서 판단해서 정해준다.
  • 한 번 변수에 값을 할당하면 해당 변수에는 처음에 담았던 값과 같은 자료형들만 담을 수 있다.
  • 변수를 선언만 할 경우에는 이 방법을 사용할 수 없다.

자료형을 명시하면서 선언

var 변수명 : 자료형 =// null을 가질 수 없음
var 변수명 : 자료형? =// null을 가질 수 있도록, 세이프콜
  • 한눈에 변수의 자료형이 무엇인지 알 수 있으므로 가독성이 좋으니 이 방법을 많이 쓰도록 하자.

📌 상수 (불변형, immutable)

❗ 상수를 선언하는 방법

자료형을 명시하지 않고 선언

val 상수명 =

자료형을 명시하면서 선언

val 상수명 : 자료형 =
  • '값'을 저장했을 경우에는 값을 변경할 수 없다.
  • 객체에 대한 '참조값'을 저장했을 때는 해당 객체의 내부 값은 변경할 수 있다. (따라서 완벽한 상수라고는 볼 수 없다고 한다!)
     val mNumberList = mutableListOf<Int>(1, 2, 3)
     mNumberList.add(4) # 가능하다!!
     println(mNumberList) // [1, 2, 3, 4]
  • 변수를 선언할 때 이 변수의 값을 나중에 바꾸게될지 안 바꿀지 모르겠을 때는 상수로 선언하는 것을 추천한다. (나중에 변수로 고쳐주면 되니까!)

📌 컴파일 시점 상수

컴파일 시점 상수 선언

  const val 상수명 =
  • 한번 초기화되면 절대로 값을 바꿀 수 없다.
  • 컴파일 시점에 값이 할당되어있어야 한다.
    따라서 함수나 클래스 생성자로 할당될 수 없고, 기본 자료형(String, Int, Double, String, Char, Boolean 등)으로만 초기화해야 한다.

📌 자료형

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

  • 다른 프로그래밍 언어에서는 기본 자료형과 참조 자료형 이렇게 두 가지로 이루어져 있지만 코틀린에서의 모든 자료형은 클래스로 만들어 객체로 표현하기 때문에 보통 참조 자료형만 사용한다. (프로그램을 컴파일할 때 코틀린 컴파일러가 참조형을 기본형으로 변환하면서 최적화한다고 한다.)

    자바에는 기본 자료형과 이 기본 자료형을 객체로 다루기 위해 사용하는 클래스인 래퍼 클래스(Wrapper Class)가 있는데, 코틀린에서 쓰는 자료형은 이 둘을 합친 역할을 한다고 보면 된다.

  • 기본형 예시 : int, long, float, double
  • 참조형 예시 : Int, Long, Float, Double

❗ non-nullable과 nullable

non-nullable

  • 참조 자료형이더라도 내부적으로 기본형으로 값을 갖고 값이 stack에 저장된다.

nullable

  • 기본형으로 변환되는 참조형일지라도 값은 heap에 저장하고, 참조 주소는 stack에 저장한다.

📌 비교 연산자

❗ 기본 비교와 참조 비교

  • 둘 다 비교할 때 stack에 있는 값을 비교

기본 비교(이중 등호, ==)

  • 변수의 만 비교할 때 사용한다.

참조 비교(삼중 등호, ===)

  • 변수의 참조 주소를 비교할 때 사용한다.
  • 참조형으로 선언한 변수의 값이 -128 ~ 127 범위(1byte)에 있으면 캐시에 그 값을 저장하고 stack에는 캐시 주소를 저장하게 되므로 참조 비교를 할 때 항상 true를 반환할 수 있으니 주의하자.
   fun main() {
    val a: Int = 128
    val b: Int = 30 // -128 ~ 127 범위에 있는 값

    val c: Int? = a
    val d: Int? = a
    val e: Int? = c
    
    println(c == d) // true
    println(c === d) // false
    println(c === e) // true
    
    val f: Int? = b
    val g: Int? = b
    val h: Int? = f
    
    println(f == g) // true
    println(f === g) // true
    println(f === h) // true
}


제가 잘못 이해해서 그림이 잘못 되었다면 알려주세요!

만약 숫자로 이루어진 문자열을 정수형이나 실수형으로 바꾸고싶다면?

-> 자료형 변환

var b = "1"
var c = b.toInt() // c에 Int형 1이 저장됨
var d = b.toFloat() // d에 Float형 1.0이 저장됨

문자열에 다른 변수를 포함하고싶다면?

  • $변수명
var e = "Summer"
var f = "My name is $e. Nice to meet you" // My name is Summer. Nice to meet you

참고 https://juyeop.tistory.com/4

profile
할 수 있어! :)

0개의 댓글