👍오늘의 목표
이번 포스팅에서는 코틀린의 변수, 자료형, 타입추론, null 에 대해 공부해 보겠습니다.
val, var의 차이
val username : String = "Gogi"
var age : Int = 10
위 코드에 대해 설명하면
val : 최초로 지정한 변수의 값으로 초기화하고 더 이상 바꿀 수 없는 읽기 전용 변수
var: 최초로 지정한 변수의 초깃값이 있더라도 값을 바꿀 수 있음
username, age : 변수이름
String, Int : 자료형
"Gogi", 10 : 값
코틀린은 타입추론이 가능하므로 위 소스코드를 아래와 같이 선언할 수 있습니다.
val username = "Gogi"
var age = 10
타입추론을 사용할 경우 꼭 값을 함께 써주어야 합니다.
값을 써주지 않으면 타입추론이 불가능하기 때문입니다.
추가로 설명하면 코틀린은 세미콜론을 붙이지 않아도 됩니다!
이는 코틀린의 장점 중 하나로 꼽히고 있습니다.
😮코틀린의 자료형은 참조 형만 사용
자바의 경우 자료형은 기본형과 참조형 두 종류가 있었지만 코틀린은 참조형만 사용합니다.
참조형은 객체를 생성하고 동적 메모리 영역(힙 메모리)에 데이터를 둔 다음
이를 참조하는 자료형을 말합니다.
코틀린에서 참조형으로 선언한 변수중 일부는 컴파일러가 자동으로 다시 성능 최적화를 위해
다시 기본형으로 대체합니다.
정수 자료형
Long | 8바이트 | -2의 63제곱 ~ 2의 63제곱 - 1 |
Int | 4바이트 | -2의31제곱 ~ 2의 31제곱 -1 |
Short | 2바이트 | -2의15제곱 ~ 2의15제곱 -1 |
Byte | 1바이트 | -2의7제곱 ~ 2의7제곱 -1 |
val num1 = 356424 // Int형 자동 추론
val num2 : Byte = 5 // Byte형 명시
val num3 : Short = 500 // Short형 명시
보통 정수형 숫자는 Int형 으로 추론되므로 Short나 Byte를 사용할 때는 직접 자료형을 명시해야 합니다.
val long = 4245L //Long형
val bin = 0b01001101 //2진수 Int형
val hex = 0xA3 //16진수 Int형
접미사나 접두어를 사용하면 Long형, 2진수, 16진수를 표현할 수 있습니다.
부호가 없는 정수 자료형
ULong | 8바이트 | 0 ~ 2의 64제곱 - 1 |
UInt | 4바이트 | 0 ~ 2의 32제곱 -1 |
UShort | 2바이트 | 0 ~ 2의16제곱 -1 |
UByte | 1바이트 | 0 ~ 2의8제곱 -1 |
val uint: UInt = 153u
val ulong: ULong = 45632189uL
val ushort: UShort = 500u
val ubyte: UByte = 60u
부호가 없는 정수 자료형을 사용할 때는 위와 같이 자료형과 식별자를 명시해야 합니다.
실수 자료형
Double | 8바이트 | 약 4.9E - 324 ~ 1.7E + 308 |
Float | 4바이트 | 약 1.4E - 45 ~ 3.4E + 38 |
val double = 2.563 //Double형
val float = 3.4F //식별자F로 Float형 추론
실수 자료형의 기본 타입추론은 Double형이며 접미사에 F를 붙이면 Float형으로 추론할 수 있습니다.
논리 자료형
Boolean | 1비트 | true, false |
val isture = true //Boolean으로 추론
var isfalse: Boolean //초기값 지정안할때는 반드시 자료형 표기
문자 자료형
Char | 2바이트 | 0~2의15제곱-1 |
val ch1 = 'f' //작은따옴표''로 감싸서 표시 -> Char형으로 추론
val ch2 : Char //초기화 하지않을경우 반드시 타입 명시
val ch3 : Char = 30 와 같이 선언하면 안 됩니다!
Char형은 숫자를 사용하여 선언하는 것은 금지되어 있습니다.
val num = 65
val ch : Char = num.toChar()
println(ch) //결과는 65에 해당하는 아스키코드값 A 출력
위와 같은 방식으로 정수 자료형을 이용하여 문자 자료형을 선언할 수 있습니다.
문자열 자료형
val string1 : String = "Hello"
val string2 = "World"
val string3 = "Hello"
문자열 자료형도 다른 자료형과 같이 타입 추론이 가능합니다.
문자열 자료형은 조금 특별하게 저장이 되는데 문자열 객체는 힙 메모리에 생성되며
문자열 변수가 이를 참조하는 형태를 가지고 있습니다.
그런데 같은 문자열일 경우 메모리 공간을 효율적으로 사용하기 위해
서로 다른 레퍼런스가 하나의 객체를 함께 참조하고 있습니다.
위 코드에서는 string1과 string3이 "Hello" 문자열 객체를 함께 참조하고 있습니다
val num = 3
val string1 = "num = $num" //"num = 3"
val string2 = "num+1 = ${num + 1}" //"num+1 = 4"
$기호를 사용하면 문자열 안에 변수의 값이나 표현식을 사용할 수 있습니다.
표현식을 사용하려면 $기호 뒤에 중괄호 { }안에서 사용하면 됩니다.
val str1 = """
Hello World
var a = 10
println(a)
"""
println(str1)
다중 문자열을 표기하려면 위 코드처럼 """을 사용하시면 됩니다.
"""을 사용하여 문자열을 작성 시 공백과 탭 모두 함께 포함되므로
들여 쓰기를 제거하고 싶으면 문자열 끝에 .trimIndent()를 붙여주시면 됩니다.
val str1 = """
Hello World
var a = 10
println(a)
""".trimIndent()
println(str1)
코틀린에서 null
개발자에게 NullPointerException(NPE) 오류는 상당히 골치가 아픈데,
코틀린에서는 변수에 아예 null을 허용하지 않으므로 NPE 오류를 미리 방지할 수 있습니다.
var string = "GogiGood"
string = null
위 코드처럼 string변수에 null을 넣으려고 하면 코틀린에 빨간 줄이 표시되며 실행이 되지 않습니다.
그럼 null을 표기하려면 어떻게 해야 할까요?
var string : String? = "GogiGood"
string = null
println(string) //결과는 null
위 코드처럼 변수 선언 시 자료형뒤에 ? 를 붙여주시면 null값을 할당할 수 있게 됩니다.
세이프 콜 ( ?. )
세이프 콜이란 null 할당되어 있을 가능성이 있는 변수를 검사하여 안전하게 호출하는 기능입니다.
var string : String? = "GogiGood"
string = null
println(string?.length)
null이 할당된 String변수에 길이를 구하려고 하면 NPE가 발생하게 됩니다.
이를 방지하기 위해 세이프 콜 기호인 ?. 를 출력하려는 변수명 뒤에 붙여주시면 NPE가 발생하지 않고
null이라는 결과가 나오게 됩니다.
non-null 단정 기호 ( !!. )
non-null단정 기호는 변수에 할당된 값이 null이 아님을 단정하므로
컴파일러는 null검사 없이 무시하고 컴파일을 진행하게 됩니다.
var string : String? = "GogiGood"
string = null
println(string!!.length)
null이 할당된 변수를 non-null기호인 !!. 를 이용하여 출력할 때에는 NPE오류가 발생하게 됩니다.
엘비스 연산자 ( ?: )
null이 할당된 변수를 조금 더 안전하게 사용하려면 세이프 콜기호 ?. 와 엘비스 연산자 ?: 를 사용하면 됩니다.
var string : String? = "GogiGood"
string = null
println(string?.length ?: -1) //결과 -1
엘비스 연산자는 변수가 null인지 검사하여 null이 아니면 왼쪽식을, null이면 오른쪽 식을 실행합니다.
이번 포스팅은 여기까지 작성하도록 하겠습니다!
궁금하신 점이 있거나 제가 혹시 틀린 부분이 있으면 댓글로 남겨주세요!🧐
'Language > Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 클래스 생성자와 접근제한자(가시성 변경자) (class, constructor, init...) (0) | 2021.06.29 |
---|---|
[Kotlin] 코틀린 HelloWorld 출력하기 + IntelliJ 기본설정 (3) | 2021.02.02 |
[Kotlin] 코틀린 프로그래밍 시작하기 - 개발환경 구축 IntelliJ 설치 (0) | 2021.02.02 |