[Kotlin][Kotlin in action] 1. 코틀린이란?
서론
코틀린은 왜 만들어졌을까?
이런 질문에 대한 답으로 난 처음에, 안드로이드 진영에서 사용하는 JAVA가 오라클의 라이센스 문제로 인해 대체 언어로 만들어졌다라고 답을한적이 있다.
왜그랬을까? 지금생각해보니 참 바보같은 답변이다.
코틀린을 만든 곳은 구글이 아니기 때문이다.
코틀린은 제트브레인이라는 회사에서 만든언어인데, 왜 그리 답변했는지 아직도 부끄러울뿐이다.
코틀린 강의를 처음 듣게 된것은 작년 여름 회사에서 진행했던 코틀린 교육을 들었을때이다.
왠일로 강사들이 만들어주는 PPT 출력물이 아닌 시중에서 판매되는 실제 코틀린 책을 가지고 강의가 진행되었고, 덕분에 책 한권을 다 읽게 되었다.
당시 자바만 해왔던 나에게 코틀린은 신선한 충격을 주었다.
(물론 대학교 2학년때 파이썬을 처음 접했을때만큼은 아니었다.)
자바와 비슷하면서도 다른 문법, 그리고 편리하고 간결한 코드를 작성할 수 있는점... 하지만 그만큼 다양한 문법이 존재하는 점.
일주일간 강의는 잘 들었는데, 실제 현업에서는 아직 코틀린을 쓰지 않고 있었고, 나 역시 사이드 프로젝트에서 이를 활용하지 않았기에 잊혀져 가고 있었다.
그러다가 다시 공부를 하려고 IDE를 열고 코딩을 시작을 하려고 했더니 멍해지는 모습을 보았다.
역시 언어라는 것은 배웠으면 바로바로 써먹어야 내 것이 된다는걸 알게된 순간이었다.
올초 마스크 앱 하나를 코틀린으로 만든적이 있는데, 이 역시 6개월정도가 지나니까 코틀린이 아직도 친숙해지지가 않았다.
그래서 제대로 공부를 다시 해보자는 심정으로 Kotlin In Action 책을 구입했고, 정독을 시작했다.
그리고 이 책의 도입부에 맨처음 내가 말한 질문의 답이 있었다.
앞으로 읽은 내용을 복습하고자 블로그 포스팅으로 정리를 해두려고 한다.
코틀린은 왜 만들어졌는가?
Kotlin in Action 서론에 보면, 대규모 프로젝트에서 발생할 수 있는 프로덕션 문제를 해결하기 위해서 만들어졌다고 나와있다.
2010년 제트브레인스에서는 다양한 언어에 대한 개발 도구인 IDE를 JAVA로 제작하고 있었다고 한다.
하지만 옆팀에선 모던하고 강력하며 빠르게 진화하는 C#으로 개발을 하고 있었고, IDE개발팀은 그게 매우 부러웠다고 한다.
그러나 JAVA를 대체할 언어를 찾지 못했다고 한다.
JAVA를 대체하기 위해서는 다음과 같은 조건들이 필요했다고 한다.
1. 정적 타입 지정 (Static typing) 이 가능해야한다.
2. JAVA와 완벽히 호환되어야 한다.
3. 새로운 언어 개발을 위한 도구개발이 쉬워야한다.
4. 배우기 쉽고, 뜻을 파악하기 쉬운 언어가 필요하다.
변수나 클래스 선언 당에 대해서 컴파일 단계에서 걸러줘야 수백만줄의 코드 베이스를 미치지않고 개발 가능하며,
기존 제트브레인스에서 만든 IDE 코드를 그대로 사용해야 하기 때문에 JAVA와의 호환이 필연적이었고,
IDE 개발 회사다보니 만든언어를 다시 IDE로 제공하기가 쉬워야 했으며,
개발 생산성을 위해서 배우기가 쉽고 뜻을 파악하기 쉬워야 했다.
그래서 코틀린이란 언어가 만들어지게 되었다고 한다.
코틀린은 러시아에 있는 섬 이름인데, 개발팀에 속해있는 개발자들이 거기 섬에 많이 살고 있어서 만들어진 이름이라고 한다.
코틀린이란 무엇인가?
자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어이다.
코틀린의 특성은?
1. 대상 플랫폼은 서버, 안드로이드 등 자바가 실행되는 모든 곳이다.
2. 정적 타입 지정언어이다.
정적 타입 지정이란 모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고, 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해준다는 것을 말한다.
동적 타입 언어는 타입과 관계없이 모든 값을 변수에 넣을 수 있고, 메소드나 필드 검증이 실행 시점에 일어난다.
정적타입 언어의 장점은 다음과 같다.
- 성능이 좋다. (실행 시점에 어떤 메소드를 호출할지 알아내는 과정이 필요없다.)
- 신뢰성이 좋다. (컴파일러가 프로그램의 정확성을 건ㅁ증하기 때문에, 프로그램의 오류를 줄여준다.)
- 유지 보수성이 좋다. (처음 보는 코드더라도, 변수/객체가 어떤 타입인지 알 수 있기 때문에 다루기 쉽다.)
- 도구 지원이 좋다. (안전하게 리팩토링이 가능하고, IDE를 더 잘만들수 있다.)
3. 함수형프로그래밍과 객체지향 프로그래밍을 모두 지원한다.
객체지향이야 JAVA개발자라면 많이 들어봤을 것이고, 함수형 프로그래밍이 다소 생소 할 수 있다.
함수형 프로그래밍의 핵심 개념은 다음과 같다.
- 일급 시민인 함수 (FIrst-class)
함수를 변수에 저장한다던가, 함수를 다른 함수의 인자로 넣는다던가, 함수에서 새로움 함수를 만들어서 리턴한다던가...
위와같이 함수를 일반 값처럼 다룰 수 있다.
- 불변성 (Immutable)
함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해서 프로그램을 작성해야 한다.
- 부수 효과 없음 (Side effect)
입력이 같으면 한상 같은 출력을 내놓아야 하며, 객체의 상태를 변경하면 안되고, 함수 외부나 다른 바깥 환경과의 상호작용을 하지 않는 순수 함수(Pure function)를 사용한다.
함수형 프로그래밍의 장점은 다음과 같다.
- 간결하게 코드 작성이 가능하다.
함수형 코드는 명령형 코드에 비해 간결하며 우아하다. (Rxjava 코드가 좋은 예가 될 것 같다.)
- 멀티 스레드 환경에서 안전하다.
불변 데이터 구조를 사용하고 순수 함수를 그 데이터 구조에 적용하면 다중 스레드환경에서 같은 데이터를 여러 스레드가 변경할 수 없다. 그래서 동기화를 적용하지 않아도 된다.
(구조 잡기가 어려울듯하다)
- 테스트하기가 쉽다.
함수만 테스트하면 되기 때문에 테스트가 쉽다.
코틀린에서는 이런 함수형 프로그래밍을 위해서 여러 문법을 제공한다.
4. 무료 오픈소스이다.
코틀린 언어와 컴파일러, 라이브러리, IDE 모두다 무료다.
가장 큰 특성이다.
코틀린의 철학
코틀린의 철학은 무엇일까
- 실용성
코틀린은 연구를 위한 언어가 아니며, 실제 다양한 프로젝트에 참여해서 실무 경험이 많은 개발자들이 만든 언어로 어떤 문제를 해결할 때, 도움이 될 수 있게끔 설계된 언어이다.
다른 언어가 채택한 이미 성공적으로 검증된 해법과 기능에 의존했기 때문에, 언어의 복잡도가 줄어들고 더 쉽게 배울수가 있다.
어떤 프로그래밍의 스타일이나 패러다임을 사용할것을 강요하지 않는다. 나중에 적응이되면 코틀린스럽게 코드를 짜면된다.
IDE가 잘 제공되고 있다.
- 간결성
프로그램 작성시 의미없이 작성해야하는 부분들은 줄일 수 있다. ( 게터,세터, 생성자 파라미터 등..)
컬렉션 사용등에 대해서 표준 라이브러리를 제공하여, 반복되거나 길어질 수 있는 코드를 줄일 수 있다.
람다식을 제공한다.
간결성을 추구한다고해서 소스코드를 더욱 짧게 한다는 것을 의미하진 않는다.
- 안정성
JVM 에서 돌아가기 때문에 메모리 및 버퍼오버플로우에 대해서 안정하다.
Null Pointer Exception 및 Class cast exception 등을 컴파일 단계에서 방지 할 수 있도록 타입및 문법을 제공한다.
- 상호운영성
자바와 완벽히 호환된다.