1. 코틀린 이해하기
1. 코틀린의 현재와 미래
코틀린을 배워야 하는 이유
- Jetbrains에서 만든 언어
- → 자동완성, 코틀린 변환, 코루틴등 관련 편의 기능을 지원한다.
- 자바는 발표된지 20년이 넘었지만 코틀린, 스위프트와 같은 현대언어에 비해 기능이 부족하다.
- 자바에서 best-practice로 불리는 기법들을 언어적 차원에서 기본적으로 제공한다.
- ex) 이펙티브 자바, 디자인패턴 등
- 자바에 비해 문법이 간결 → 가독성, 생산성이 높고 오류 가능성이 적다.
// equals(), hashCode(), toString() 자동으로 생성
data class Person(
val name: String,
val age: Int,
val email: String
)
// 간단하게 싱글턴 객체를 생성
object MyCompany {
const val name: String = "MyCompany"
}
// 탑레벨 함수로 클래스 외부에서 함수를 작성한다.
fun main() {
//new 키워드 없이 객체를 생성한다
val person = Person(" ", 35, "a@gmail.com")
println(person)
}
data class를 사용하면 equals, hashCode, toString 함수를 자동으로 생성한다.
object 키워드는 싱글턴 객체를 자동으로 생성한다.
fun을 이용해 함수를 탑레벨에 위치시켜 별도의 클래스 없이 함수를 작성할 수 있다. 또한 new 키워드 없이 객체를 생성할 수 있다.
- 자바와 상호 운용이 가능하기 때문에 기존 자바프로젝트에 쉽게 적용할 수 있다.
- 코틀린은 기본적으로 멀티 플랫폼 언어로써, 모바일앱(안드로이드, ios), 프론트(js)등 모든 분야에서 사용이 가능하다.
2. 코틀린 타임라인
- 2016년 코틀린 1.0 릴리즈
- 2017년 스프링 프레임워크 5.0부터 코틀린 공식 지원
- 2017년 구글 io에서 안드로이드 공식 지원 언어로 발표
- 2019년 구글 io에서 안드로이드 개발시 최우선 언어로 코틀린 발표
- 스택 오버플로우 트렌드에서 코틀린 인기가 계속 상승하고, 자바는 감소하는것을 확인할 수 있음.
- 유명 오픈소스 프로젝트의 코틀린 지원 현황
- 스프링 프레임워크
- 공식 문서 예제에 자바와 코틀린 2가지 탭이 나뉘어있음
- gradle은 기존엔 groovy문법만 지원했었는데, 요즘은 kotlin dsl을 지원하기 때문에 자동완성, 컴파일 검사를 받을 수 있음.
- 스프링 프레임워크
3. 자바와 코틀린의 차이점
✅ 자바에는 있지만 코틀린에는 없는 기능
- 체크드 익셉션(Checked Exception)
- 자바는 익셉션 계층으로 구성
Error
: 시스템에서 에러가 발생해서 복구가 어려운 상황(OOM, StackOverFlow Error)Exception
CheckedException
: 시스템에서 포착 가능하여 복구 가능, 예외처리를 강제한다. (IOException, FileNotFoundException)RuntimeException
: 런타임시에 발생, 예외처리 강제하지 않음(NullPointerException, ArrayIndexOutOf`BoundsException, Unchecked Exception)
- 자바에서 checked exception은 컴파일 에러가 발생하기 때문에 무조건 try-catch로 감싸거나 throws로 에러를 전파해야 한다.
- → 의미없는 처리의 반복이 일어난다.
try {
File file = FileUtils.get(filename);
} catch (FileNotFoundExcepition e) { //checked exception이 발생했지만 의미있는 작업처리가 없음
//처리?
}
- 코틀린은 checked exception을 강제하지 않는다. try-catch문을 생략해도 컴파일 에러가 발생하지 않는다.
- 기본 자료형
- 자바는 원시 자료형과 레퍼런스 타입 모두 지원한다.
int i = 0; // primitive type
Integer ii = 0; //reference type
- 코틀린은 레퍼런스 타입만 지원한다.
val i : Int = 0
val str : String = i.toString()
레퍼런스 타입을 컴파일 할 때 **최적화된 방식으로 컴파일**한다.
위의 예제에서 컴파일될때에는 원시타입인 int로, str은 String이 된다.
//위의 코드가 컴파일 될때 해석되는 내용 -> 최적화된 성능 보장
int i = 0;
String str = String.valueOf(i);
- 정적 멤버
- 자바는 static 키워드로 정적 멤버를 선언하지만, 코틀린은 static이 존재하지 않고 companion object로 대체한다.
class Kotlin {
companion object { //static과 유사한 키워드, companion object
val i: Int = 0
fun function() {
}
}
}
- 삼항 연산자
- 자바에는 삼항연산자가 존재하지만, 코틀린은 if-else로 대신한다.
val animalSound: String = if("호랑이" == animal) "어흥" else "야옹"
kotlin은 if-else가 **식**이 될 수 있다.(== 값을 리턴할 수 있다)
- 세미콜론(;)
- 코틀린은 세미콜론이 필수가 아니다.
✅ 코틀린에는 있지만 자바에는 없는 기능
- 확장
- 개발자가 임의로 객체의 함수나 프로퍼티를 확장해서 사용할 수 있다.
//String 함수에 first라는 확장함수를 사용
fun String.first(): Char {
return this[0]
}
//String 함수에 addFirst라는 확장함수를 사용
fun String.addFirst(char: Char): String {
return char + this.substring(0)
}
fun main() {
println("ABCD".first()) //출력 : A
println("ABCD".addFirst('Z')) // 출력 : ZABCD
}
- 데이터 클래스
- 데이터를 보관하거나 전달하는 목적을 가진 불변객체로 사용
- DTO로 주로 유용하게 사용한다.
// data키워드로 사용, hashCode(), equals(), toString(), copy(), componentN() 자동생성
data class Person(val name: String, val age: Int)
- 기존 자바에서는 주로 lombok 플러그인을 이용해 자동으로 생성한다. 코틀린은 플러그인이 아닌 언어레벨에서 지원을 해주기 때문에 유용하다.
- +) jdk 15에서 record라는 이름으로 추가됨 → Data 클래스와 동일한 목적으로 사용
- 문자열 템플릿
- 코틀린은 문자열에 변수를 사용할 수 있다.
val text = "World"
val greeting = "Hello, **${text}**"
- 코틀린은 여러 행으로 된 텍스트 블록을 만들 수 있다.
fun sql(nameIncluded: Boolean) =
"""
SELECT id, name, email, age
FROM users
WHERE id = :id
${
if(nameIncluded) {
"""
AND name = :name
"""
} else ""
}
"""
3개의 쌍따옴표를 사용해 문자열 템플릿을 만들 수 있다. 다이나믹 쿼리를 만들 때 코틀린으로 string을 만들고, 안에서 변수를 사용할 수 있다.
- 널(Null) 안정성
- 자바에서 가장 많이 발생하는 예외는 NPE (NullPointerException) 이다.
null에 대한 문제를 해결하도록 Optional을 제공하고는 있지만, optional 객체 생성에 따른 오버헤드가 발생하고, 컴파일 단계에서는 Null 가능성을 검사하진 않는다.
- 코틀린은 언어차원에서 NPE가 발생할 가능성을 제거한다.
- 자바에서 가장 많이 발생하는 예외는 NPE (NullPointerException) 이다.
val a: String = null //컴파일오류(nullable이 아니기 때문)
var b : String = "aabbcc"
b = null //지연초기화로 null을 넣었을 경우 컴파일 오류 발생
var a: String? = null
a.length //컴파일 오류 발생
a?.length //?참조를 이용해 safe-call, null이 아닌경우에만 동작
a!!.length //!!을 이용해 null이 절대 안들어감을 확신한다.
코틀린에서는 NPE를 자연스럽게 방지할 수 있는 기법들을 제공한다.
- smart cast, sealed class, coroutine
4. 스프링의 코틀린 지원
Spring initializr
- 기본 언어로 코틀린을 선택할 수 있고, 코틀린의 경우 gradle project를 선택하면 빌드 설정을
kotlin DSL
기반으로 생성해준다. - ide의 도움을 받을 수 있기 때문에 쉽게 설정파일을 세팅할 수 있다.
스프링 부트
- 별다른 변경사항 없이 스프링부트 어플리케이션을 실행할 수 있다.
@SpringBootApplication
class DemoApplication // 클래스가 있긴 하지만 중괄호로 메인을 감싸고 있지 않음
//탑-레벨 함수로 클래스 바깥에서 호출한다.
fun main(args: Array<String>){
runApplication<DemoApplication>(args)
}
@ConfigurationProperties
- 스프링에서 지정한 설정을 기반으로 설정클래스를 만들 때,
@ConstructorBinding
을 사용하면 setter가 아닌 생성자를 통해 바인딩하므로 불변객체를 쉽게 생성할 수 있다.
@ConstructorBinding
@ConfigurationProperties("example.kotlin")
data class KotlinExampleProperties(
val name: String,
val description: String,
val myService: MyService) {
data class MyService(
val apiToken: String,
val uri: URI
)
}
테스트 지원
- SpringMockK라는 코틀린 라이브러리를 이용해
@MockkBean
,@SpykBean
을 사용한다.
@ExtendWith(SpringExtension::class)
@WebMvcTest
class GreetingControllerTest {
@MockkBean
private lateinit var greetingService: GreetingService
@Autowired
private lateinit var controller: GreetingController
@Test
fun `should greet by delegating to the greeting service`() { // 함수명에 띄어쓰기, 예약어 모두 가능
// Mockk에서 제공하는 기능
every { greetingService.greet("John") } returns "Hi John"
// When
assertThat(controller.greet("John")).isEqualTo("Hi John")
// Then
verify { greetingService.greet("John") }
}
}
확장 함수
- 코틀린 api의 대부분은 확장기능을 사용해 기존 api를 건드리지 않고 쉽게 코틀린 api를 추가한다.
// CrudRepositoryExtensions.kt
package org.springframework.data.repository
fun <T, ID> CrudRepository<T, ID>.findByIdOrNull(id: ID): T? {
return findById(id).orElse(null)
}
//MyService.kt
class MyService(
private val myRepository: MyRepository, ){
fun findById(id: Long): My? = myRepository.findByIdOrNull(id)
}
코루틴
- 코틀린에서 비동기-논블로킹 방식을 선언형으로 구현한다.
- 스프링 mvc, webflux 모두 코루틴을 지원 → 의존성만 추가하면 바로 사용 가능하다.
- 비동기-논블로킹 스타일의 구현을 쉽게 할 수 있다. (suspend 키워드, async, await)
참고
정확한 정보를 전달하고자 최선을 다하지만, 틀린 부분이 있을 수 있습니다!
틀린 부분이 있을 시 지적해주시면 감사히 반영하겠습니다😀
'🐤 study > Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 기초문법(변수, 함수, 흐름제어, 널 안정성, 예외처리, 클래스, 프로퍼티, 상속, 인터페이스, 열거형 클래스) (3) | 2022.12.28 |
---|---|
[당근테크 밋업 요약] 코프링 | 코틀린의 철학 | 코틀린의 장점 | 코틀린 특징(#살아있다 #자프링외길12년차 #코프링2개월생존기) -1편 (0) | 2022.11.17 |