코틀린 변수, null, 타입, 연산자

de_sj_awa·2023년 4월 13일
0
post-custom-banner

1. 변수

  • 모든 변수는 var/val을 붙여주어야 한다.
    • var : 변경 가능하다.
    • val : 변경 불가능하다.(read-only)
  • 타입을 명시적으로 작성하지 않아도, 타입이 추론된다.
  • Primitive Type과 Reference Type을 구분하지 않아도 된다.
    • 자바로 컴파일 할 때, 필요시 Primitive Type으로 변환된다.
  • Null이 들어갈 수 있는 변수는 타입 뒤에 ?를 붙여주어야 한다.
    • 자바로 컴파일 할 때, Reference Type으로 변환된다.

2. Null

  • 코틀린에서는 null이 가능한 타입을 완전히 다르게 취급한다.

  • 그래서 null이 가능한 타입만을 위한 기능이 존재한다.

    • 한 번 null 검사를 하면 not-null 임을 컴파일러가 알 수 있다.

    • Safe Call : null이 아니면 실행하고 null이면 실행하지 않는다. (그대로 null)

      
      val str: String? = "ABC"
      str.length      // 불가능
      str?.length     // 가능
    • Elvis 연산자 : 앞의 연산 결과가 null이면 뒤의 값을 사용

      
      val str: String? = "ABC"
      str?.length ?: 0
    • 널 아님 단언 : nullable 타입이지만, 아무리 생각해도 null이 될 수 없는 경우

      fun startsWithA1(str: String?): Boolean {
          return str!!.startsWIth("A")
      }
    • 플랫폼 타입 : 코틀린이 null 관련 정보를 알 수 없는 타입. Runtime 시 Exception이 날 수 있다. 자바에서 @Nullable이나 @NotNull 어노테이션을 사용해서 null 관련 정보를 코틀린에게 전달해야 한다.

3. Type

1) 기본 타입, 타입 캐스팅

Byte
Short
Int
Long
Float
Double
부호 없는 정수들

  • 코틀린에서는 선언된 기본 값을 보고 타입을 추론한다.
  • Java에서는 기본 타입간의 변환은 암시적으로 이루어질 수 있으나, Kotlin에서는 기본 타입간의 변환은 명시적으로 이루어져야 한다. 즉, to변환타입()을 사용해야 한다.
    
    val number1: Int = 4
    val number2: Long = number1.toLong()
    println(number1 + number2)
  • 변수가 nullable이면 적절한 처리가 필요하다.
    
    val number1: Int? = 3
    val number2: Long = number1?.toLong() ?: 0
  • 기본 타입이 아닌 일반 타입의 경우 is(자바에서 instanceOf), !is, as(자바에서는 괄호) 키워드를 활용한다.
     
     fun printAgeIfPerson(obj: Any) {
     	if (obj is Person) {
         	val person = obj as Person
         	println(person.age)
         }
     }
     
     fun printAgeIfPerson(obj: Any) {	// 스마트 캐스트
     	if (obj is Person) {
         	println(obj.age)
         }
     }
     
     fun printAgeIfPerson(obj: Any?) {	// nullable
     	val person: Person? = obj as? Person
         println(person?.age)
     }

2) Kotlin의 3가지 특이한 타입

  • Any

    • Java의 Object 역할(모든 객체의 최상위 타입)
    • 모든 Primitive Type의 최상위 타입도 Any이다.
    • Any 자체로는 null을 포함할 수 없어 null을 포함하고 싶다면 Any?로 표현
    • Any에 equals/hashCode/toString 존재
  • Unit

    • Unit은 Java의 void와 동일한 역할
    • void와 다르게 Unit은 그 자체로 타입 인자로 사용 가능하다.
    • 함수형 프로그래밍에서 Unit은 단 하나의 인스턴스만 갖는 타입을 의미. 즉, 코틀린의 Unit은 실제 존재하는 타입이라는 것을 표현
  • Nothing

    • Nothing은 함수가 정상적으로 끝나지 않았다는 사실을 표현하는 역할
    • 무조건 예외를 반환하는 함수 / 무한 루프 함수 등

3) String Interpolation, String indexing

  • ${변수}를 사용하면 값이 들어간다.
  • 여러 줄에 걸친 문자열을 작성할 때 큰따옴표 세개(""")를 쓰면 편하게 작성할 수 있다.
  • 코틀린에서 문자열의 특정 문자를 가져오기 위해서는 자바의 배열처럼 []를 사용한다.

4. 연산자

1) 단항 연산자 / 산술 연산자

  • Java와 Kotlin의 사용법이 동일함

2) 비교 연산자와 동등성, 동일성

  • 비교 연산자의 경우 자바와 코틀린의 사용법이 동일하나, Java와 다르게 객체를 비교할 때 비교 연산자를 사용하면 자동으로 compareTo를 호출한다.
  • 동등성(Equality) : 두 객체의 값이 같은가(==)
  • 동일성(Identity) : 완전히 동일한 객체인가, 즉 주소(객체 레퍼런스)가 같은가(equals)
  • Java에서는 동일성에 ==을 사용, 동등성에 equals를 직접 호출
  • Kotlin에서는 동일성에 ===을 사용, 동등성에 ==를 호출, ==를 사용하면 간접적으로 equals를 호출해준다.

3) 논리 연산자 / 코틀린에 있는 특이한 연산자

  • Java와 Kotlin의 사용법이 동일함. Java처럼 Lazy 연산을 수행함.
  • in / !in : 컬렉션이나 범위에 포함되어 있다. 포함되어 있지 않다.
  • A..B : A부터 B까지의 범위 객체를 생성한다.
  • a[i] : a에서 특정 Index i로 값을 가져온다.
  • a[i] = b : a의 특정 index i에 b를 넣는다.

4) 연산자 오버로딩

  • Kotlin에서는 객체마다 연산자를 직접 정의할 수 있다.
    data class Money (
        val amount: Long
    ) {
        operator fun plus(other: Money): Money {
            return Money(this.amount + other.amount)
        }
    }

참고

profile
이것저것 관심많은 개발자.
post-custom-banner

0개의 댓글