Kotlin

[Kotlin] 코틀린에서 변수와 타입, 연산자

수수한개발자 2023. 11. 14.
728x90

1. 코를린에서 변수를 다루는 방법

 

1 - 1. 변수 선언 키워드 - var 과 val의 차이점

 

Java

long number1 = 10L;
final long number2 = 10L;

Long number3 = 1_000L;
Person person = new Person("김지수");

 

 

Java에서 long과 final long 의 차이점은 변수가 가변인가, 불변인가의 차이점이 있습니다.

 

Kotlin

fun main() {

    var number1 = 10L
    val number2 = 20L

    number1 = 20L
    number2 = 20L // error
}

 

var 키워드는 가변으로 새로운 값을 할당할 수 있지만 val 키워드는 불변으로 재할당을 못한다.

 

1 - 2. 코틀린에서의 Primitive Type

코틀린에서는 refference Type의 연산의 경우 내부적으로 Primitive Type으로 변환해준다.

프로그래머가 boxing/ unboxing을 고려하지 않아도 되도록 코틀린이 알아서 처리 해준다.

 

 

1 - 3. 코틀린에서의 null 타입 변수

var number3: Long? = 10L
number3 = null

 

위와 같이 ?를 통해 널이 들어갈 수 있는 변수라고 선언해줘야한다.

 

1 - 4. 코틀린에서의 객체 인스턴스화

var person = Person("김지수")

 

코틀린에서는 객체 인스턴스화 할 시 new 키워드를 붙이지 않는다.

 

 

2. 코틀린에서 null을 다루는 방법

 

2 - 1. Safe Call 과 Elvis 연산자

// 1. safe call
val str: String? = "ABC"
str?.length

// Elvis 연산자
val str2: String? = "ABC"
str2?.length ?: 0

 

널이 들어갈 수 있는 타입의 변수는 safe call을 통해 사용할 수 있다.

Elvis 연산자는 자바의 삼항 연산자 같이 safe call은 해준뒤 만약 널이라면 뒤에 값을 사용하는 연산자이다.

 

 

2 - 2. 널 아닐시 

val str: String? = "ABC"
str!!.startsWith("A")

 

2 - 3. 플랫폼 타입언어 

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    @Nullable
    public String getName() {
        return this.name;
    }
}

 

위는 자바 코드이다.

@Nullable 같이 널에 대해 알려준다면 코틀린이 컴파일 시점에서 널 타입을 체크해주지만 어노테이션이 없다면

컴파일 시점에서는 에러가 안나지만 런타임시에 에러가 날 수 있다.

 

 

 

3. 코틀린에서 타입을 다루는 방법

 

1. 기본 타입

Java에서 기본 타입같의 변환은 암시적으로 이루어질 수 있지만,

코틀린에서는 명시적으로 이루어져야 한다.

 

val number1: Int? = 3
val number2 = number1?.toLong() ?: 0L
println(number5)

 

toInt(), toLong() 등등 메서드를 활용한다.

 

2. 타입 캐스팅

 

fun printNameIfPerson(obj: Any) {
    if (obj is Person) {
        val person = obj as Person
        println(person.name)
    }
}

 

obj is Person -> Java 에서 instanceof 와 같은 의미이다.

obj as Person -> Java 에서 (Person) obj 와 같은 의미이다.(생략가능) 스마트 캐스트

 

타입 검사 및 null 대응 코드

// 1번 방법
fun printNameIfPerson(obj: Any) {
    if (obj !is Person) {
        val person = obj as Person
        println(person.name)
    }   
}

// 2번 방법
fun printNameIfPerson(obj: Any?){
    val person = obj as? Person
    println(person?.ame)
}

 

1번 방법은 !is 를 통해 부정을 해주어서 Person 타입이 아닐때 사용을하고

2번 방법은 null 이 들어왔을때 엘비스 연산을 통해 null을 반환해준다.

 

 

 

2 - 3. 코틀린의 3가지 타입

 

ANY

자바의 Object의 역할( 모든 객체의 최상위 타입)

모든 Primitive Type의 최상위 타입도 Any이다.

Any 자체로는 null을 포함할 수 없어 null을 포함하고 싶다면 Any?로 표현

Any에 equals / hashCode / toString 존재

 

Unit

자바의 void와 동일한 역할

void와 다르게 그 자체로 타입 인자로 사용 가능하다.

함수형 프로그래밍에서 Unit은 단 하나의 인스턴스만 갖는 타입을 의미. 즉 코틀린의 Unit은 실제 존재하는 타입이라는것을 표현

 

 

Nothing 

함수가 정상적으로 끝나지 않았다는 사실을 표현

무조건 예외를 반환하는 함수 / 무한 루프 함수 등

 

String interpolation / String indexing

val name = "김지수"
val age = 27
val log = "내 이름은: $name,나이: $age"

 

${변수}를 사용할 수 있다.

val str = """
안녕
""".trimIndent()

엔터를 생략하고  값을 가져온다.

 

val str = "ABC"
println(str[0])

 스트링의 인덱스를 가져올 수 있다.

 

 

 

4. 코틀린에서 연산자를 다루는 방법

 

4 - 1. 단항 연산자 / 산술 연산자

단항 연산자

  • ++
  • --

산술 연산자

  • +
  • -
  • *
  • /
  • %

 

산술대입 연산자

  • +=
  • -=
  • *=
  • /=
  • %=

비교 연산자

  • >
  • <
  • >=
  • <=

비교 연산자 사용시 자동으로 compareTo를 호출해준다.

 

 

4 - 2. 비교 연산자와 동등성, 동일성

동등성(Equals) : 두 객체의 값이 같은가?

 

동일성(Identity) : 완전한 동일한 객체인가? 주소값이 같은가?

 

자바에서는 동일성에 ==, 동등성에 equals 를 사용

코틀린에서는 동일성에 ===를 사용  동등성에 == 를 호출한다. 동등성에 == 를 호출하면 간접적으로 equals를 호출해줌.

 

 

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

  • &&
  • ||
  • !
  • in
  • !in
  • a..b

in 과 !in은 컬렉션이나 범위에 포함되어 있다, 포함되어 있지 않다는 뜻이다.

a..b는 a부터 b 까지의 범위 객체를 생성한다.

 

4 - 4. 연산자 오버로딩

data class Person(
    val age: Int
) {
    operator fun plus(person: Person): Person {
        return Person(age + person.age)
    }
}

val person1= Person(10)
val person2= Person(20)
print(person1 + person2)

 

 

728x90

댓글