| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- k8s
- kotlin강좌
- theming
- 안드로이드강좌
- 자바
- 회고
- Gradle
- 코루틴
- 알고리즘
- 디자인패턴
- g 단위테스트
- 스레드
- 책
- 알게되는
- mockito
- android
- Coroutine
- 병렬프로그래밍
- Compose
- viewmodel
- 안드로이드스튜디오
- 안드로이드
- Kotlin
- Rxjava
- 코틀린
- 테스트
- 병럴프로그래밍
- 커스텀상태
- 글또
- ReactiveProgramming
- Today
- Total
선생님, 개발을 잘하고 싶어요.
Kotlin in Action - 1부 1장 - 코틀린이란 무엇이며, 왜 필요한가? 본문
1부의 목표는 기존 API를 사용하는 생산성이 더 높은 코틀린 코드를 이해하게 돕는 것이다.
data class Person( // <- 데이터 클래스
val name: String,
val age: Int? = null // <- nullable 한 타입과 디폴트 파라미터
)
fun main(args: Array<String>) { // <- 최상위 함수
val persons = listOf(Person("영희"),
Person("철수", age = 29)) // <- 이름 붙힌 파라미터
val oldest = persons.maxBy { it.age ?: 0 } // <- 람다, 엘비스 연산자
println("나이가 가장 많은 사람: $oldest") // <- 문자열 템플릿
}
// 결과: 나이가 가장 많은 사람: Person(name=철수, age=29) <- data class의 toString 자동 생성
이 책은 자바 경험이 있는 독자를 대상으로 한다. 그런 사람에게 최적화된 코틀린 맛보기 코드가 아닐 수 없다. 이 짧은 코드에서 볼 수 있는 특징은 하나같이 Java에서 없는 기능으로 이와 같은 프로그램을 Java로 짜려면 파일을 새로 만들고 수많은 getter, setter를 선언하고서야 달성할 수 있는 내용이다. 이 맛보기 코드만 보고도 Java 개발자는 Kotlin에 관심을 가지지 않을 수 없을 것이다.
대상 플랫폼: 자바가 실행되는 모든 곳
지금의 코틀린은 어느 종류의 애플리케이션을 개발해도 사용할 수 있지만 이 책에서는 주로 서버와 안드로이드 개발 언어로써의 코틀린을 다룬다고 한다. 기존에 자바를 사용하여 개발하던 환경에 코틀린을 도입한다면 더 적은 코드로 더 편하게 프로그래머의 목표를 달성할 수 있다.
정적 타입 지정 언어
코틀린은 자바와 마찬가지로 JVM위에서 동작하는 정적 타입 지정 언어다. 정적 타입 언어로써 컴파일러가 문맥을 고려해 변수 타입을 결정하는 타입 추론 기능을 제공한다.
정적 타입 지정의 장점으로는 성능, 신뢰성, 유지 보수성, 도구 지원이 있다.
성능 측면에서 런타임 언어와 다르게 실행 시점에 어떤 메서드를 호출할지 컴파일타임에 알아내므로 메서드 호출이 더 빠르다.
신뢰성 측면에서 컴파일러가 프로그램의 정확성을 검증하므로 실행 시 프로그램이 오류로 중단될 가능성이 더 적다.
유지 보수성측면에선 코드만 봐도 이미 객체가 어떤 타입에 속하는지 알 수 있으므로 처음 보는 코드를 다룰 때도 더 쉽다.
도구 지원을 충분히 활용할 수 있다. 정확한 코드 자동 완성, IDE의 다양한 리팩터링 기능을 활용하기 쉽다.
코틀린의 타입 시스템에는 자바에서도 볼 수 있듯 클래스, 인터페이스, 제네릭을 지원한다. 그 외에 추가적으로 지원하는 중요한 특성은 널이 될 수 있는 타입(nullable 타입) 함수 타입등이 있다.
함수형 프로그래밍과 객체지향 프로그래밍
함수형 프로그래밍의 핵심 내용은 다음과 같다.
- 일급 객체인 함수: 함수를 일반 값처럼 다룰 수 있다. 함수를 변수에 저장하고 함수에 전달하거나 반환할 수 있다.
- 불변성: 만들어지고 나면 내부 상태가 절대로 바뀌지 않는다.
- 부수 효과 (Side Effect) 없음: 입력이 같으면 항상 같은 출력을 한다. 다른 객체의 상태를 변경하지 않는다.
이러한 함수형 스타일로 작성하면 장점은
- 간결성, 강력한 추상화를 사용해 코드 중복을 막는다. 코틀린에서 쉽게 제공되는 람다 식을 활용하여 간결하게 표현할 수 있다.
- fun findAlice() = findPerson { it.name == "Alice" } fun findBob() = findPerson { it.name == "Bob" }
- 다중 스레드를 사용해도 안전하다. 불변 데이터 구조와 순수 함수를 활용하면 다중 스레드 환경이라도 같은 객체를 여러 스레드가 변경할 수 없다. 불변 데이터는 변경이 안되고 순수 함수는 다른 객체의 상태를 쓰지 않으므로 당연하다.
- 부수 효과가 없는 순수 함수이기에 테스트하기 쉽다.
코틀린은 처음부터 이러한 함수형 프로그래밍을 풍부하게 지원한다.
- 함수 타입 지원
- 람다 식 지원, 코드 블록을 쉽게 정의하고 전달할 수 있다.
- 데이터 클래스 지원으로 불변적인 값 객체를 쉽게 만듬
- 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 표준 API 제공
하지만 개발자는 동시에 코틀린은 함수형 스타일을 강제하지 않기에 객체지향과 함수형 접근 방법을 조합해서 문제에 가장 적합한 도구를 사용하면 된다.
코틀린 안드로이드 프로그래밍
코틀린은 디폴트로 자바 8과 호환된다. 따라서 호환성 관련한 새로운 문제를 야기하지 않는다.
- 코틀린이 제공하는 새로운 언어 기능을 사용해도 최신 안드로이드가 탑재되지 않은 디바이스에서도 동작한다.
- 코틀린 컴파일러가 생성한 바이트코드는 자바 코드와 같이 효율적으로 실행되므로 성능 측면 손해가 없다.
- 코틀린 표준 라이브러리 함수는 인자로 받은 람다 함수를 인라이닝한다. (인라이닝 → 람다로 인한 새로운 객체 생성을 안해도 된다. → 객체 증가 방지 및 GC 부하 줄임)
코틀린의 철학
- 실용성
- 코틀린은 실험적 언어가 아니다. 다른 프로그래밍 언어가 채택한 이미 성공적으로 검증된 해법과 기능에 의존한다.
- 특정 프로그래밍 스타일이나 패러다음을 사용할 것을 강제로 요구하지 않는다.
- 인텔리제이 IDE 개발과 컴파일러 개발이 맞물려 이뤄진다. 코틀린 언어의 특성은 항상 도구의 활용을 염두에 두고 설계됐다.
- 간결성
- 언어가 간결하다는 뜻은? → 코드를 읽을 때 의도를 쉽게 파악할 수 있는 구문 구조를 제공하고, 의도를 달성하는 방법을 이해할 때 방해가 되는 부가적인 준비 코드가 적다는 뜻이다.
- 게터, 세터, 생성자 파라미터 등 자바에 존재하는 번거로운 보일러플레이트 코드를 코틀린은 묵시적으로 제공한다.
- 다양한 표준 라이브러리를 제공한다.
- 간결하다는 게 짧다는 의미는 아니다. 짧게 작성하는 것은 코틀린의 설계 철학이 아니다.
- 간결하면 쓰는 데 시간이 덜 걸리고 읽는 데도 시간이 덜 걸린다.
- 안정성
- 언어가 안전하다는 말은? → 프로그램에서 발생할 수 있는 오류 중에서 일부 유형의 오류를 프로그램 설계가 원칙적으로 방지한다는 뜻이다.
- JVM을 사용하여 메모리 안정성 확보, 버퍼 오버플로 방지, 동적으로 할당한 메모리를 잘못 사용하여 발생하는 다양한 문제를 예방
- 정적 타입 지정 언어로써 애플리케이션의 타입 안정성을 보장
- 기존 런타임에 발생하던 NullPointerException, ClassCastException을 줄이기 위해서 노력한다.
- Nullable Type을 제공하여 NullPointerException이 발생할 수 있는 잠재적 코드를 원천적으로 막는다.
- 타입 검사와 캐스트를 한 연산에서 수행하는 등 스마트 캐스팅을 활용해서 부주의한 ClassCastException을 예방한다.
- 상호운용성
- 코틀린은 자바와 코틀린 소스 파일이 임의로 썪여 있어도 제대로 프로그램을 컴파일 할 수 있다.
코틀린 코드 컴파일
.kt 파일 을 컴파일하여 .class 파일을 생성한다. 개발 중인 애플리케이션 유형에 맞는 표준 패키징 과정을 거친다(.jar 파일). 코틀린으로 컴파일한 애플리케이션을 배포할 때는 런타임 라이브러리도 함께 배포해야한다.
'일상 > 책 리뷰' 카테고리의 다른 글
| Kotlin in Action - 1부 2장 - 코틀린 기초 (0) | 2022.05.17 |
|---|---|
| 달러는 왜 비트코인을 싫어하는가? (6) - 자본주의 정보체계 (0) | 2022.05.16 |
| 달러는 왜 비트코인을 싫어하는가? (5) - 화폐와 시간선호 (0) | 2022.05.14 |
| 달러는 왜 비트코인을 싫어하는가? (4) - 정부화폐 (0) | 2022.05.14 |
| 달러는 왜 비트코인을 싫어하는가? (3) - 금속화폐 (0) | 2022.05.14 |