-
[Kotlin In Action] Chapter 1Dev/Kotlin 2020. 12. 30. 17:45
* 해당 포스트는 "Kotlin In Action" 책을 읽고 난 이후의 정리 내용입니다.
자세한 내용은 "Kotlin In Action" 책을 통해 확인해주세요.
Kotlin: 간결하고(Concise), 안전하고(Safe), 실용적이고(Pragmatic), Java와의 상호 운용성에 집중한 프로그래밍 언어
Server Side, Android 애플리케이션, 그 외 등 Java로 개발할 수 있는(혹은 개발 중인) 거의 모든 영역에서 사용 가능
Java와 동급의 성능으로 현존하는 Java의 라이브러리/프레임워크들을 사용할 수 있음
A taste of Kotlin
Kotlin이 어떤 모습인지 정의하기 위한 간단한 예제
(예제는 간단히 Kotlin Playground: Edit, Run, Share Kotlin Code Online (kotlinlang.org)에서 실행해볼 수 있음)
Person
"Data" Class
name: String Type, Null value 없음
age: Int Nullable Type(Int?), Int? = null은 기본값이 null임을 의미(구체화하지 않으면 null)
main function
Top-level Function(가장 먼저 실행되는 Root Function)
Kotlin의 주요 특징
1) 대상 플랫폼(Server Side, Android, Java가 실행되는 모든 영역)
Kotlin의 주요 목적
현재 Java가 사용되고 있는 환경에서의 더 간결하고, 더 생산적이고, 더 안전한 대안
Kotlin을 사용하는 가장 일반적인 영역
- 서버 사이드 코드 개발(웹 애플리케이션의 백엔드 등)
- 안드로이드 위에서 구동되는 모바일 애플리케이션 개발
가능한 영역
Multi-OS Engine -> iOS 기기에서 Kotlin 코드 사용 가능해짐
Multi-OS Engine - Multi-OS Engine (multi-os-engine.org)
PC 애플리케이션 사용: Kotlin + TornadoFX, JavaFX
GitHub - edvin/tornadofx: Lightweight JavaFX Framework for Kotlin
JavaScript로도 컴파일될 수 있음 -> 책에선 다루지 않을 예정
2) 정적 타입 언어
Java와 마찬가지로 Statically typed 프로그래밍 언어
(컴파일 시간에 모든 표현들에 대한 타입이 알려지고 유효성 체크가 이루어짐)
🛑Groovy, JRuby와 같은 Dynamically Typed 언어
컴파일 시간에 type 체크를 하지 않기 때문에(Runtime에 결정됨) 유연성을 높일 수 있고 코드의 길이를 줄일 수 있음
반대로 Type 체크를 미리 하지 않기 때문에 Runtime에서 Type 에러가 나는 것을 미리 방지할 수 없음
Java와는 반대로 변수 선언 시에 Type을 따로 선언하지 않아도 됨
대부분의 경우에서 변수의 타입은 Context에서 자동으로 결정됨(Type 선언 생략 가능)
1val x = 1cs x의 Type은 컴파일 시간에 Int 형태로 결정됨(Type Inference, 유형 추론)
정적 타입 언어의 장점
- Performance: Method들의 호출이 빨라짐(Runtime에 어떤 Method들이 호출될 지 찾을 필요가 없기 때문)
- Reliability: 컴파일러를 통해 정확성을 확인하기 때문에 Runtime에서의 충돌 가능성이 낮음
- Maintainability: 코드가 어떤 종류의 객체로 작업하는지를 확인할 수 있기 때문에 유지보수에 유리
- Tool Support: 정적 Typing을 통해 안정적 refactoring, 정확한 코드 완성, 기타 IDE 기능 사용 유리
Java와 유사한 컨셉들(Class, Interface, Generic)이 많기 때문에 Kotlin에서 더 편안하게 적응 가능
Kotlin은 Nullable Type을 지원: 컴파일 시간에 Null pointer exception들을 탐지할 수 있는 더 신뢰성있는 언어
3) Functional and Object-oriented
함수형 프로그래밍의 컨셉
- 일급 객체 함수들: value에 함수들을 사용(행위를 Object에 매핑)할 수 있음. Ex: 함수들을 변수들로 활용, parameter로 함수를 던짐, 다른 함수들에서 반환값으로 사용 가능
- 불변성: 데이터의 값을 바꾸는 게 아닌, 새로운 데이터를 만들어 변경을 처리(생성 이후에는 상태가 변하지 않음을 보장)
- Side Effects 없음: 순수 함수들(같은 값을 Input으로 넘겼을 경우 항상 같은 결과값 보장)을 보장, 다른 Object들의 상태를 수정하거나 외부와 상호작용하지 않음
장점
1️⃣Conciseness: 함수형 코드는 명령형 코드에 비해 더 우아하고 간결할 수 있음(함수를 값으로 사용해 훨씬 더 많은 추상화 기능을 제공 -> 코드 중복 피함)
Ex: 아래의 코드에서 findAlice와 findBob은 유사한 작업을 구현하지만 세부사항(Target)이 다르다. 이 때, 논리의 공통 부분을 함수로 추출->다른 부분을 인수로 전달 가능하다. 람다 식이라는 익명 함수를 사용해 간결하게 짜는 것이 가능.
2️⃣ Safe Multithreading: 변경 불가능한 데이터 구조와 Pure Function을 사용해 멀티쓰레딩 프로그램에서 작업을 수행하는 경우 안전하지 않은 수정/변경이 발생하지 않도록 보장 가능(Scala의 경우도 동일)
3️⃣ Easier Testing: 사이드 이펙트들이 없는 함수들은 의존관계로 연계된 모든 환경에 대해 setup 코드들(Object 생성자 등)과 관계 없이 고립된 환경에서 테스트를 수행할 수 있음
Kotlin은 태생부터 Functional Programming을 지원하는 다양한 기능들이 존재
- Function Types: Function이 다른 Function을 parameter로 받거나 return하도록 허용
- 람다 식: 최소한의 상용구로 코드 블록 전달
- Data Class: 불변값 객체들을 생성하기 위한 간결한 구문 제공
- Functional Style의 Objects, Collections 작업을 위한 표준 라이브러리 내의 풍부한 API 세트
Functional Programming을 활용할 수는 있지만 강제사항은 아님
Object-Oriented Style로 작업을 수행하는 것도 당연히 가능하다.
4) Free and Open source
Compiler, 라이브러리, 모든 관련 도구들을 포함해 완전한 오픈 소스, 모든 용도로 무료 사용 가능
개발 중인 Kotlin 언어 Github: github.com/jetbrains/kotlin
IntelliJ IDEA Community Edition, Android Studio, Eclipse에서 완벽 지원(IntelliJ IDEA Ultimate에서도 작동, 유료)
Kotlin 애플리케이션들
주로 사용되는 영역: Server Side, Android Apps 개발
1) Kotlin on the server side
유형
- HTML 페이지를 브라우저로 반환하는 웹 애플리케이션
- HTTP를 통해 JSON API를 표현하는 모바일 애플리케이션의 백엔드
- RPC 프로토콜을 통해 다른 마이크로 서비스와 통신하는 마이크로 서비스
수년~수십년 간 Java로 해당 유형들의 애플리케이션들이 구축되어 왔음.
(대부분 확장/개선/교체되는 기존 시스템이 있음)
새 코드는 수 년전 작성됐을 수 있는 기존 부분과 통합되어야 함
Kotlin: Java와의 원활한 상호 운용성을 바탕으로 Java Class를 확장하거나 메소드/필드에 주석을 추가하거나 하는 등의 작업에서의 문제가 발생하지 않음.
Builder Pattern 등을 지원
Template Language를 나눌 필요가 없음(Persons List를 HTML 태그로 변환)
DSL: Exposed 프레임워크를 통해 사용 가능
위의 예시는 Kotlin 코드를 통해 Database에 Query를 수행하는 과정
2) Kotlin on Android
Enterprise Application에 비해 훨씬 작고, 기존 코드에 대한 통합에 덜 의존적
다양한 장치에서의 안정적인 작동 보장 + 신속하게 제공되어야 함
버튼 추가 + 클릭 시 text 출력되도록 설정된 vertical Layout
Kotlin의 철학
위의 내용과 중복되는 내용이 많아 짧게 표현함
1) Pragmatic
특정 프로그래밍 스타일/패러다임 사용 강요 X
IntelliJ IDEA Plugin: Compiler와 함께 개발됨(언어 기능->tool을 염두에 두고 설계됨) => 실용성 높아짐
2) Concise
코드가 더 간결해질 수록 구조/상황에 대해 더 빨리 이해할 수 있음
(getter, setter, constructor 등의 Standard java 상용구들은 암시되어 있음)
3) Safe
Null Pointer Exception 등의 에러들을 방지하기 위한 설계가 들어있음
4) Interoperable
기존 Java 라이브러리들 사용 가능
(Method 호출, Class 확장, 인터페이스 구현, Kotlin 클래스에 Java annotation 적용 등의 작업 가능)
Java에서 Kotlin 코드 호출 가능(JavaToKotlin 변환기)
Kotlin IDE에서 사용 가능한 것
- 자바와 Kotlin 소스 파일간에 자유롭게 탐색
- 혼합 언어 프로젝트 디버그 및 다른 언어로 작성된 코드 접근
- 자바 메소드를 리팩터링하고 Kotlin 코드에서 사용을 올바르게 업데이트 및 반대로 적용 가능
Kotlin tools 사용
Java와 마찬가지로 Kotlin은 컴파일 언어(실행하기 위해서는 컴파일해야 함)
빌드는 다음 사진과 같이 진행됨
Kotlin Compiler는 .kt 파일들을 .class 파일로 변환 -> 코틀린 런타임 라이브러리에 의존해 앱 실행
(배포 시 런타임 라이브러리도 함께 배포해야 함)
'Dev > Kotlin' 카테고리의 다른 글
[Kotlin In Action] Chapter 5 - Programming with lambdas (0) 2021.01.16 [Kotlin In Action] Chapter 3 - Defining and calling functions (0) 2021.01.09