목표
- 코틀린에 대해 간단히 알아보자.
Kotlin를 왜 공부해야 되는가?
- 코틀린은 Google I/O 2017에서 안드로이드의 공식 개발 언어로 채택되었고, 이후 개발에 사용되는 언어가 Java에서 Kotlin으로 전환되고 있는 상황이다.
- 현재도 git을 보면 상당히 많은 코드가 Kotlin으로 작성된 것을 볼 수 있다.
Kotlin은 무엇인가?
- 코틀린은 자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어다.
- 간결하고 실용적이며 자바를 완전히 대체할 수 있다.
- 서버, 안드로이드 앱 개발 분야에 사용되고 있다.
- 자바 라이브러리나 프레임워크와 함께 잘 동작하며 성능도 자바와 동일하다.
Kotlin의 사용
코틀린의 주목적은 간결하고 생산적이며 안전한 언어로 자바를 완전히 대체하는 것에 있다. 코틀린은 서버, 특히 웹 어플리케이션의 벡엔드 서버를 구축하는데 사용될 수 있으며 안드로이드 애플리케이션 개발에 사용될 수 있다. 하지만 2019년 현재 순수 코틀린 라이브러리를 제공하는 건 좀 고민해봐야 할 부분이라고 생각한다.
Kotlin의 주요 특성
코틀린은 생산성과 안정성을 향상시키는데 광범위한 목표를 가지고 있다. 코틀린은 다음과 같은 특성을 가지고 있다.
정적 타입 지정 언어
자바와 마찬가지로 코틀린도 정적 타입(statically typed) 지정 언어다. 정적 타입이란 쉽게 말해서 int인지 String인지 타입을 지정해야 한다는 뜻이다. 이러면 컴파일 시점에 모든 프로그램 요소의 타입을 컴파일러가 검증해준다. 다만 자바와 차이점은 변수 선언 시, 모든 변수의 타입을 명시할 필요가 없다는 것에 있다.
이와 반대되는 개념인 동적 타입(dynamically typed)은 타입과 관계 없이 모든 값을 변수에 넣을 수 있고, 메소드나 필드 접근에 대한 검증이 실행 시점에 일어나, 코드가 짧아지고 데이터 구조를 유연하게 생성할 수 있게 된다. 반대로 말하면 실행 전까지 제대로 만들었는지 알 수 없다는 말도 된다.
따라서 정적 타입 방식이 동적 타입에 비해, 실행 시점에 어떤 함수를 호출해야 할지 알고 있기 때문에 호출이 빠르며, 컴파일러가 한번 검증하기 때문에 프로그램의 정확성이 높고, 코드에서 어떤 객체가 어떤 타입에 속하는지 명확하기 때문에 유지보수가 유리하며, IDE에서 더 정확한 코드 완성 기능을 제공하기 때문에 안전한 리팩토링을 할 수 있다는 장점이 있다.
처음 코틀린에 대한 설명을 들을 때, 타입을 지정할 필요가 없다고 했는데 정적 타입 방식을 사용한다(?) 라는 의문을 가졌다. 타입을 지정해도 문제가 되지 않는 이유는, 코틀린이 타입 추론(type inference)을 사용하기 때문이다. 타입 추론은 컴파일러가 문맥을 고려해 변수 타입을 자동으로 결정해주기는 기능을 말한다.
class, interface, generics 등은 자바와 비슷한 반면, null에 대해서는 처리 방식이 완전히 다르다. 코틀린은 null을 기본적으로 허용하지 않고, null이 필요한 경우 nullable type을 지정하여 사용해야 한다. 이 특성 때문에 프로그램의 신뢰성이 높다졌다. (프로그램 신뢰도와 함께, 난이도 상승)
함수형 프로그래밍과 객체지향 프로그래밍
코틀린은 객체지향으로 프로그램을 작성해도 문제는 없고, 함수형과 객체지향 프로그래밍 방식을 섞어 써도 잘 된다. 하지만 결국 가장 좋은 방법은 함수형으로 작성하는 것이다.
초기에 프로그래밍 방식은 절차적 프로그래밍(procedural programming) 방식이었다. 단순히 입력과 처리의 순서를 정해놓고 프로그래밍하는 방식이 아닌, 프로시저(루틴, 서브루틴, 메소드, 함수 등의 명령집합)를 사용한 프로그래밍 패러다임을 말한다. 여기서 Procedural의 Procedure는 '절차'가 아니라 '프로시저'를 의미한다. 이 부분 때문에 절차를 굉장히 중요시하는(?) 프로그래밍이구나 하고 오해하기 쉽다.이 패러다임은 프로시저를 사용하여 추상화(Abstraction : 핵심 개념 또는 기능을 간추려 내는것)와 재사용성(Reusability)을 얻어내는 것이 주된 내용이다.
절차적 프로그래밍은 추상화된 함수를 호출함으로써 여러 부분을 생략해 프로그램의 흐름을 쉽게 볼 수 있으므로 가독성이 좋고, 코드의 재활용성을 높일 수 있게 된다. 또한 코드를 조립하는 것도 가능하다. 하지만 프로시저를 호출하는 행위는 그냥 코드를 사용하는 것보다 비용이 많이 들기 때문에 성능이 떨어지며, 프로시저를 호출함으로써 스텍이 복잡해지는 등 단점을 가지고 있다. 이 문제를 해결하기 위해 C++에서는 inline 함수가 등작했다. 물론 현재 컴파일러는 자동으로 inlineing해주기 때문에 아주 옛날에는 저런 문제도 걱정했다. 정도로 이해하면 될 것 같다.
이후 객체지향(Object-Oriented Programming)이라는 것이 등작했는데, 이는 프로그래밍을 단순 데이터와 처리 방법으로 나누는 것이 아니라, 수많은 객체라는 기본 단위로 나누고 이 객체들이 상호작용하는 방식으로 프로그램을 작성하는 프로그램 설계방법론이자 일종의 개념을 말한다. 이때 객체(Object)란 하나의 역할을 수행하는 메소드(method)와 데이터(data)의 묶음으로 보면 된다. 객체지향에서 객체를 디자인 할때는 SOLID라는 5원칙이 존재하며, 캡슐화, 상속, 다향성등의 특징을 가진다. 이후 많이 사용되는 패턴은 디자인패턴이라는 형태로 정리되었다. (GOF의 디자인패턴을 읽으세요.)
OOP 도입으로 인해 목적에 따라 명확하게 클래스를 나눌 수 있어 구현 단위와 목표가 뚜렸해 졌고, 따라서 재사용성의 효율이 좀더 올라가 생산성을 높이는 효과가 있었다. 하지만 코딩 난이도가 올라가면서 수많은 문제점들이 발생했다. (수많은 문제점은 OOP 관련 나무위키를 참고하면 좋을 것 같다.)
코틀린에서도 사용했다고 하는 함수형 프로그래밍(Functional Programming)이란, 순수 함수(pure function)를 조합하고 공유 상태(shared state), 변경 가능한 데이터(mutable data) 및 부작용(side-effects)를 피하는 새로운 프로그래밍 패러다임을 말한다. 함수형 프로그래밍은 명령형(imperative)이 아닌 선언형(declarative)으로 애플리케이션의 상태는 순수 함수를 통해 전달된다. 이는 애플리케이션 상태가 일반적으로 공유되고 객체의 메소드와 함께 배치되는 객체 지향 프로그래밍과 대조된다.
함수형 프로그래밍의 장점
- 간결성 : 함수를 값처럼 활용하여 더 강력한 추상화를 할 수 있고, 추상화를 사용해 코드의 중복을 막을 수 있다.
- 다중 스레드 환경에서의 안전 : 일반적으로 다중 스레드를 사용하는 경우 동기화를 하지 않고 값을 변경하거나 사용하면 문제가 발생한다. 하지만 함수형 프로그래밍에서는 불변 데이터 구조(persistent immutable data structures)와, 순수함수를 그 데이터 구조에 적용한다면 다중 스레드 환경에서 같은 데이터를 여러 스레드가 변경할 수 없기 때문에 thread safe하다.
- 테스트 용이성 : 함수의 외부나 환경에 의해 객체의 상태가 변경되는 side effect가 있는 함수와는 다르게, 순수 함수는 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며 외부 환경에 영향을 받지 않는 특성을 가지고 있기 때문에 테스트를 위해 준비 코드를 작성할 필요가 없어 테스트가 용이하다.
무료 오픈소스
- 프로그램을 배포할 생각이라면 '무료'면서 '오픈'소스 여부는 매우 중요하다.
- IDE가 유료라서 기안에 '개발하고 싶어요.' 써야하나 라는 고민을 하기도 한다.
- 하지만 코틀린은 Apache 2.0 라이선스이고, 관련한 모든 도구는 어떤 목적이든 무료로 사용할 수 있다.
- Android Studio 혹은 IntelliJ IDEA Community Edition은 회사에서도 사용 가능하다.
- 단순 코틀린 문법 테스트라면 https://try.kotlinlang.org/ 에서 테스트 가능하다.
'프로그래밍 > Kotiln' 카테고리의 다른 글
[Kotlin] 4. 변수 (0) | 2020.01.30 |
---|---|
[Kotlin] 3. 함수 (0) | 2020.01.29 |
[Kotlin] 2. 개발환경 구축 (0) | 2020.01.29 |