Kotlin/변수와 자료형
📌 변수 (가변형, 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 변수명 = 값
타입 추론(Type inference)
- 이 경우에는 값을 보고 이 변수의 자료형이 무엇인지 알아서 판단해서 정해준다.
- 한 번 변수에 값을 할당하면 해당 변수에는 처음에 담았던 값과 같은 자료형들만 담을 수 있다.
- 변수를 선언만 할 경우에는 이 방법을 사용할 수 없다.
자료형을 명시하면서 선언
var 변수명 : 자료형 = 값 // null을 가질 수 없음
var 변수명 : 자료형? = 값 // null을 가질 수 있도록, 세이프콜
- 한눈에 변수의 자료형이 무엇인지 알 수 있으므로 가독성이 좋으니 이 방법을 많이 쓰도록 하자.
❗ 상수를 선언하는 방법
자료형을 명시하지 않고 선언
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
}
컴파일 시점 상수 선언
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
}
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
Author And Source
이 문제에 관하여(Kotlin/변수와 자료형), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yellowsummer/변수와-자료형저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)