달력

112024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

변수 선언

Kotlin에서 변수를 선언할땐 

val  var을 구분해야 한다.

val 은 상수값을 대입하기 위해 사용한다.  (최초 지정한 변수값에서 변경할 수 없음)

var 은 변수값을 대입하기 위해 사용한다. 

이때 상수 val 은 자료형(타입)을 선언하지 않으면 Kotlin은 변수에 할당된 값으로 자료형을 자동으로 지정한다.

예를들어 

val userNm = "Gildong" 이라고 하면 userNm은 String 타입으로 자동인식.

물론 val userNm: String ="Gildong" 으로 해도 된다.

var 역시 마찬가지.

 

자료형 

프로그래밍에서 자료형을 "기본형 자료형" 과 "참조형 자료형" 으로 구분한다. 

코틀린에서는 "참조형 자료형"만 사용한다. 

기본형 과 참조형이 무엇인지 살짝 짚어보면 

예를들어 자바의 경우 

기본형 자료형 : int, long, double 등을 말하고 

참조형 자료형 : String, Date, 사용자가 정의한 객체 등을 말한다. 

아무래도 참조형 보다 기본형이 성능면에서 좀더 우월하다. 

코틀린은 컴파일시 참조형을 기본형으로 대체 되니 성능 최적화를 위한 자료형은 딱히 신경쓰지 않아도 된다.

음... 

혹시 이부분은 참고하는게 좋을 것 같다. 

typealias를 쓰는 경우 아래와 같은 메세지를 만날수 있는데 

Kotlin: Nested and local type aliases are not supported

typealias 선언을 클래스나 오브젝트 안쪽에 넣은 경우 발생한다. 

 

자료형의 검사와 변환

코틀린은 기본적으로 null 을 허용하지 않는다. 

null 을 허용하려면 ?를 사용해야 한다. 

예를 들어 자바는 

String str = null

이런식으로 null 이 허용 되지만 

코틀린은 

var str: String = null 이라고 하거나 

var nullTest: String = "test"

nullTest = null 

라고 하면

Error:(25, 23) Kotlin: Null can not be a value of a non-null type String 

와 같은 오류가 발생한다.

하지만 ?를 사용하여 (여기서 ? 를 Safe Call 이라고 함)

var nullTest: String? ="test"

nullTest = null 

라고 하면 오류가 발생하지 않는다. 또는 단정부호 (!!) 를 사용해도 오류가 발생하지 않는다. 

var nullTest: String?

nullTest = null

println("nullTest: $nullTest length: ${nullTest!!.length}") // 단정부호 !! 를 사용함.

단, 단정부호 !! 사용시 Compile 시에는 오류가 발생하지 않지만 

RunTime 시 아래와 같이 NullPointerException 이 발생할 수 있다.

Exception in thread "main" kotlin.KotlinNullPointerException 
at chap02.section2.VarTestKt.main(varTest.kt:73)
at chap02.section2.VarTestKt.main(varTest.kt)

※ 참고 ※

null 값과 "" 은 다른 값으로 인식함.

 

Elvis(엘비스) 연산자

코틀린(Kotlin) 에만 있는건 아니지만 여튼 코틀린 에는 엘비스(Elvis) 연산자가 있다. 

?:  <-- 요렇게 사용한다. 

문법 내용은 

aaaa ?: bbbb  엘비스 연산자 ?: 를 기준으로 변수가 null 인지를 검사하여 

null 이 아니면 aaaa를 null 이면 bbbb 를 실행하는 것.  아래와 같이 사용

var nullTest: String?

nullTest = null

println("nullTest: $nullTest length: ${nullTest?.length ?: -999 }") // Safe Call ? 와 엘비스 연산자 ?: 를 같이 사용함.

결국 아래 참고 조건절과 같은 내용인데 단순 조건절을 한줄로 표현 할 수 있으니 가독성 측면에서 

엘비스 연산자가 효율적이다.

참고 : if ( nullTest != null) nullTest.length else -999

 

 

 

 

Posted by redev
|