Kotiln 공부하기
어쩌다 같이 공부하던 팀원의 코틀린 프로젝트에 참여하게 되었다.
해야할 작업은 다음과 같다.
- Spring Boot 2.7 -> 3.X 마이그레이션
- OAuth 2.0 구현
- React 연결
일단 그전에 Kotlin에 대해 파악하고자 한다. 평소 들어왔던 자바와 코틀린의 차이는 함수형 프로그래밍을 지원한다는 것, 타입을 추론하여 타입지정을 안해도 된다는 것, 그리고 null에 대해 안전하다는 것이다. 우선 함수형 프로그래밍에 대해 공부해보려고 한다.
함수형 프로그래밍이 뭐지?
함수형 프로그래밍이라... 이름만 들으면 함수를 사용하는 프로그래밍인가? 싶은데, 우리가 평소에 하는 프로그래밍도 다 함수 쓰잖아? 뭐가 다른 거지?
알고 보니 함수형 프로그래밍은 프로그래밍 패러다임 중 하나로, 함수를 일급 객체로 취급하고 불변성을 중요시하는 프로그래밍 방식이라고 한다. 음... 뭔 소리지? 좀 더 파고들어보자.
함수형 프로그래밍의 특징
- 순수 함수(Pure Functions): 같은 입력에는 항상 같은 출력을 반환하고, 외부 상태를 변경하지 않는 함수를 말한다. 이렇게 하면 예측 가능한 코드가 된다고 한다.
- 불변성(Immutability): 데이터가 한번 생성되면 변경되지 않는다. 변경이 필요하면 새로운 객체를 만든다. 이게 멀티스레드 환경에서 안전하다고 한다.
- 고차 함수(Higher-Order Functions): 함수를 인자로 받거나 함수를 반환할 수 있는 함수를 말한다. 자바에서도 람다로 비슷하게 쓸 수 있긴 한데, 코틀린에서는 이게 더 자연스럽게 지원된다고 한다.
- 람다 표현식(Lambda Expressions): 익명 함수를 간결하게 표현하는 방식이다. 코틀린에서는 이런 식으로 쓴다
val sum = { x: Int, y: Int -> x + y }
코틀린은 함수형 프로그래밍 언어인가?
처음에는 코틀린이 함수형 프로그래밍 언어라고 생각했는데, 알고 보니 그건 아니고 함수형 프로그래밍을 지원하는 다중 패러다임 언어라고 한다. 즉, 객체 지향 프로그래밍(OOP)도 할 수 있고 함수형 프로그래밍(FP)도 할 수 있다는 거다.
자바가 주로 객체 지향 프로그래밍에 초점을 맞춘 언어라면, 코틀린은 객체 지향과 함수형 두 가지 스타일을 모두 지원한다. 이게 코틀린의 큰 장점인 것 같다.
코틀린의 함수형 프로그래밍 예시
코틀린에서 함수형 프로그래밍을 어떻게 쓰는지 간단한 예시를 찾아봤다
// 숫자 리스트에서 짝수만 골라서 제곱한 후 합계를 구하는 코드
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val sumOfSquaredEvens = numbers .filter { it % 2 == 0 }
// 짝수만 필터링 .map { it * it }
// 제곱 .sum()
// 합계 println(sumOfSquaredEvens)
// 결과: 220
자바로 이걸 구현하려면 훨씬 더 길어질 것 같다. 물론 자바 8부터는 스트림 API로 비슷하게 할 수 있지만, 코틀린이 더 간결하고 직관적인 느낌이다.
코틀린의 다른 특징들
함수형 프로그래밍 외에도 코틀린의 주요 특징들을 좀 더 알아봤다
타입 추론
자바에서는 변수 선언할 때 항상 타입을 명시해야 한다
String name = "John"; int age = 30;
코틀린에서는 타입을 알아서 추론해준다
val name = "John" // String으로 추론
val age = 30 // Int로 추론
이거 진짜 편할 것 같다. 타입 쓰는 게 귀찮았는데...
Null 안전성
자바에서는 NPE(NullPointerException)가 런타임에 자주 발생하는 문제였는데, 코틀린은 이걸 컴파일 타임에 잡아준다고 한다.
// null이 될 수 있는 타입은 ?를 붙여야 함
var nullableName: String? = null
// null이 될 수 없는 타입
var nonNullName: String = "John"
// nonNullName = null
// 컴파일 에러!
이건 정말 좋은 기능인 듯하다. NPE 때문에 디버깅하느라 시간 낭비한 적이 많았는데...
마무리
코틀린이 함수형 프로그래밍을 지원한다는 것과 다른 특징들을 알아봤는데, 생각보다 괜찮은 언어인 것 같다. 자바 개발자인 내가 적응하기에도 크게 어렵지 않을 것 같고, 오히려 더 간결하고 안전한 코드를 작성할 수 있을 것 같다.
다음에는 Spring Boot 3.X 마이그레이션에 대해 알아봐야겠다. 이번 프로젝트를 통해 코틀린도 배우고 최신 Spring Boot도 사용해볼 수 있어서 기대된다. 뭔가 새로운 기술 스택을 배울 수 있는 기회가 생겨서 좋다.