nueijeel
[kotlin 문법] 변수와 데이터 타입 본문
1. 변수
변수 선언하기
var 변수명: 타입 = 값
val 변수명: 타입 = 값
코틀린에서 변수는 var / val 키워드로 선언한다.
var(variable) 키워드는 초깃값이 할당된 후에도 값을 바꿀 수 있는 변수를 선언할 때 사용하고,
val(value) 키워드는 초깃값이 할당된 후에는 값을 바꿀 수 없는 변수를 선언할 때 사용한다.
쉽게 말해, var은 변수이고 val은 상수이다.
var data1 = 10
val data2 = 20
fun main(){
data1 = 30
data2 = 40 //오류발생
}
위와 같은 경우에 val 키워드로 선언된 변수인 data2에 초깃값 할당 후 main() 함수에서 새로운 값을 할당하려고 한다. 이때 컴파일 오류가 발생한다. 반대로 var 키워드로 선언된 변수 data1에는 오류 발생 없이 새로운 값이 할당된다.
변수 타입 지정 및 초기화
변수 명 뒤에는 콜론(:)을 사용해 타입을 지정할 수 있다. 단, 코틀린에서 타입은 대입 값에 따라 유추가 가능하면 생략할 수 있다.
코틀린에서는 최상위에 선언한 변수, 클래스 멤버 변수에 선언과 동시에 초기화가 이루어져야 하고, 함수 내부에 선언한 변수의 경우 그렇지 않아도 된다.
//타입 지정
var data1: Int = 10
var data2 = 20 //타입 명시하지 않아도 정수 값에 의해 자동으로 Int타입으로 결정됨
var str1: String = "hello"
var str2 = "world" //마찬가지로 자동으로 String타입으로 결정됨
//초기화
var data3: Int //초깃값 지정하지 않아서 컴파일 오류!
fun main(){
var data4: Int //초기화 안해도 오류 x
println("data4: $data4") //값이 할당된 상태 아니므로 컴파일 오류
data4 = 40
println("data4: $data4") //값을 할당한 상태이므로 오류x
}
Class Test{
val data5: Int //클래스 멤버변수 초기화하지 않아서 컴파일 오류
val data6: Int = 10
}
위 소스 코드 내 초기화 부분에서 최상위 변수인 data3과 클래스 멤버변수인 data5의 경우 초기화하지 않으면 컴파일 오류가 발생하는 것을 알 수 있다. 반면 함수 내 지역 변수인 data4는 초기화하지 않아도 오류가 발생하지 않는다. 하지만 출력 과정에서 생기는 오류로 변수 값에 접근하려면 값이 할당되어 있어야 함을 알 수 있다.
변수 초기화 미루기
변수를 선언함과 동시에 초기화 할 수 없는 경우, 초기화를 미루기 위해 다음 두 가지 키워드를 사용한다.
- lateinit
- lateinit 키워드는 이후에 초깃값을 할당할 것임을 명시적으로 선언하는 것
- var 키워드로 선언한 변수에만 사용 가능
- Int, Long, Short, Double, Float, Boolen, Byte 타입에는 사용 불가
- lazy
- lazy 키워드는 변수 선언문 뒤에 by lazy{} 형식으로 선언하고, 소스에서 변수가 최초로 이용되는 순간 중괄호로 묶은 부분이 자동 실행되어 그 결괏값이 변수의 초깃값으로 할당됨
- 중괄호 부분을 여러 줄로 작성한다면 마지막 줄의 실행 결과가 변수의 초깃값이 됨
//lateinit
lateinit val data1: Int //컴파일 오류(Int타입)
lateinit var str1: String //컴파일 오류(var키워드)
lateinit val str2: String
//lazy
var data4: Int by lazy{
println("lazy")
10
}
fun main(){
println("main")
println(data4+10)
println(data4+10)
}
2. 데이터 타입
- 코틀린의 모든 변수는 객체이다.
기초 타입 객체
정수는 Int, Short, Long, 실수는 Double, Float, 2진수는 Byte, Boolean은 True,False로 구분된다.
val obj1: Byte = 0b00001011
val obj2: Int = 1234
val obj3: Short = 123
val obj4: Long = 10L
val obj5: Double = 123.45
val obj6: Float = 123.45f
val obj7: Boolean = true
Long형 데이터는 값 뒤에 대문자 L을, Float형 데이터는 값 뒤에 대문자 F나 소문자 f를 붙인다.
문자, 문자열
Char는 하나의 문자를 표현하는 데이터 타입으로 작은 따옴표를 사용해 표현한다.
String은 문자열을 표현하는 데이터 타입으로 큰따옴표나 삼중 따옴표를 사용해 표현한다.
문자열 줄바꿈이나 들여쓰기 표현 | |
큰 따옴표 | 삼중 따옴표 |
이스케이프 시퀀스 입력 필요 | 키보드의 입력이 그대로 반영됨 |
val c: Char = 'c'
val str1: String = "String1"
val str2: String = """
Hello
W o r l d
!
"""
String 타입의 데이터에 변숫값이나 어떤 연산식의 결괏값을 포함해야 할 때는 $ 기호를 이용하는데 이를 문자열 템플릿이라고 한다.
val a = 10
val b = 20
println("a : $a, b : $b, a+b : ${a+b}")
문자열 템플릿을 사용해 변숫값과 값들의 합을 출력하는 코드이다. 계산식이나 함수 호출문은 대괄호 {} 내부에 작성한 뒤 앞에 문자열 템플릿을 붙여준다.
Any
Any는 코틀린에서 최상위 클래스이다. 따라서 Any타입으로 변수를 선언하면 해당 변수에는 모든 타입의 데이터를 할당할 수 있다.
val data1: Any = 10
val data2: Any = "hello"
class User
val data3: Any = User()
Unit
Unit 타입으로 선언한 변수에는 Unit 객체만 대입이 가능하다. 주로 함수에서 반환문이 없음을 명시적으로 나타낼 때 사용한다.
val data1: Unit = Unit
fun sum(): Unit{
println(10+20)
}
함수 선언 시 반환 타입을 생략한다면 기본으로 Unit 타입이 적용된다.
Nothing
Nothing으로 선언한 변수에는 null만 대입 가능하다.
항상 null만 반환하는 기능의 함수이거나, 예외처리하는 함수의 반환 타입을 Nothing으로 지정한다.
val data1: Nothing? = null
fun funcT1(): Nothing?{
return null
}
fun funcT2(): Nothing{
throw Exception()
}
널 허용과 불허용
null은 객체가 선언만 되고 메모리 할당이 되지 않은 상태를 의미한다. 코틀린의 모든 타입은 객체이므로 변수에 null을 대입할 수 있는데, 변수 선언 시 null을 대입할 수 있는 변수인지 아닌지를 구분해서 선언해야한다.
변수 선언 시, 데이터 타입 뒤 물음표를 명시하여 null 허용 변수로 선언할 수 있다.
var data1: Int? = 10
var data2: Double = null #컴파일 에러
var str1: String? = "Kotlin"
data1 = null
str1 = null
위 코드를 실행하면 data2 변수 선언부에서 컴파일 에러가 발생한다. 데이터 타입 뒤에 ?를 추가하지 않았으므로 널 불허용 문자인데 null값을 할당했기 때문이다. 널 허용 문자로 선언된 data1과 str1에 null을 할당해도 오류가 발생하지 않는 것을 확인할 수 있다.
'Kotlin' 카테고리의 다른 글
[Kotlin 이론] 0516 Any, 추상 클래스와 인터페이스 (0) | 2023.05.24 |
---|---|
[Kotlin 이론] 0515 지연 초기화와 오버라이딩 (0) | 2023.05.22 |
[Kotlin 이론] 0515 상속과 접근 제한자 (0) | 2023.05.22 |
[Kotlin 이론] 0512 클래스와 생성자 (0) | 2023.05.19 |
[Kotlin 이론] 0511 변수와 함수, 반복문 (0) | 2023.05.19 |