Today I Learned_230709
실무 프로젝트로 배우는 Kotlin & Spring : 리팩토링부터 서비스 구현까지
Part 2. 코틀린 문법 학습하기
코틀린 개발 환경 구성하기
OpenJDK 설치 : https://adoptium.net/temurin/releases/
이클립스 재단에서 제공하는 temurin (Azul zulu와 비슷한듯)
intel 칩 사용하고 있으므로 x64로 설치
코틀린 언어만 학습할 때에는 플레이그라운드 사용
변수
// 변수 선언 시 top level에 위치시킬 수 있다.
var x = 5
fun main() {
x += 1 // 함수 밖에서 선언한 변수에 접근이 가능
val a : Int = 1 //키워드 변수병 : 타입 = 할당할 값
// 타입 생략도 가능하다. 타입 자동 추론이 가능하다.
val b = 1
// 지연 할당
val c : Int
c = 3 // 먼저 선언하고 이후에 할당하는 방식
// 변수 선언 시 타입을 정해주지 않으면 컴파일 에러 발생. 타입을 c와 같이 반드시 넣어줘야 한다.
val d
d = 123
// 변수 선언 시 두 가지 키워드 존재
// val(value) : java의 final처럼 한 번 값이 초기화 된 이후에는 재할당 불가. readonly
// var(variable) : 가변 변수를 나타내는 키워드. 이후에 재할당이 가능하다.
val e : String = "Hello"
e = "World" // 컴파일 오류 발생
var f = 123
f = "hi" // 컴파일 오류 발생. 최초에 고정된 타입과 다른 타입이 들어오면 안 된다.
}
함수
// 기본적인 함수 선언 스타일
// fun 함수명(함수의 인자) : 함수가 반환할 타입
// { 함수의 몸통 }
fun sum(a: Int, b: Int) : Int {
return a + b
}
// 표현식 스타일
fun sum2(a: Int, b: Int) : Int = a + b //몸통 없이 로직만 들어간다
// 표현식 & 반환타입 생략
fun sum3(a: Int, b: Int) = a + b // 변수의 타입 추론이 되기에 반환타입 생략. 함수도 기본적으로 추론해주므로 생략이 가능하다.
// 몸통이 있는 함수는 반환 타입을 제거하면 컴파일 오류
// 표현식은 반환타입 생략이 가능
fun sum4(a: Int, b: Int) {
return a + b
}
// 반환타입이 없는 함수는 Unit을 반환한다 (java의 void와 유사)
// Unit의 기능을 사용하기 보다는 반환타입이 없으면 Unit이 된다.
fun prinfSum(a: Int, b: Int) {
println("$a + $b = ${a + b}")
}
// 디폴트 파라미터
// java에는 디폴트 파라미터가 없다.
fun greeting(message: String = "안녕하세요!") {
println(message)
}
fun main() {
greeting()
greeting("HI!!!")
}
// named argument
fun log(level: String = "INFO", message: String) {
println("[${level}]$message")
}
// named argument : 함수에 변수 값을 넣을 때 이름과 값을 매핑하는 기법
// 버그를 줄일 수 있는데 유용한 문법. 순서 바꿔 넣거나 헷갈리게 넣을 수 있는 오류를 줄여준다.
fun main() {
log(message = "인포 로그")
log(level = "DEBUG", "디버그 로그") // named argument를 직접 지정하지 않아도 level 다음으로 오기에 message에 들어온다
log("WARN", "워닝 로그") // 순서대로 넣어주기
log(level = "ERROR", message = "에러 로그")
}
흐름제어
if
fun main() {
// if..else 사용
val job = "Software Developer"
if(job == "Software Developer"){
println("개발자")
} else {
println("개발자 아님")
}
// 코틀린의 if...else는 표현식이다
val age : Int = 10
val str = if(age> 10) {
"성인"
} else {
"아이"
}
// 코틀린은 삼항 연산자가 없다. if...else가 표현식이므로 불필요하다.
val a = 1
val b = 2
val c = if (b > a) b else a // 삼항 연산자 대신 if else 사용
}
when
fun main() {
// 자바의 switch 코드를 코틀린의 when식으로 변환한 코드
// 자바의 switch는 표현식이 아니기에 그 자체로 값을 반환하지는 않았다 (최근 자바에서는 지원)
val day = 2
val result = when (day) {
1 -> "월요일"
2 -> "화요일"
3 -> "수요일"
4 -> "목요일"
5 -> "금요일"
else -> "기타"
}
println(result)
// else를 생략할 수 있다
when(getColor()) {
Color.RED -> print("red")
Color.GREEN -> print("green")
}
// 여러개의 조건을 콤마로 구분해 한줄에서 정의할 수 있다.
when (getNumber()) {
0, 1 -> print("0 또는 1")
else -> print("0 또는 1이 아님")
}
}
enum class Color {
RED, GREEN
}
fun getColor() = Color.RED
fun getNumber() = 2
for
fun main() {
// 범위 연산자 .. 를 사용해 for loop 돌리기
// .. : 코틀린에서 제공하는 범위 연산자. 뒤에 온 값들을 포함한다.
for (i in 0 .. 3) {
println(i) // 0, 1, 2, 3
}
println()
// until을 사용해 반복한다(맨 마지막 값 포함하지 않음)
for (i in 0 until 3) {
println(i) // 0, 1, 2
}
println()
// step에 들어온 값 만큼 증가시킨다
// 특정 값만큼 증가시키면서 반복할 때 사용
for (i in 0 .. 6 step 2){
println(i) // 0, 2, 4, 6
}
println()
// downTo를 사용해 반복하면서 값을 감소시킨다
for (i in 3 downTo 1) {
println(i) // 3, 2, 1
}
println()
// 전달받은 배열을 반복
val numbers = arrayOf(1, 2, 3)
for(i in numbers) {
println(i) // 1, 2, 3
}
}
while
fun main() {
// 자바의 while문과 동일
// 조건을 확인하고 참이면 코드 블록을 실행한 후 다시 조건을 확인
var x = 5
while (x > 0) {
println(x) // 5, 4, 3, 2, 1
x--
}
}