package chapter1
// 데이터 클래스
data class Person(val name: String,
val age: Int? = null) // Int? < nullable default null
// 최상위 main
fun main(args: Array<String>) {
val persons = listOf(
Person("영희"),
Person("민수", 25),
Person("철수", age = 29) // 이름 붙인 파라미터
)
// it을 사용하면 파라미터 명을 정의하지 않아도 람다식의 유일한 인자를 사용할 수 있다.
val oldest = persons.maxByOrNull { it.age ?: 0 } // 책에는 maxBy 였으나 deprecated 여서 maxByOrNull 로 사용
val youngest = persons.minByOrNull { it.age ?: 0 } // 책에는 maxBy 였으나 deprecated 여서 maxByOrNull 로 사용
println("나이가 가장 적은 사람 : $youngest")
println("나이가 가장 많은 사람 : $oldest")
}
maxByOrNull
: max 값을 가진 데이터 찾기minByOrNull
: min 값을 가진 데이터 찾기람다식
에서 it
을 사용할 경우 유일한 인자를 사용할 수 있다.엘비스연산자
라고 불리는 ?:
는 null 인경우 0을 반환하고 그렇지 않은경우 값을 반환한다코틀린의 주목적은 자바가 사용되고 있는 모든 용도에 적합하면서도 더 간결하고 생산적이며 안전한 대체 언어를 제공하는 것
정적타입 장점
1.성능
: 실행 시점에 어떤 메서드를 호출할지 알아내는 과정이 필요 없으므로 메서드 호출이 더 빠르다
2.신뢰성
: 컴파일러가 프로그램의 정확성을 검증하기 때문에, 실행 시 프로그램이 오류로 중단될 가능성이 더 적어진다
3.유지 보수성
: 코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있기 때문에 처음 보는 코드를 다룰 때도 더 쉽다
4.도구 지원
: 더 안전하게 리팩토링 할 수 있고, 더 정확한 코드 완성 기능을 제공할 수 있다.
정적타입
지정 언어이다.변수의 타입
을 프로그래머가 직접 명시할 필요가 없다
타입추론
으로 코틀린 컴파일러
가 문맥으로부터 변수 타입을 자동으로 유추
할 수 있다.클래스
, 인터페이스
, 제네릭
이 자바와 비슷하게 동작한다널이 될 수 있는 타입(nullable type)
을 지원한다컴파일
시점에서 NPE를 검사
할 수 있어서 신뢰성을 높힐 수 있다.함수타입
을 지원한다함수형 프로그래밍의 핵심 개념
일급시민 함수(first-class)
함수
를 일반 값
처럼 다룰 수 있다변수에 저장
할 수있고, 인자로 다른 함수에 전달
가능, 함수에서 새로운 함수를 만들어 반환
가능불변성(immutability)
부수 효과 없음
순수 함수
를 사용함수형 스타일 프로그램의 장점
간결성
간결하며 우아
하다더 강력한 추상화
를 할 수 있다코드 중복을 막을 수 있다
다중 스레드를 사용해도 안전하다 (Safe multithreading)
불변 데이터 구조
를 사용하고, 순수함수
를 그 데이터 구조에 적용한다면 다중 스레드 환경
에서 같은 데이터
를 여러 스레드가 변경할 수 없다
테스트에 용이하다
부수 효과가 있는 함수
는 그 함수를 실행할 때 필요한 전체 환경을 구성하는 준비코드가 따로 필요하지만, 순수 함수
는 그런 준비 코드 없이 독립적으로 테스트
할 수 있다.코틀린의 함수형 프로그래밍 지원
다른 함수
를 파라미터로 받을 수 있다
함수
가 새로운 함수를 반환
할 수 있다람다식을 지원
함으로써 코드 블록을 쉽게 정의하고 전달
할 수 있다데이터클래스
는 불변적인 값 객체
를 간편하게 만들 수 있는 구문을 제공한다코틀린 표준 라이브러리
는 객체
와 컬렉션
을 함수형 스타일
로 다룰 수 있는 API를 제공
한다코틀린은 함수형 스타일로 프로그래밍을 짤 수 있게 지원하지만, 함수형 프로그래밍 스타일을 강제하지는 않는다.
자바코드
와 상호운용
할 수 있다는 점이 코틀린의 가장큰 장점이다새로운 컴포넌트
를 작성하거나, 기존 서비스 코드
를 코틀린으로 이식
해야 하는 경우에 모두 잘 들어맞는다메서드
나 필드
에 특정 (자바)어노테이션
을 붙여야 하는 경우에도 문제가 없다코드는 간결
해지고, 신뢰성
은 높아지며, 유지보수
는 쉬워진다빌더패턴
을 활용하면 간결한 구문을 사용해 객체로 이뤄진 그래프를 쉽게 구축하면서도 코틀린이 제공하는 완전한 추상화와 코드 재활용을 지속적으로 누릴 수 있다새로운 언어의 문법을 익힐 필요도 없다
코틀린의
DSL
(DSL: Domain-Specific Languages)
영속성 프레임워크
를 들 수 있다익스포즈드(Exposed)
F/W는 SQL 데이터베이스의 구조를 기술할 수 있는 읽기 쉬운 DSL을 제공한다
모바일 애플리케이션
은엔터프라이즈 애플리케이션
보다 더 작고 기존 코드 기반과 새 코드를 통합할 필요도 더 적다- 더 다양한 디바이스에 대해
신뢰성을 보장
하면서빠르게 개발 배포할 필요
가 있다
3.코틀린 언어의 특성
과안드로이드 f/w의 특별한 컴파일러 플러그인
지원을 조합하면 개발의 생산성을 높일 수 있다
신뢰성
이 높아진다코틀린 타입 시스템
은 null 값을 정확히 추적
하며 널 포인트로 인해 생기는 문제를 줄여준다자바
에서 NPE
를 일으키는 코드는 대부분 코틀린에서는 컴파일도 되지 않는다
성능
측면에서도 손해가 없다
(자바와 효율 같음)코틀린의 런타임 시스템
은 상당히 작기때문에
, 패키징한 애플리케이션 크기도 자바 애플리케이션에 비해 그리 많이 늘어나지 않는다
대부분 코틀린 표준 라이브러리 함수
는 인자로 받은 람다 함수
를 인라이닝(inlining)
한다인라이닝(inlining)
은 함수를 함수라는 이름의 몸체의 콜 사이트로 대체하는 수동 또는 컴파일러 최적화 기법이람다
를 사용해도 새로운 객체가 만들어지지 않으므로
객체 증가로 인해 GC이 늘어나서 프로그램이 멈추는 일도 없다
코틀린은 자바와의 상용운용성에 초점을 맞춘 실용적이고 간결하며 안전한 언어다.
코틀린 설계는 대규모 시스템을 개볼해본 IT업계 경험을 바탕으로 이루어졌으며, 코틀린 커뮤니티 내부의 개발자들이 코틀린 초기 버전을 사용ㅇ하면서 전달한 피드백이 최정 버전에 반영돼 있다.
코드가 더 간단하고 간결할수록 내용을 파악하기가 더 쉽다
- 프로그래밍 언어가 안전하다는 말은 오류 중에서 일부 유형의 오류를 프로그램 설계가 원천적으로 방지해준다는 뜻이다.
- 단, 어떤 언어도 발생할 수 있는 모든 오류를 막을 수는 없다
- 더 큰 안정성을 얻기 위해서는 프로그램에 더 많은 정보를 덧붙여야 하므로, 생산성이 하락하는 것을 감수해야 하며 안전성과 생산성 사이에는 트레이드오프 관계가 성립한다
val s: String? = null // null 가능
val s2: String = "" // null 불가
if (value is String) // 타입 검사 및 캐스팅
println(value.toUpperCase()) // 타입의 메서드 사용
상호운용성과 관련해 자바 프로그래머들이 던지는 첫 번째 질문은 아마도 '기존 라이브러리를 그대로 사용할 수 있느냐' 일 것이며, 코틀린의 경우는 물론 사용 가능하다
다른 JVM 언어와 달리 코틀린은 상호운용성 측면에서 훨씬 더 많은 것을 제공한다
기존 자바 라이브러리를 가능하면 최대한 활용한다
코틀린이 제공하는 도구도 다중 언어 프로젝트를 완전히 지원한다