1. 코틀린이란 무엇이며, 왜 필요한가?
자바 플랫폼(JVM)에서 돌아가는 새로운 프로그래밍 언어다.
코틀린은
- 간결하고
- 실용적이며
- 상호운영성을 중시하며
- 안전하다.
1.1. 코틀린 맛보기 (p36)
튜토리얼 코드
1.2. 코틀린의 주요 특성 (p37)
1.2.1. 대상 플랫폼 : 서버, 안드로이드 등 자바가 실행되는 모든 곳
코틀린의 주 목적은
- 현재 자바가 사용되고 있는 모든 용도에 적합하면서도
- 더 간결하고
- 생산적이며
- 안전한 대체 언어를 제공하는 것이다.
1.2.2. 정적 타입 지정 언어
자바와 마찬가지로 코틀린도 정적 타입 언어이다.
- 정적 타입 지정
- 모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있음
- 프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해줌
- 동적 타입 지정
- 타입과 관계없이 모든 값을 변수에 넣을 수 있고, 메소드나 필드 접근에 대한 검증이 실행 시점에 일어남
- 그에 따라 코드가 더 짧아지고 데이터 구조를 더 유연하게 생성하고 사용할 수 있음
- 하지만 반대로 이름을 잘못 입력하는 등의 실수도 컴파일 시 걸러내지 못하고 실행 시점에 오류가 발생함
자바와 달리 코틀린에서는 모든 변수의 타입을 프로그래머가 직접 명시할 필요가 없다.
대부분의 경우 코틀린 컴파일러가 문맥으로부터 변수 타입을 자동으로 유추할 수 있기 때문에 프로그래머는 타입 선언을 생략해도 된다.
컴파일러가 문맥을 고려해 변수 타입을 결정하는 이런 기능을 타입 추론(type inference)라고 부른다.
정적 타입 지정의 장점
클래스, 인터페이스, 제네릭스는 모두 자바와 비슷하게 작동한다. 하지만 몇가지 새로운 점이 있다.
그중 가장 중요한 특성은 코틀린이 널이 될 수 있는 타입(nullable)을 지원한다는 점이다.
따라서 NPE가 발생할 수 있는지 여부를 검사할 수 있어서 좀 더 프로그램의 신뢰성을 높일 수 있다.
코틀린의 타입 시스템에 있는 다른 새로운 내용으로는 함수 타입(funciton type)에 대한 지원을 들 수 있다.
1.2.3. 함수형 프로그래밍과 객체지향 프로그래밍
함수형 프로그래밍의 핵심 개념은 다음과 같다.
- 일급 시민(first-class)인 함수
- 함수를 일반 값처럼 다룰 수 있음
- 함수를 변수에 저장할 수 있음
- 함수를 인자로 다른 함수에 전달할 수 있음
- 함수를 새로운 함수를 만들어서 반환할 수 있음
- 불변성(immutabliity)
- 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용
- 부수 효과(side effect) 없음
- 입력이 같으면 항상 같은 출력을 내놓는다.
- 다른 객체의 상태를 변경하지 않는다.
- 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용한다.
함수형 스타일로 프로그램을 작성하면 얻을 수 있는 이득
- 간결성
- 강력한 추상화
- 코드 중복 제거
- 공통 부분을 따로 함수로 뽑아내고 세부 사항을 인자로 전달 가능
- 인자 그 자체가 함수 - 람다 식을 사용하면 간결하게 표현 가능
- 다중 스레드를 사용해도 안전(safe-multithreading)
- 불변 데이터 구조를 사용하고 순수 함수를 그 데이터 구조에 적용한다면
- 같은 데이터를 여러 스레드가 변경할 수 없음
- 따라서 복잡한 동기화를 적용할 필요 없음
- 테스트하기 쉬움
- 부수 효과가 있는 함수는 실행 시 필요한 전체 환경을 구성하는 준비 코드 필요
- 순수 함수는 준비 코드 없이 독립적으로 테스트 할 수 있음
코틀린은 처음부터 함수형 프로그래밍을 풍부하게 지원
- 어떤 함수가 다른 함수를 파라미터로 받거나 함수가 새로운 함수를 반환할 수 있음
- 람다 식을 지원함에 따라 준비 코드를 작성하지 않아도 코드 블록을 쉽게 정의하고 여기저기 전달할 수 있음
- 데이터 클래스는 불변적인 값 객체(value object)를 간편하게 만들 수 있는 구문을 제공
- 코틀린 표준 라이브러리는 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API를 제공
코틀린은 함수형 스타일로 프로그램을 짤 수 있게 지원하지만, 함수형 프로그래밍 스타일을 강제하지는 않음
따라서 명령형 방식이 더 적합한 경우라면 함수형 프로그래밍으로 번거롭게 코드를 작성할 필요 없이 직접 변경 가능한 데이터와 부수 효과를 활용하는 함수를 사용해도 됨
1.3. 코틀린 응용 (p43)
1.3.1. 코틀린 서버 프로그래밍
- 브라우저에 HTML 페이지를 돌려주는 웹 애플리케이션
- 모바일 애플리케이션에게 HTTP를 통해 JSON API를 제공하는 백엔드 애플리케이션
- RPC(원격 프로시저 호출) 프로토콜을 통해 서로 통하는 작은 서비스들로 이워진 마이크로서비스
코틀린의 장점
기존 자바 코드와 매끄럽게 상호운용할 수 있다는 점
1.3.2 코틀린 안드로이드 프로그래밍
- 컨트롤에 리스너를 추가하거나 레이아웃 요소를 필드와 바인딩하는 등의 작업을 훨씬 더 적은 코드로 달성 가능
- 컴파일러가 필요한 코드를 자동 생성해주는 경우도 있음
- 안코(Anko) 라이브러리를 사용하면 수많은 안드로이드 API에 대한 코틀린 어댑터를 제공 받을 수 있음
- 애플리케이션의 신뢰성이 더 높아짐
- 프로세스가 중단됨(Process Hash Stopped) - NPE가 발생한 경우 표시됨
- 코틀린 타입 시스템은 null값을 정확히 추적하며 널 포인터로 인해 생기는 문제를 줄여줌
- 일반적인 자바 코드와 똑같이 효율적으로 실행 됨
- 대부분의 코틀린 표준 라이브러리 함수는 인자로 받은 람다 함수를 인라이닝(inlining, 함수를 함수라는 이름의 몸체의 콜 사이트로 대체하는 수동 또는 컴파일러 최적화 기법) 함.
- 람다를 사용해도 새로운 객체가 만들어지지 않으므로 GC가 늘어나서 프로그램이 자주 멈추는 일도 없음
1.4. 코틀린의 철학(p47)
1.4.1. 실용성
- 다른 프로그래밍 언어가 채택한 이미 성공적으로 검증된 해법과 기능에 의존
- 언어의 복잡도가 줄어들고 이미 알고 있는 기존 개념을 통해 더 쉽게 배울 수 있음
- 특정 프로그래밍 스타일이나 패러다임을 사용할 것을 강제로 요구하지 않음
- IntelliJ Idea와 컴파일러의 개발이 맞물려 이뤄짐
1.4.2. 간결성
- 보통 개발자들은 코드를 새로 작성하는 시간 보다 기존 코드를 읽는 시간이 더 김
- 코드가 더 간단하고 간결할 수록 내용을 파악하기가 더 쉬움
- 자바에 존재하는 여러가지 번거로운 준비 코드를 코틀린은 묵시적으로 제공함
- Getter, Setter, 생성자 파라미터를 필드에 대입하기 위한 로직 등 반복되거나 길어질 수 있는 코드를 라이브러리 함수 호출로 대치 가능
- 람다 지원
- 연산자 오버로딩 지원
1.4.3. 안전성
- 일부 유형의 오류를 프로그램 설계가 원천적으로 방지해준다는 뜻
- 애플리케이션의 타입 안전성 보장
- 자바보다 더 적은 비용으로 타입 안전성 사용 가능
- 실행 시점에 NPE가 발생할 수 있는 연산을 사용하는 코드를 금지
- 코틀린 컴파일러가 타입을 자동으로 추론해줌
- 컴파일 시점 검사를 통해 오류를 더 많이 방지
- 타입 검사와 캐스트가 한 연산자에 의해 이뤄짐
- 어떤 객체를 다른 타입으로 캐스트하기 전에 타입을 미리 검사
- 타입 검사를 생략할 이유가 없고, 검사를 생략하지 않으면 오류가 발생할 일도 없다.
1.4.4. 상호운용성
자바 프로그래머들의 질문 - 기존 라이브러리를 그대로 사용할 수 있느냐?
- YES.
- 코틀린의 클래스나 메소드를 일반적인 자바 클래스나 메소드와 똑같이 사용 가능
- 코틀린은 자바 표준 라이브러리 클래스에 의존
- 자바 API를 호출할 때 객체를 감싸거나 변환할 필요 X, 반대도 마찬가지, 부가 비용 또한 X
- 다중 언어 프로젝트 지원
1.5. 코틀린 도구 사용 (p53)
1.5.1. 코틀린 코드 컴파일
- 자바 소스코드를 컴파일할 때와 마찬가지로 코틀린 소스코드를 분석해서 .class 파일을 만듬
- .class 파일은 애플리케이션의 유형에 맞는 표준 패키징 과정을 거쳐 실행됨
- 컴파일한 코드는 코틀린 런타임 라이브러리에 의존
- 런타임 라이브러리에는 코틀린 자체 표준 라이브러리 클래스와 코틀린에서 자바 API의 기능을 확장한 내용이 들어있음
- 따라서 배포시 런타임 라이브러리도 함께 배포해야 함.
- 컴파일을 위한 Maven, Gradle, Ant 등의 빌드 시스템과 호환됨
1.6. 요약 (p57)
- 코틀린은 타입 추론을 지원하는 정적 타입 지정 언어
- 소스코드의 정확성과 성능을 보장하며 코드 간결하게 유지 가능
- 객체 지향과 함수형 프로그래밍 스타일 모두 지원
- 서버 애플리에키션 개발에 활용
- 자바 프레임워크 완벽 지원
- HTML 생성기, 영속화 등 도구 지원
- 안드로이드 개발에 활용
- 코틀린은 무료이며 오픈소스
- 실용적이며 안전하고, 간결하며 상호 운용성이 좋음
- 일반적인 작업에 대해 이미 잘 알려진 해법을 채택
- NPE와 같이 흔히 발생하는 오류 방지
- 읽기 쉽고 간결한 코드 지원
- 자바와 제약 없이 통합될 수 있는 언어