오늘부터 코틀린 공부 시작한다. 우선 코틀린 공식 문서를 읽으며 코틀린의 문법을 익혀 보려 한다. 오준석 님의 코틀린 문법 1시간 총정리 강의도 참고했다.
** 본 포스트는 공부 내용 정리글이 아닌, 개인적인 공부 메모에 가까우니 참고
변수 선언
- val: 상수 선언 시 (read-only variables) - 자바의 final과 동일
- var: 변수 선언 시 (mutable variables)
** 기본적으로는 변수 선언 시 읽기 전용인 val을 사용하고 필요한 경우에만 var을 사용할 것을 권장한다.
(자바스크립트에서 const / let을 사용하는 방식과 비슷하고만)
- 코틀린은 타입을 추론할 수 있는 기능을 가지고 있어서 별도로 타입을 지정해 주지 않아도 된다.
var i = 10
var name = "지선"
var point = 3.3
- 타입을 명시하려면 변수 선언 뒤에 콜론을 찍고 타입 지정 가능하다. (타입명은 대문자로 시작)
var i : Int = 10
var name : String = "지선"
var point : Double = 3.3
const 컴파일 타임 상수
- 자바에서는 반드시 클래스 선언이 필요하고, 메인 함수 안에서 뭔가를 작성할 수 있었다. 하지만 코틀린에서는 클래스를 선언하지 않고도, 메인 함수 바깥에서 변수 선언이 가능하다.
- const val 로 선언한 상수는 컴파일 타임 상수가 되며, main 함수보다 우선으로 컴파일이 되고 성능상 우위를 가져올 수 있다.
const val num = 20
fun main() {
var i : Int = 10
var name : String = "지선"
var point : Double = 3.3
}
형변환
- "to + 타입명"으로로 시작하는 함수들을 통해 형변환이 가능하다.
var i = 10 // int
var l = 20L // long
var name = "10"
i = name.toInt()
l = i.toLong()
i = l.toInt()
String
- 다른 언어들과 마찬가지로 다양한 String 메소드들을 제공한다.
fun main() {
var name = "jisun"
println(name.uppercase())
println(name.lowercase())
}
String 템플릿
- 쌍따옴표 사이에 $ 사인을 활용하면 템플릿 문자열 사용 가능하다.
- 수식이 들어가거나 단일 변수로 해결이 안 되는 경우 {}로 감쌀 수 있다.
val customers = 10
println("There are $customers customers")
// There are 10 customers
println("There are ${customers + 1} customers")
// There are 11 customers
조건문
- 다른 언어들과 마찬가지로 if를 사용한 조건문을 작성할 수 있다.
val i = 5
if (i > 10) {
print("10보다 크다")
} else if (i > 5) {
print("5보다 크다")
} else {
print("")
}
- when문을 사용해도 동일한 결과를 얻는다.
val i = 5
when {
i > 10 -> {
print("10보다 크다")
}
i > 5 -> {
print("5보다 크다")
}
else -> {
print("")
}
}
- 코틀린에서는 if 문 자체가 값으로 치환되기 때문에 변수에 결과를 담아서 쓸 수가 있다. when 문도 마찬가지.
val i = 5
val result = if (i > 10) {
print("10보다 크다")
}
else if (i > 5) {
print("5보다 크다")
}
else {
print("!!!")
}
val i = 5
val result = when {
i > 10 -> {
print("10보다 크다")
}
i > 5 -> {
print("5보다 크다")
}
else -> {
print("!!!")
}
}
- 그래서 자바의 삼항 연산자를 활용한 코드를 코틀린에서는 아래와 같이 사용할 수 있다.
// boolean result = i > 10 ? true : false;
var i = 5
val result = if (i > 10) true else false
반복문
- 자바의 for each 문과 비슷하게 사용할 수 있다. in 을 사용하면 된다.
val items = listOf(1, 2, 3, 4, 5)
for (item in items) {
println(item)
}
- 이렇게 점을 찍고 forEach를 사용할 수도 있다. 위의 코드와 동일한 역할을 한다.
val items = listOf(1, 2, 3, 4, 5)
items.forEach{ item ->
print(item)
}
- 자바에서 아래처럼 작성하던 코드는 코틀린에서 in과 ..을 사용해 작성할 수 있다.
for (int i = 0; i < items.length; i++){}
val items = listOf(1, 2, 3, 4, 5)
for (i in 0..items.size - 1) {
print(items[i])
} // 12345
- while 문의 사용법은 자바에서와 완전히 동일하다. break, continue도 지원한다.
리스트
- listOf로 만든 리스트는 요소의 추가, 삭제 등의 변경이 불가능하다.
val items = listOf(1, 2, 3, 4, 5)
- 변경이 가능한 리스트를 만들고자 한다면 mutableListOf를 사용해야 한다. 이렇게 만들어진 리스트는 add나 remove가 가능하다.
val items = mutableListOf(1, 2, 3, 4, 5)
items.add(6)
items.remove(3)
배열
- arrayOf를 이용해 배열을 생성할 수 있다.
- size로 배열의 크기를 확인할 수 있고, 대괄호를 사용하여 값 조회 및 변경이 가능하다.
val items = arrayOf(1, 2, 3)
println(items.size) // 3
items[0] = 10
- 배열은 실질적으로 잘 사용하지 않기 때문에 리스트를 사용하는 게 좋다.
예외처리
val items = listOf(1, 2, 3)
try {
val item = items[4]
} catch (e: Exception) {
print(e.message)
}
Null Safety
- 코틀린에서 null 값을 넣으려면 물음표가 붙은 타입을 지정해줘야 한다.
var name: String? = null
name = "jisun"
name = null
- String과 String? 타입은 별개의 타입으로 취급이 되기 때문에 String 타입 변수에 String? 타입의 값을 넣으려면 null 체크를 해줘야 한다.
var name: String? = null
var name2: String = ""
if (name != null) {
name2 = name // if 문을 거치면서 String? -> String으로 타입 변환됨
}
- !!를 붙이면 강제로 타입에서 물음표를 뗄 수도 있으나 권장되지는 않는다.
var name: String? = null
var name2: String = ""
name2 = name!!
- 코틀린이 제공하는 내장 함수를 이용하여 null 체크를 하는 방법도 있다. 아래 코드에서 name이 null이 아니라면 코드블록을 수행한다. 코드블록 안에서는 it으로 접근 가능하다.
var name: String? = null
var name2: String = ""
name?.let {
name2 = name
}
함수
- fun 키워드를 사용하여 함수를 정의할 수 있다. 아래와 같이 각 매개변수의 타입과 리턴 타입을 지정해준다.
fun main() {
print(sum(10, 20))
}
fun sum(a: Int, b: Int): Int {
return a + b
}
- 파일의 맨 바깥에 작성한 함수들은 톱 레벨 함수라고 하며, 어느 파일에서나 사용 가능하다.
- 한 줄 밖에 없는 함수라면 아래와 같이 축약한 표현도 가능하다. 이 경우 리턴 타입의 추론이 가능하기 때문에 리턴 타입을 생략해줘도 된다.
fun sum(a: Int, b: Int) = a + b
- 매개변수의 개수가 다른 경우, 자바에서처럼 오버로딩할 필요 없이 default 값을 설정해주면 된다.
fun sum(a: Int, b: Int, c: Int = 0) = a + b + c
- 입력 파라미터를 명시적으로 지정할 수도 있다. 이 경우 순서 상관이 없게 된다.
fun main() {
print(sum(a = 10, b = 20))
}
fun sum(a: Int, b: Int, c: Int = 0) = a + b + c
클래스
- 코틀린에서는 클래스 정의 시 바로 기본 생성자를 작성한다. 그렇기 때문에 별도 생성자에 대한 코드 블록을 내부에서 작성하지 않아도 된다.
class Person(
val name: String,
var age: Int
)
- val과 var로 적절히 재할당 가능 여부를 설정하여 getter, setter의 별도 생성 없이 해당 효과를 구현할 수 있다.
fun main() {
val john = Person("John", 20)
print(john.name)
print(john.age)
john.name = "Jennie" // val로 생성한 변수이므로 재할당 불가
john.age = 23 // var로 생성한 변수이므로 재할당 가능
}
class Person(
val name: String,
var age: Int
)
- 기본적으로 변수는 public이지만, private 키워드를 추가함으로써 외부의 접근을 막을 수 있다.
fun main() {
val john = Person("John", 20)
print(john.name) // private 변수는 외부에서 접근 불가
print(john.age)
}
class Person(
private val name: String,
var age: Int
)
'Language > Java' 카테고리의 다른 글
[Java] 달력 출력 프로그램 코드 비교 (날짜/시간 라이브러리 활용) (0) | 2025.03.19 |
---|---|
[Java] 김영한의 실전 자바 기본편 완강 (0) | 2025.03.13 |