# Kotlin in action

코틀린, 왜 필요한가?
코틀린의 주요 특성 1. 정적 타입(statically typed) 지정 언어 모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고 프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해준다. 자바와의 차이점 대부분의 경우 코틀린 컴파일러가 문맥으로부터 변수 타입을 자동으로 유추할 수 있기 때문에 프로그래머는 타입 선언을 생략해도 된다. ex) var x = 1의 변수 타입이 Int 타입임을 추론해준다. 정적 타입 지정의 장점 1) 성능 실행 시점의 어떤 메소드를 호출알지 알아 메소트 호출이 더 빠르다. 2) 신뢰성 컴파일러가 프로그램의 정확성을 검증하기 때문에 실행 시 프로그램 오류로 중단될 가능성이 적다. 3) 유지 보수성 코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있기 때문에 처음 보는 코드를 다룰 때도 쉽다. 4) 도구 지원 더 안전하게 리팩토링 할 수 있고, 도구는 더 정확

Kotlin in action 1장 정리 - 코틀린이란 무엇이며, 왜 필요한가?
Kotlin in action 1장 코틀린이란 무엇이며, 왜 필요한가? 1. 코틀린의 특징 타입 추론을 지원하는 정적 타입 지정 언어이다.  컴파일러가 코드 실행 전에 변수의 타입을 검증하여 옳은 타입인지 컴파일 시간에 확인하는 언어를 정적 타입 지정 언어라고 한다.   정적 타입 지정 언어 중 하나인 자바의 경우 코드 내에 모든 변수의 타입을 적어 컴파일러에게 해당 변수의 타입을 알려준다.  하지만 코틀린의 경우, 모든 변수에 대해 타입을 지정할 필요가 없다. 코틀린은 타입을 지정하지 않아도 알 수 있는 타입에 대해 변수의 타입을 추론해주는 타입 추론 기능을 제공한다. 따라서 불필요한 타입 선언을 생략할 수 있으며 코드를 간결하게 유지할 수 있다.   아래 예시와 같이 코틀린에서는 리턴 타입이나 같은 타입끼리의 덧셈과 같이 누가 봐도 예측할 수 있는 타입에 대해서는 타입 지정을 생략할 수 있다.(물론

Kotlin in Action 2장
기본 요소 : 함수와 변수 > Hello, World! 간단한 코드에서 코틀린의 여러가지 특성을 볼수 있다. 함수를 선언할 때 fun 키워드를 사용한다. 파라미터 이름 뒤에 그 파라미터의 타입을 쓴다. 함수를 최상위 수준에 정의할 수 있다. (자바와 달리)꼭 클래스 안에 함수를 넣어야 할 필요가 없다. 배열도 일반적인 클래스와 마찬가지다. 코틀린에는 자바와 달리 배열 처리를 위한 문법이 다로 존재하지 않는다. System.out.println 대신에 println이라고 쓴다. 코틀린 표준 라이브러리는 여러 가지 표준 자바 라이브러리 함수를 간결하게 사용할 수 있게 감싼 래퍼를 제공한다. println도 그런 함수 중 하나다. 최신 프로그래밍 언어 경향과 마찬가지로 줄 끝에 세미콜론(;)을 붙이지 않아도 좋다. > 함수 함수의 선언은 fun 키워드로 시작한다. fun 다음에는 함수 이름이 온다. 예제는 max라는 이름의 함수다. 함수 이름 뒤

Kotlin in Action 1장
코틀린은 무엇인가? 텍스트코틀린은 자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어이다. 코틀린은 간결하고 실용적이며, 자바 코드와의 상호운용성을 중시한다. 코틀린은 기존 자바 라이브러리나 프레임워크와 함께 잘 작동한다. 코틀린 맛보기 엘비스 연산자라고 부르는 ?:는 age가 null인 경우 0을 반환하고, 그렇지 않은 경우 age의 값을 반환한다. 영희의 나이를 지정하지 않았기 때문에 철수가 가장 나이가 많은 사람으로 선정된다. 코틀린 주요 특성 코틀린의 주목적은 현재 자바가 사용되고 있는 모든 용도에 적합하면서도 더 간결하고 생산적이며 안전한 대체 언어를 제공하는 곳이다. 서버상의 코드 안드로이드 디바이스에서 실행되는 모방리 애플리케이션 코틀린은 개발 과정에서 수행해야 하는 모든 과업에 있어 폭넓게 생산성을 향상시켜준다. 자바와 마찬가지로 코틀린도 정적 타입 지정 언어다. 정적 타입 지정이라는 말은 모든 프로그램 구성
[Kotlin In Action] 6-1) null 가능성(nullability)과 safe call, 엘비스(elvis) 연산자
개요 널 가능성(nullability)은 NullPointerException(NPE) 오류를 피하는데 도움이 되는 코틀린 타입 시스템의 특성이다. null이 될 수 있는지 여부를 타입 시스템에 추가함으로써 컴파일러가 미리 null 문제를 감지하여 실행 도중의 NPE 발생 가능성을 줄일 수 있다. null이 될 수 있는(nullable) 타입 코틀린의 타입 시스템은 자바와 달리 null이 될 수 있는 타입과 없는 타입을 명시적으로 구분한다. 둘은 같은 문자열이지만 위에 변수엔 null을 저장할 수 없고, 아래는 가능하다. 이처럼 어떤 타입이든 뒤에 ?를 붙이면 변수에 그 타입 객체와 null을 저장할 수 있으며, nullable 타입이라고 한다. nullable 타입의 제약 nullable 타입엔 제약 사항이 있다. 일반적인 방식으로 프로퍼티나 함수를 호출할 수 없고, non-null 타입의 변수나 파라미터에 대입할 수도 없다. 따
[Kotlin In Action] 5-7) 람다와 함수형(SAM) 인터페이스
코틀린에서 람다를 활용하면 간결한 코드를 작성할 수 있다. 하지만 우리가 사용하는 많은 API는 자바로 작성되어 있다. 그리고 다행스럽게도 자바 API 호출에 여전히 람다를 사용할 수 있다. 어떻게 그것이 가능할까? 함수형 인터페이스 (SAM 인터페이스) Button 클래스는 setOnClickListener 메서드를 사용해 버튼의 리스너를 설정한다. 이때 인자의 타입은 OnClickListener다. OnClickListener 인터페이스는 아래처럼 onClick 메서드 하나만 선언된 인터페이스이다. 자바에서는 setOnClickListener 메서드에 인자를 넘기기 위해 아래처럼 무명 클래스 객체를 만들어야 했다. 하지만 코틀린에서는 무명 클래스 객체 대신 람다를 넘길 수 있다! 람다는 추상 메서드 onClick과 같은 변수 타입을 갖는다. 이런 코드가 동작하는 이유는 OnClickListener에 추상 메서드가 하나만 있기 때문이다. 이
[Kotlin In Action] 5-6) Sequence: 컬렉션 지연(lazy) 연산
컬렉션 함수를 사용하면 간결하고, 효율적이고, 이해하기 쉬운 코드를 만들 수 있다. 또한, 컬렉션 함수는 아래처럼 연쇄 호출(method chaining)을 할 수 있다. 하지만 단점이 없는 건 아니다. 연쇄 호출을 하면 매번 중간(임시) 컬렉션을 생성한다. 위 예시에서 filter, map의 결과로 컬렉션 객체가 2개 생성된다. 이것은 원소의 수가 수십만 개 이상일 때 효율을 떨어뜨린다. 이러한 상황을 효율적으로 바꾸고 싶으면 컬렉션을 직접 사용하는 대신 시퀀스(Sequence)를 사용해야 한다. 시퀀스 (Sequence) 위 코드는 이전 예시의 시퀀스 사용 버전이다. 시퀀스를 사용하면 중간 컬렉션이 생성되지 않아서 원소가 많을 때 성능이 매우 좋아진다. 시퀀스란 시퀀스(Sequence)는 기본적으로 인터페이스이다.* 시퀀스 자체는 자신이 갖고 있는 데이터를 순서대로 반환할 수 있는 데이터 타입*임을 의미한다. 인터페

Kotlin in Action - Chapter3) Defining and calling functions
코틀린의 collections 코틀린의 collection 클래스들은 자바의 표준 collection 클래스들을 그대로 사용한다. (자바와의 상호호환에서 이점을 갖기 위해서이다.) 따라서 코틀린은 자체적 collection 클래스를 갖지 않는다. 하지만 코틀린의 collections는 자바의 collections 보다 부가적인 기능을 갖는다. 예를 들어 코틀린에선 collection의 마지막 요소나 최대 값을 갖는 요소를 바로 얻을 수 있다. 이번 챕터에서는 이러한 부가 함수들이 어떻게 지원되는지 알아보고자 한다. 코틀린의 함수 특정 collection의 요소들을 문자열 형태로 반환하는 함수 joinToString()을 만든다고 가정해보자. (*참고로 joinToString()은 코틀린에서 제공하는 내장 함수이다.) 초기 구현은 다음과 같다. 위 함수의 호출은 다음과 같을 것이다. 이 자체로도 문제는 없지만, 코틀린의 여러 기능을 활용하면 훨씬 가
[Kotlin In Action] 5-4) 멤버 참조
람다를 사용하면 원하는 동작을 정의하고 함수에 인자로 전달할 수 있다. 그런데 원하는 동작이 이미 함수로 정의되어 있으면 어떡할까? 물론 그 함수를 호출하는 람다를 정의하면 되지만 그것은 함수 중복이다. 함수를 직접 넘길 순 없을까? 가능하다. 왜냐면 코틀린은 함수를 값처럼 다룰 수 있기 때문이다. 이중 콜론(::)을 사용하여 함수에 대한 참조를 가져올 수 있다. 이러한 문법을 멤버 참조라고 한다. 멤버 참조는 클래스(or인스턴스)에 접근하여 하나의 프로퍼티나 메서드에 대한 참조 값을 만들어준다. 참조된 멤버는 함수 호출 형태로 사용 재밌는 점은 메서드 참조, 프로퍼티 참조 모두 함수 호출 형태로 사용한다는 것이다. age 프로퍼티에 접근하는 멤버 참조 getAge에 괄호를

[Kotlin In Action] 5-3) 람다의 변수 포획
람다의 변수 포획 람다를 함수 안에서 정의하면 람다의 파라미터뿐 아니라 람다 앞에서 정의된 함수의 지역 변수까지 람다 안에서 사용할 수 있다. 자바와 다른 점은 final이 아닌 변경 가능한 외부 변수에도 접근 및 변경이 가능하다는 것이다. 예시를 보기 위해 forEach 함수를 사용해보자. forEach는 컬렉션(문자열, 배열도 가능)의 모든 원소에 대해 람다 식을 호출한다. 일반적인 for문과 같지만 좀 더 간결하다. 예시를 살펴보자. 위 함수는 문자열에서 '*'의 개수를 센다. 람다 밖의 final이 아닌 지역 변수 count에 접근하여 값을 변경한다는 점에 주목하자. 이와 같이 람다 안에서 사용되는 외부 변수를 람다가 포획(capture)한 변수라고 한다. 변수 포획 방식 기본적으로 지역 변수의 생명주기는 함수가 반환되면 끝난다. 하지만 **함수가 자신의 로컬 변수를 포획한 람다를 반환하면 함수와 지역 변수의 생명주기가 달라질 수 있다

[Kotlin In Action] 5-2) 람다 식의 문법
람다는 값처럼 여기저기 전달할 수 있는 코드 블록이다. 변수에 저장할 수도 있지만, 대부분 함수에 인자로 넘길 때 그 자리에서 람다를 정의하는 경우가 대부분이다. 아래는 람다 식의 형태이다. 코틀린의 람다는 중괄호로 둘러쌓여 있다. 파라미터와 본문으로 구성되어 있으며, 화살표(->)가 둘을 구분한다. 그리고 자바와 달리 파라미터 주변에 ()가 없다. 람다 문법을 이야기하기 위해 컬렉션 확장 함수 maxByOrNull을 가져왔다. 위 형태는 람다 문법을 이용하여 람다 식을 간략하게 표현한 것으로, 정식 문법으로 적으면 다음과 같다. 간략화하지 않으니 어떤 일이 벌어지고 있는지 명확하다. 함수에 람다를 인자로 넣어 호출하고 있으며, 람다는 Person 타입의 객체를 입력 받아서 age 필드 값을 반환한다
[Kotlin In Action] 5-1) 람다(lambda)의 유용함
람다는 변수에 저장하거나 함수에 전달할 수 있는 작은 코드 블록을 말한다. 간소화된 형태의 함수라고도 볼 수 있다. 람다의 목적은 무엇일까? 무명 내부 클래스(익명 객체)의 불편함 개발을 하다보면 일련의 동작을 변수에 저장하거나 함수에 넘겨야하는 상황이 있다. 예를 들어, 어떤 이벤트가 발생하면 실행시킬 핸들러를 등록하거나, 자료 구조의 모든 원소에 같은 연산을 수행하고 싶을 때가 그렇다. 예전 자바에서는 무명 내부 클래스로 이러한 목적을 달성했다. 하지만 객체를 선언하고 추상 메서드를 오버라이딩 해야 해서 상당히 번거롭다. 람다의 간결함 코틀린은 함수형 언어처럼 함수를 값처럼 다루는 접근 방법으로 이 문제를 해결한다. 무명 객체를 선언하지 않고 함수를 직접 다른 함수에 전달할 수 있게 되어 코드가 간결해진다. 여기에 람다를 사용하면 함수를 정의하지 않고 코드 블록만 전달하는 것이 가능해서 더욱 간결해진다. 두 방식을 비교해보자. 두 코드는 모두

Kotlin in Action - Chapter2) Kotlin basics
기본 요소: 함수와 변수 함수 코틀린에서 함수는 아래와 같은 형태로 정의한다. 함수가 expression을 반환할 경우, 함수의 중괄호 및 return 문을 생략해 표현할 수 있다. 중괄호로 감싼 함수의 경우 block body를, expression을 바로 반환하는 함수의 경우 expression body를 갖는다고 한다. > statements vs expressions 1) statements: 값을 반환하지 않는다. 2) expressions: 값을 반환한다. 따라서 return 값으로 활용 가능하다. (코틀린에서 if는 expression이다.) 변수 변수를 나타내는 키워드는 다음과 같다. val: _va

Kotlin in Action - Chapter 1) Kotlin: what and why
코틀린이란? 코틀린은 자바 플랫폼을 대상으로 한 신규 프로그래밍 언어이다. 코틀린은 간결하고, 안전하고, 실용적이며, 자바와 상호 호환이 가능하다. 서버 및 안드로이드 개발 외에도 많은 곳에서 사용하고 있다. 코틀린의 특징 정적 타입 자바와 마찬가지로 코틀린은 정적 타입 언어(statically typed)이다. 즉, 컴파일 타임에 모든 표현식의 타입을 알 수 있다. (런타임에 타입 참조를 하는 동적 타입 언어(dynamically typed)와 상반된다.) 따라서 코틀린은 컴파일 타임에 타입을 자동으로 식별하는 타입 추론(type inference)을 제공한다. 또한 코틀린은 nullable 타입을 지원한다. 컴파일 타임에 NullPointerException을 방지해 더 안정적인 개발 환경을 제공한다. 함수형 + 객체지향 프로그래밍 코틀린은 함수형 프로그래밍의 특성과 객체지향 프로그래밍의 특

코틀린 인 액션 11장
DSL 영역 특화 언어 Domain Specific Language 선언적 선언! 깔끔한 API 작성할 수 있게 돕는 코틀린 기능 확장 함수 / 중위 호출 / 연산자 오버로딩 / 관례 / 수신객체지정 람다. 중위 연산자 - 호출할때 읽기 쉽고 표현력이 좀 더 좋게. 함수의 인자는 1개 여야 되고. infix 키워드가 있어야 된다. 관례 코틀린 큐칙을 읽고 유지하며 이해하기 쉬운 코드를 만들기위한 권장 사례 지침? 함수 속성 , 지역변수 카멜 케이스 / 클래스 및 인터페이스 이름은 파스칼 케이스.. 상수는 대문자로만 if else -> when 지향 확장 기능 및 속성을 사용해 기존 클래스 기능 추가. 영역 특화 언어 개념 DSL 은 선언적 개념임 , 원하는 결과를 기술 하고 세부 실행은 엔진에 맡김 . 원하는 결과를 얻기 위

코틀린 인 액션 9장
제네릭스 실체화한 파라미터 , 선언지점 변성에 대해 소개 실체화한 타입 파라미터 사용? 타입 인자로 쓰인 구체적인 타입을 실행 시점에 알 수 있다? 요약 제네릭 타입 사용시 타입을 일반화되어 재사용성을 높이지만 사용시점에서 구체적인 타입을 알수 없다. 이 때 실체화한 타입 파라미터를 사용해 실행 시점 타입 인자의 구체적인 타입을 알 수 있다. 선언 지점 변경을 사용하면 타입 인자의 상위/하위 타입을 지정 가능하다 자바에선 ? 임 왜 사용? 일반적으로 제네릭 타입은 컴파일 시점에서 타입 소거가 일어나. 실행시점에 제네릭타입 정보를 알수 없음, 그래서 실체화한 타입파라미터 사용. 타입 정보유지. 선언 지점 변성으로 타입인자 제한해서.. 특정 인자만 사용 가능하도록 제한. 코드 안정성 높임 코드 재사용성 증대 언제 사용 할까?? 주로 인라인 함수에 실체화한 타입 파라미터

코틀린 인 액션 8장
고차 함수: 파라미터와 반환값으로 람다 사용 람다를 인자로 받거나 반환하는 고차 함수를 만드는 방법을 다룸 고차함수 정의 함수 타입 람다를 인자로 받는 함수를 정의하려면? 타입을 어떻게 선언할지 알아 보자. // 널이 될수 있는 함수타입 변수도 가능. var canReturnNull: ((Int, Int) -> Int)? = { x, y -> null } // Declare a function type parameter for operation that takes two Int arguments and returns an Int fun twoAndThree(operation: (Int, Int) -> Int) { // Call the operation function with arguments 2 and 3 and store the result in the result variable val resul
[Kotlin In Action] 1장 - 코틀린이란 무엇이며 왜 필요한가?
1장 - 코틀린이란 무엇이며 왜 필요한가? 1.1 코틀린 맛보기 : max 값을 가진 데이터 찾기 : min 값을 가진 데이터 찾기 에서 을 사용할 경우 유일한 인자를 사용할 수 있다. 라고 불리는 는 null 인경우 0을 반환하고 그렇지 않은경우 값을 반환한다 1.2 코틀린의 주요 특성 1.2.1 대상플랫폼: 서버, 안드로이드 등 자바가 실행되는 모든 곳 > 코틀린의 주목적은 자바가 사용되고 있는 모든 용도에 적합하면서도 더 간결하고 생산적이며 안전한 대체 언어를 제공하는 것 서바상의 코드 (특히 백앤드) 안드로이드 모바일 애플리케이션 1.2.2 정적 타입 지정 언어 > 정적타입 장점 >1. : 실행 시점에 어떤 메서드를 호출할지 알아내는 과정이 필요 없으므로 메서드 호출이 더 빠르다 >2. : 컴파일러가 프로그램의 정확성을 검증하기 때문에, 실행 시 프로그램이 오류로 중단될 가능성

코틀린 인 액션 7장
코틀린답게 사용하기 연산자 오버로딩 기타 관례 언어의 기능과 미리 정해진 이름의 함수를 연결 기법을 관례라고 함. (ex plus메서드 정의는 + 연산자 사용) 관례를 사용하면 자바 코드를 수정하지 않아도 새로운 기능 추가 가능함. 코틀린린은 관례에 의존 함. 출력값 8 왜 쓸 까? 자바와의 상호 운용성 , 기존 자바 클래스에 새로운 기능을 쉽게 추가가능. 객체 지향과 함수형 프로그래밍 스타일 통합 산술 연산자 오버로딩 원시 타입에만 산술 연산자 사용 가능 이항 산술 연산자 오버로딩 operator fun Point.plus(other: Point): Point {

Kotlin in Action 6장
코틀린 타입시스템 널 가능성 NPE를 피할 수 있게 돕는 특성 Null에 대한 접근 방법을 실행시점 -> 컴파일러 시점으로 옮김 (코틀린) 미리 감지해서 예외를 줄인다! 널이 될 수 있는 타입 널 되는 타입 명시적 지원? 프로퍼티나 변수에 null을 허용하는 방법? 코틀린에선 함수작성시 함수가 널을 허용하나? 실행 시점에 Null 되는 모든 경우 포함 타입 뒤에 ? 붙여줌으로서 Null 참조 가능 그러나 널이 가능한 타입 변수 있으면 연산이 제한됨. fun strLenSafe (s: String?) = s.length () 널이 될수있는 값은 ! 널이될수없는 값타입 변수에 대입 금지! 그럼 왜사용하지? 필요한 널(null) 참조 문제를 최소화할 수 있도록 설계함 널을 명시적으로 표현! 널 관련 문제 방지 안정성 계속해서 Nul