- PYTHON
- select
- springboot
- 자바
- spring mvc
- spring boot
- SSL
- static
- 데이터베이스
- hibernate
- ORM
- AWS
- mysql
- 문자열
- sql
- Docker
- spring security 6
- nginx
- DI
- @transactional
- Django
- 1차원 배열
- spring
- string
- join
- 스프링
- jpa
- 프로그래머스
- 스프링부트
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
개발하는 자몽
[Kotlin] 기본 문법 1 본문
요즘 스프링 개발 환경에서도 코틀린을 사용하는 경향이 꽤 보인다. 그래서 코틀린에 관심이 생겨서 찾아본 기본 문법!
변수 타입
코틀린에는 `var`와 `val`라는 두 가지 형태의 변수가 존재한다.
- `var`: 초기화 이후에도 값 변경이 가능한 가변 변수
- `val`: 초기화 이후에는 값을 변경할 수 없는 불변 변수
fun main() {
var a = 1
a = 2 // 가변 변수이므로 값 변경 가능
val b = 1
b = 2 // 불변 변수이므로 에러 발생
var c: Int // 타입은 명시했으나, 초기화 하지 않은 상태
println(c) // 초기화 하지 않은 상태이므로 에러 발생
c = 1 // 초기화
println(c) // 1 출력
}
타입 추론(Type Inference)
타입 추론이란 변수나 함수를 선언할 때 타입을 명시적으로 선언하지 않아도 자동으로 자료형을 추론해 주는 기능이다. 코틀린은 기본적으로 이러한 타입 추론을 지원하므로, 변수를 초기화할 때 명시적으로 타입을 입력하지 않아도 된다. 하지만 협업 시에는 가급적 타입을 명시하는 것이 좋다고 한다.
fun main() {
var a = 1 // int로 타입 추론
var a: Int = 1 // 타입 명시
}
null과 ?
코틀린 변수는 기본적으로 non-null 타입으로, 위와 같이 선언하여 `null`을 할당하면 에러가 발생한다. `null`을 허용하려면 아래와 같이 선언해야 한다.
fun main() {
var str1: String? = null // str1 변수에는 String이나 null이 들어올 수 있다
val str2: String? = null
var str3: String = null // non-null 타입이므로 에러 발생
var i: Int? = null // i 변수에는 Int나 null이 들어올 수 있다
}
Null Safe Operator `?.`
이번에는 문자열의 길이를 출력해 보자.
fun main() {
var str: String? = "test"
println(str.length) // 에러 발생: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type 'kotlin.String?'.
}
# 위 코드 실행 결과 (에러 발생)
Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type 'kotlin.String?'.
에러를 해석하면 `String?` 타입에서 `null`을 허용하려면 `?.`나 `!!.` 호출이 필요하다는 것 같다.
fun main() {
var str: String? = "test"
println(str?.length) // 4
}
`str` 변수와 `.` 사이에 `?`를 붙이면 성공적으로 실행이 된다. 정확히는 `?.`에 의해 성공한 것인데, 이는 `str`이 `null`이 아닌 경우에 `?.` 뒤에 있는 명령어를 실행할 수 있게 한다. 이때 쓰인 `?.`는 `null safe operator`라고 한다.
fun main() {
var str: String? = null
println(str?.length) // null 출력
}
`?.` 앞에 위치한 `str` 변수의 값이 `null`이므로 뒤에 있는 `length` 명령어는 실행하지 않으며, `null`이 출력된다.
Not Null Assertion Operator `!!.`
방금 위에서 봤던 에러 문구 중에는 `!!.`도 있었는데, 이는 좌항이 절대 `null`이 아님을 보장한다.
fun main() {
var str: String? = "test"
println(str!!.length) // 4
var str2: String? = null
println(str2!!.length) // str2가 non-null임을 보장 -> null에서 length를 구하는 것이므로 NullPointerException 에러 발생
}
Elvis Operator `?:`
엘비스 연산자는 좌항이 `null`인 경우 우항에 있는 명령어를 실행한다.
fun main() {
var str1: String? = null
str1 ?: println("str is null") // "str is null" 출력
var str2: String? = "not null"
str2 ?: println("str is null") // 아무것도 출력되지 않는다.
}
'Java & Kotlin' 카테고리의 다른 글
[Java Error] Caused by: java.lang.IllegalArgumentException at PropertyPlaceholderHelper.java:180 (1) | 2024.11.23 |
---|---|
Java/Spring 테스트 - 2 (0) | 2024.11.04 |
Java/Spring 테스트 - 1 (2) | 2024.10.02 |
[Gradle] gradle build와 gradle bootJar의 차이 (0) | 2024.09.06 |
[Java] new Integer와 Integer.valueOf()의 차이점 (0) | 2024.08.11 |