코틀린 정리(1)

By deuk9

코틀린(Kotlin)은 간결한 문법과 강력한 타입 시스템을 제공하여 개발 생산성을 높이는 데 초점을 맞춘 언어다. 특히, 변수 선언, 널 안전성(Null Safety), 타입 시스템, 연산자 등에서 기존 Java보다 더 편리한 기능을 제공한다.


1. 변수 선언 (var vs val)

코틀린에서는 변수를 선언할 때 varval 두 가지 키워드를 사용한다.

  • var (mutable): 변경 가능한 변수
  • val (immutable): 변경 불가능한 변수 (Java의 final과 유사)
var name = "Kotlin"  // 변경 가능
name = "Java"        // 가능

val version = 1.8    // 변경 불가능
// version = 2.0    // 오류 발생

가능하면 val을 사용하여 **불변성(immutability)**을 유지하는 것이 좋은 코드 스타일이다.


2. 원시 타입과 래퍼 타입

Java에서는 intInteger가 다르지만, Kotlin에서는 구분하지 않는다.
Kotlin의 Int, Long, Double 등의 기본 타입은 자동으로 Primitive Type으로 변환되어 연산된다.

val a: Int = 10
val result = a.plus(10)
println("result = ${result}") // 20

Kotlin에서는 Boxing, Unboxing을 고려할 필요 없이 사용 가능하다.


3. 타입 명시 (Type Inference)

Kotlin에서는 변수 타입을 변수명: 타입의 형태로 명시할 수 있다.

val a: Int = 3
val b: Int
val c = 3  // Int로 타입 추론
val d = 3L // Long으로 타입 추론

주의: 타입을 명시하지 않으면 반드시 초기화해야 한다.
아래 코드는 컴파일 에러 발생:

val e // 에러 발생
val f: Int // 에러 발생 (초기화 필요)

4. 널 안전성 (Null Safety)

Kotlin은 기본적으로 null 값을 허용하지 않는다. ?를 붙이면 Nullable 타입이 된다.

val a: Int? = null
println(a) // null

4.1. 안전한 호출 연산자 (?.)

fun getLength(text: String?): Int? {
    return text?.length
}

4.2. 엘비스 연산자 (?:)

fun getLength(text: String?): Int {
    return text?.length ?: 0
}

4.3. 널 아님 단언 (!!)

fun getLength(text: String?): Int {
    return text!!.length  // Null이면 NPE 발생
}

5. new 키워드

Java에서는 new 키워드로 객체를 생성하지만, Kotlin에서는 필요 없다.

val member = Member("Alice", 20)

6. 플랫폼 타입 (Java-Kotlin 호환성)

Java에서 넘어온 코드의 null 가능성을 알 수 없다

public class Member {
    private final String name;
    public User(final String name) { this.name = name; }
    public String getName() { return name; }
}
val user = Member(null)
val uppercaseName = user.name.uppercase()

java code에서 @Nullable, @NotNull 으로 명시하면 kotlin과의 호환성을 유지 가능하다. 아니면 kotlin 코드로 한번 랩핑하여 사용하는 방법도 있다.


7. 타입 캐스팅 (is, as, as?)

fun checkType(obj: Any) {
    if (obj is Member) {
        println(obj.age)  // 스마트 캐스트 (Smart Cast)
    }
}
val member = obj as? Member  // 안전한 캐스팅
println(member?.age ?: "Not a member")
  • is 는 java 에서 instanceof 키워드와 동일하다.
  • as 형변환에 사용되는 키워드.

8. 연산자 오버로딩 (operator)

class Money(val value: Int) {
    operator fun plus(other: Money): Money {
        return Money(this.value + other.value)
    }
}

val money1 = Money(4000)
val money2 = Money(5000)
val newMoney = money1 + money2  // Money(9000)

9. 객체 비교 (==, ===, compareTo)

  • ==equals() 호출
  • === → 동일한 객체 참조 여부 비교
  • compareTo()>, < 연산자 지원
data class Member(  
    val name: String,  
    val age: Int  
) : Comparable<Member> {  
  
    override fun compareTo(other: Member): Int {  
        return compareValuesBy(this, other, Member::age)  
    }  
}

val  member1= Member("name1", 1)
val  member2 = Member("name2", 2)
println(member1 < member2) // true
  • java 에서 compare 때문에 애를 많이 먹었었는데 명시적으로 <> 연산자를 통하여 비교 가능

10. 문자열 템플릿

fun main() {
    val name = "Alice"
    val age = 25

    println("이름: $name, 나이: $age")
    println("내년 나이는 ${age + 1} 입니다.")  // 표현식 사용 가능
}

11. 범위 연산 (in, !in)

fun checkRange(x: Int) {
    if (x in 1..10) {
        println("$x는 1~10 범위 안에 있습니다.")
    } else {
        println("$x는 범위를 벗어났습니다.")
    }
}

12. Any, Unit, Nothing

Kotlin에서는 Any, Unit, Nothing 등의 특수 타입도 존재한다.

  • Any : Java의 Object와 유사한 최상위 타입
  • Unit : Java의 void와 유사하지만 실제 타입을 가짐
  • Nothing : 코드가 정상적으로 종료되지 않음을 의미 (무한루프)

참고자료