1장. 코틀린이란 무엇이며, 왜 필요한가?

코틀린 언어의 특징

1) 간결함
_보일러 플레이트(boilerplate)_를 제거해야 한다. 2) 안전함
_Null Pointer_를 안전하게 다루는 방법을 제공한다. -> Nullable (Optional) 3) 자바와의 상호운용
Kotlin에서 Java로 작성된 코드를 사용할 수 있고, Kotlin으로 작성된 코드를 Java에서 사용할 수 있다.

1.1 코틀린 맛보기

http://try.kotl.in


data class Person(val name: String, val age: Int? = null) // Int? 는 null이 될 수 있는 타입.  

fun main(args: Array<String>){
	val persons = listOf( Person("영희"), Person("철수",age=25) )
	val oldest = persons.maxBy { it.age ?: 0 } // 람다식과 엘비스 연산자.
// 엘비스 연산자(?:)란 age가 null일 경우에는 0을 반환하고, 그 이외의 경우에는 age값을 반환한다.

	println("나이가 가장 많은 사람: $oldest") //문자열 템플릿
}

``` //실행 결과 나이가 가장 많은 사람: Person(name=철수, age=25) // toString 자동 생성



## 1.2 코틀린의 주요 특성
코틀린의 주 목적: 현재 자바보다 더 간결하고 생산적이며 안전한 대체 언어를 제공하는 것.

### 1.2.1 대상 플랫폼: 서버, 안드로이드 등 자바가 실행되는 모든 곳

### 1.2.2 정적 타입 지정 언어


|  <center> - </center> |  <center>정적 타입</center> |  <center>동적 타입</center> |
|:--------|:--------:|--------:|
|**사용 언어** | <center>Java, **Kotlin**, C, C++ ..</center> | JavaScript, Python, Groovy, JRuby .. |
|**검증 시점** | <center>컴파일시</center> | 실행시 |
|**장점** | <center>cell 3x2 </center> |*유연하다.* |
|**단점** | <center>cell 3x2 </center> |*느리다. 안정성 확보가 어렵다.* |

- 타입을 컴파일시에 결정한다.
- 변수에 들어갈 값의 형태에 따라 타입을 지정해주어야 한다.
- 컴파일시에 잘못된 값이 들어갔을 경우 컴파일 에러가 발생한다.
- 장점: 컴파일시에 타입에 대한 정보를 결정하기 때문에 속도가 빠르다.
- 안정성 확보.


- 실행시 타입 결정.
- 타입 없이 변수만으로 값 지정 가능
-


<정적 타입 지정의 장점>
1. 성능 _ 더 빠름
2. 신뢰성 _ 실행시 오류 발생 가능성이 더 적다.
3. 유지 보수성 _ 처음 보는 코드를 다룰 때 더 쉬움
4. 도구 지원 _ 더 안전하게 리팩토링 가능

나중에 정리
- - - -


**Kotlin은 변수의 타입 선언을 생략해도 된다.**
대부분의 경우 코틀린의 컴파일러가 문맥으로부터 변수의 타입을 유추할 수 있기 때문. -> _타입 추론 (type inference)_

var x = 1 ```

코틀린은 _타입 추론_을 지원하기 때문에 정적 타입 지정 언어에서 직접 타입을 선언해야 하는 불편함이 해소됨.

Class, Interface, Generics 모두 자바와 비슷하게 작동함.

Java와 다르게 새로 추가된 것:

  • nullable type
    컴파일 시점에 null pointer exception 발생 여부를 검사할 수 있어 프로그램의 신뢰성을 높인다.
  • function type
    함수 타입을 지원. 함수 타입은 무엇인가?

1.2.3 함수형 프로그래밍과 객체지향 프로그래밍

함수형 프로그래밍

  • 일급 시민(first class)인 함수
    함수를 일반 값처럼 다룰 수 있다. 함수를 변수에 저장하고 함수를 인자로 넘기거나 반환할 수 있다. -> 간결성. 코드의 중복을 줄임. 예) findPerson{ it.name == “Bob” } // 람다를 사용해 간결하게 표현 가능.
  • 불변성(immutability)
    한 번 만들어지면 내부가 바뀌지 않는 불변 객체를 사용한다. -> 다중 스레드에 안전.
  • 부수 효과(side effect) 없음
    입력이 같으면 결과도 같다. 다른 객체를 변경하지 않으며, 외부와 상호작용하지 않는다. -> 독립적으로 테스트 가능.

[코틀린에서의 지원]

  • 함수 타입 지원.
  • 람다식 지원.
  • 데이터 클래스를 통해 불변 객체(value object)를 간편하게 만들 수 있음.
  • 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API 제공함

1.2.4 무료 오픈소스

깃허브 : https://github.com/jetbrains/kotlin

1.3 코틀린 응용

1.3.1 코틀린 서버 프로그래밍

다음과 같은 분야가 서버 프로그래밍에 포함된다.

  • 브라우저에 HTML 페이지를 돌려주는 웹 애플리케이션
  • 모바일 애플리케이션에게 HTTP를 통해 JSON API를 제공하는 백엔드
  • RPC 프로토콜을 통해 서로 통신하는 작은 서비스들로 이루어진 마이크로 서비스

새로운 기술이나 프레임워크는 항상 기존의 것을 확장, 개선, 대치한다. -> 코틀린은 자바와 상호 운용이 가능하기에 큰 장점. +코틀린에서 자바의 애노테이션도 사용이 가능하다.

  1. Builder Pattern
// 간단한 HTML 생성 라이브러리
fun renderPersonList(persons: Collection<Person>) = createHTML().table{
	for(person in persons){
		tr{
			td{+person.name}
		}
	}
}	
  1. Persistence(영속성) Framework
    예) Exposed 프레임워크
    읽기 쉬운 DSL을 제공하고, 코틀린 코드만을 사용해 완전한 타입 검사를 지원하면서 데이터베이스 질의 실행 가능.

—> 나중에 7.5절과 11장에서 더 자세히 살펴볼 예정

1.3.2 코틀린 안드로이드 프로그래밍

_Anko_라이브러리 (https://github.com/kotlin/anko) 를 사용하면 안드로이드 API에 대한 코틀린 어댑터를 제공받을 수 있다.

//Anko를 사용한 간단한 예제
verticalLayout{
	val name = editText()
	button("say hello"){ // 클릭시 텍스트 필드의 값을 표시
		onClick{ toast("Hello, ${name.text}!") } // 버튼에 리스너를 추가하고 토스트를 표시하는 간결한 API
	}
}

[코틀린의 이점]

  1. 애플리케이션의 신뢰성이 높아짐
    안드로이드 개발시 process has stopped 오류를 많이 경험해보았을텐데, 이는 애플리케이션에서 처리되지 않는 예외. 주로 Null Pointer Exception이 발생한 경우레 표시된다. 자바에서 Null Pointer Exception이 발생하는 코드는 대부분 코틀린에서는 컴파일도 되지 않기 때문.
  2. Java 6와 완전히 호환된다.
  3. 성능 측면에서 손해가 없다.
    코틀린 컴파일러가 생성한 바이트 코드 또한 효율적으로 실행됨. 대부분 인자로 받은 람다 함수를 inlining한다. 따라서 람다를 사영해도 새로운 객체가 만들어지지 않으므로 객체 증가로 인해 가비지 컬렉션이 늘어나서 프로그램이 자주 멈추는 일도 없다.

태그:

카테고리:

업데이트:

댓글남기기