고기가좋아
고기가좋아
고기가좋아
  • ALL (38)
    • SSAFY (1)
    • IT (11)
      • 꿀팁 (6)
      • 제품리뷰 (3)
      • 스마트폰 (1)
      • 노트북 (1)
    • Android (10)
      • AndroidStudio (4)
      • UI (2)
      • Jetpack (1)
      • RxJava (1)
      • Compose (1)
      • Util (1)
    • Language (4)
      • Kotlin (4)
    • Algorithm (12)
      • 이론 (1)
      • 백준 (8)
      • 프로그래머스 (1)
      • SWEA (2)

블로그 메뉴

  • GitHub
전체 방문자
오늘
어제

인기 글

티스토리

hELLO · Designed By 정상우.
고기가좋아

고기가좋아

[Kotlin] 코틀린 변수, 자료형, 타입추론, null
Language/Kotlin

[Kotlin] 코틀린 변수, 자료형, 타입추론, null

2021. 2. 3. 13:17
반응형

👍오늘의 목표

이번 포스팅에서는 코틀린의 변수, 자료형, 타입추론, 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
    'Language/Kotlin' 카테고리의 다른 글
    • [Kotlin] 코틀린 클래스 생성자와 접근제한자(가시성 변경자) (class, constructor, init...)
    • [Kotlin] 코틀린 HelloWorld 출력하기 + IntelliJ 기본설정
    • [Kotlin] 코틀린 프로그래밍 시작하기 - 개발환경 구축 IntelliJ 설치
    고기가좋아
    고기가좋아
    고기를 좋아하는 개발자의 블로그

    티스토리툴바