BLOG
Tracefield · 02
Tracefield · 01
블로그 · 14
Vibe Audit · 04
Vibe Audit · 03
Vibe Audit · 02
Vibe Audit · 01
출판편집자 · 01
StudyTree · 01
SecurityOps · 02
SecurityOps · 01
AI챗봇 · 04
AI챗봇 · 03
AI챗봇 · 02
AI챗봇 · 01
퍼플심 · 04
퍼플심 · 03
퍼플심 · 02
퍼플심 · 01
블로그 · 13
rootscan · 07
rootscan · 06
블로그 · 12
블로그 · 11
블로그 · 10
블로그 · 09
블로그 · 08
블로그 · 07
블로그 · 06
블로그 · 05
블로그 · 04
블로그 · 03
블로그 · 02
블로그 · 01
rootscan · 05
rootscan · 04
rootscan · 03
asmspeak · 03
asmspeak · 02
rootscan · 02
asmspeak · 01
rootscan · 01
웹보안도구 · 02
웹보안도구 · 01
루트캠프 · 02
루트캠프 · 01
All notes 167
Kotlin 기초 이론
1. Kotlin이란?
Kotlin은 JetBrains가 2011년에 공개한 JVM 기반 정적 타입 언어다. 자바의 장황한 문법과 null 처리 문제를 줄이기 위해 나왔고, 안드로이드 공식 언어가 되면서 빠르게 확산됐다. 최근에는 Spring Boot 백엔드에서도 자바를 대체하거나 함께 쓰는 선택지로 많이 올라온다.
자바와 100% 상호운용성을 보장한다는 점도 크다. 기존 자바 라이브러리를 거의 그대로 가져다 쓸 수 있어서, 새 언어를 도입할 때 진입 장벽이 낮다.
1.1. 주요 특징
- 정적 타입과 타입 추론: 정적 타입 언어지만, 문맥을 보고 타입을 추론해준다.
val name: String = "Fox"대신val name = "Fox"만 써도String으로 인식한다. - Null Safety:
NullPointerException을 줄이기 위해null허용 여부를 타입 차원에서 구분한다. - 함수형 프로그래밍 지원: OOP를 기본으로 하면서도 람다와 고차 함수 같은 함수형 개념을 적극적으로 받아들였다.
2. 변수와 타입
자바와 비교했을 때 가장 먼저 체감되는 차이는 변수 선언 방식이다. 타입보다 val이나 var가 먼저 오고, 타입은 변수명 뒤에 붙는다.
2.1. 불변(Immutable) vs 가변(Mutable)
코틀린은 값이 바뀌는 변수인지 아닌지를 명확히 구분한다. 이 구분이 코드 안정성에 꽤 큰 영향을 준다.
// val(Value): 읽기 전용 변수. 자바의 final과 비슷하다.
// 기본적으로 모든 변수는 val로 선언하는 습관을 들이는 게 좋다.
val name = "Kotlin"
// name = "Java" // 이렇게 값을 바꾸려고 하면 컴파일러가 빨간 줄을 긋는다.
// var(Variable): 변경 가능한 변수다.
// 꼭 값이 바뀌어야 하는 상황(예: for문의 카운터)에서만 쓴다.
var age = 10
age = 11 // 문제없다.
사이드 이펙트를 줄이려면 가능한 한 값을 바꾸지 않는 편이 낫다. 그래서 코틀린에서는 보통 val을 기본값처럼 쓰고, 정말 필요할 때만 var를 쓴다.
2.2. Null Safety
코틀린의 핵심 특징 중 하나가 Null Safety다. 아무 표시 없이 선언한 변수는 기본적으로 null을 허용하지 않는다. null을 넣고 싶다면 타입 뒤에 ?를 붙여야 한다.
var a: String = "abc"
// a = null // 에러 발생! String 타입엔 오직 문자열만 들어갈 수 있다.
var b: String? = "abc"
b = null // 타입 뒤에 ?가 있으니 null을 넣어도 봐준다.
// Safe Call(?.): b가 혹시 null이면 실행하지 말고 그냥 null이 찍힌다.
println(b?.length) // b가 null이면 프로그램이 죽는 게 아니라 그냥 null이 찍힌다.
// Elvis Operator(?:): null일 때 대신 사용할 기본값을 지정한다.
val len = b?.length ?: 0 // b가 null이면 0을 쓰겠다는 뜻이다.
3. 제어문과 표현식(Expression)
코틀린의 제어문은 단순한 명령이 아니라 '값'을 만들어내는 표현식으로 쓰일 때가 많다.
3.1. if-else
자바나 파이썬에서는 if가 분기용 구문에 가깝지만, 코틀린에서는 값을 반환하는 표현식으로도 쓴다. 그래서 자바의 삼항 연산자 대신 if만으로도 충분한 경우가 많다.
// 조건에 따라 값을 바로 변수에 넣어버린다.
val currentMax = if (a > b) a else b
3.2. when(Switch 대체)
when은 자바의 switch보다 훨씬 유연하다. 단순 값 비교뿐 아니라 타입 검사와 범위 검사까지 같이 처리할 수 있다.
val result = when (inputVal) {
1 -> "One" // 값이 1이면 이걸 리턴
2, 3 -> "Two or Three" // 여러 개도 묶을 수 있다
in 4..10 -> "Big Number" // 숫자 범위도 체크한다
is String -> "It's Text" // 심지어 변수 타입까지 검사한다
else -> "I don't know" // 위의 조건에 다 안 맞으면 실행 (default)
}
4. 함수(Function)
함수는 fun 키워드로 정의한다. 로직이 단순하면 중괄호를 생략하고 한 줄 함수로 줄여 쓸 수도 있다.
// 우리가 아는 일반적인 함수 모양
fun sum(a: Int, b: Int): Int {
return a + b
}
// 단일 표현식 함수(Single-Expression Function)
// 리턴 타입도 컴파일러가 알아서 추론해주니까 생략 가능하다.
fun sumSimple(a: Int, b: Int) = a + b
5. 클래스와 데이터 클래스
5.1. 기본적인 클래스
자바에서는 멤버 변수, 생성자, Getter/Setter까지 따로 적느라 코드가 길어지는 경우가 많았다. 코틀린은 이 부분을 훨씬 짧게 줄여준다.
// 이 한 줄이 자바의 20줄짜리 코드와 맞먹는다.
// 생성자 선언과 동시에 프로퍼티 정의가 끝난다.
class Person(val name: String, var age: Int)
5.2. data class(DTO용)
서버 개발에서는 데이터를 담아 옮기는 DTO를 자주 만든다. 자바에서는 Lombok으로 줄이던 코드를, 코틀린은 data 키워드만으로 상당 부분 해결한다.
// data를 붙이면 equals(), hashCode(), toString() 같은 필수 메서드를 공짜로 만들어준다.
data class UserDto(val username: String, val email: String)

