코틀린(Kotlin)은 간결한 문법과 강력한 타입 시스템을 제공하여 개발 생산성을 높이는 데 초점을 맞춘 언어다. 특히, 변수 선언, 널 안전성(Null Safety), 타입 시스템, 연산자 등에서 기존 Java보다 더 편리한 기능을 제공한다.
1. 변수 선언 (var
vs val
)
코틀린에서는 변수를 선언할 때 var
과 val
두 가지 키워드를 사용한다.
var
(mutable): 변경 가능한 변수val
(immutable): 변경 불가능한 변수 (Java의final
과 유사)
var name = "Kotlin" // 변경 가능
name = "Java" // 가능
val version = 1.8 // 변경 불가능
// version = 2.0 // 오류 발생
가능하면 val
을 사용하여 **불변성(immutability)**을 유지하는 것이 좋은 코드 스타일이다.
2. 원시 타입과 래퍼 타입
Java에서는 int
와 Integer
가 다르지만, 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
: 코드가 정상적으로 종료되지 않음을 의미 (무한루프)
참고자료
- 자바 개발자를 위한 코틀린 입문
- ChatGPT