# 코틀린의 특징

\\

코틀린은 자바 플랫폼에서 돌아가는 프로그래밍 언어이다. 특징으로는 간결하고 실용적이지만 자바와의 호환성이 아주 높아서 자바를 사용 중인 프로젝트에서는 거의 대부분 사용하는 것이 가능하다\
코틀린의 주 목적은 자바 코드를 더 간결하고 생산적이며 안전한 코드로 바꿀 수 있도록 안전한 언어를 제공해주고 있는 것이다\
\
\\

#### 코틀린은 자바와 동일하게 정적 타입 지정 언어이다

정적 타입 지정 언어란 자바나 코틀린과 같이 모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고 프로그램 안에서 객체의 필드나 메소드를 사용할 떄마다 컴파일러가 체크를 해준다는 것이다\
그와 반대로 동적 타입 지정 언어란 타입에는 무관하게 모든 값을 변수에 넣는 것이 가능하며 메소드나 필드 접근에 대한 검증이 실행하는 순간에 일어난다고 볼 수 있으며 그 예시는 그루비나 JRuby가 있다\
\\

하지만 정적 타입 지정언어인 코틀린과 자바의 차이로는 우선, 모든 변수의 타입을 굳이 지정할 필요가 없다\
그럼 어떻게 파악하느냐 -> 코틀린 컴파일러가 문맥으로부터 변수 타입을 자동으로 예측해서 적용해준다 그리고 이렇게 코틀린 컴파일러가 변수의 타입을 지정해주는 과정을 타입 추론이라고 한다\
마치 자바스크립트에서의 var, let과 같은 느낌이다\
\\

정적 타입 지정 언어의 장점은 아래와 같다\\

* 성능 : 실행 시점에 어떤 메소드를 호출하는지 확인할 필요가 없다
* 신뢰성 : 컴파일러가 프로그램의 정확성을 검증하기 때문에 프로그램이 오류로 꺼질 확률이 적긴하다
* 유지 보수성 : 객체의 타입으로부터 자유롭기 때문에 코드를 파악하는 것이 쉽다
* 도구 지원 : ide에서 잘 도와줌

\
\
역시 코틀린에서의 중요한 특성은 널이 될 수 있는 타입을 지원한다는 것이다\
널이 될 수 있는 타입을 지원하기 때문에 컴파일 시점에 nullpointexception 이 발생할 수 있을지 없을지를 확인하는 것이 가능해서 안전성도 높다고 볼 수 있다\
\\

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

함수형 프로그래밍이란?\\

* first-class 함수 : 함수를 일반 값처럼 변수에 저장할 수도 있고, 함수를 인자로 다른 함수에 전달할 수도 있으며 함수를 변수처럼 사용하는 것이다
* 불변성 : 함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대 바뀌지 않는 불변 객체를 사용해서 프로그램을 작성
* side-effect 없음 : 함수형 프로그래밍에서는 입력이 같으면 항상 닽은 출력을 내보내고 다른 객체의 상태를 변경하지 않으며, 내부에서만 도는 순수함수를 사용한다

\
\
위와 같은 스타일로 코드를 작성하면 장점은 몇가지 있다\
첫 번째로는 간결성이다 -> 명령형 코드에 비해서 간결하고 우아하다고 볼 수 있다. 함수를 변수처럼 사용하면 추상화도 가능하고, 이를 통해 다형성도 챙기고 코드 중복도 막는 것이 가능하다\
두 번째로는 스레드세이프티이다 -> 멀티 스레드 환경에서는 항상 동기화에 신경써야 한다 하지만 불변 함수를 사용하면 어짜피 접근이 불가능하기 때문에 동기화에 신경을 쓰지 않아도 된다\
마지막으로는 테스트하기 간편하다는 것이다 -> 함수에 대해서 사전준비가 필요없다\
\\

이렇게 장점이 있는 함수형 프로그래밍은 코틀린에서 어떠하게 지원을 해주는거냐\\

* 함수 타입을 지원함에 따라 어떤 함수가 다른 함수를 파라미터로 받거나 함수가 새로운 함수를 반환하는 것이 가능하다
* 람다 식으로 편하게 코드블록을 정의하고 전달하는 것이 가능하다
* 데이터 클래스는 불변적인 값을 쉽게 만드는 구문을 제공
* 코틀린 표준 라이브러리는 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 api을 제공

물론 이러한 함수형 프로그래밍이 강제되는 것은 아니고 객체지향적으로도 프로그램을 만들 수 있으니까 적절하게 조합해서 사용하면 된다\
\
\
\\

#### 코틀린의 철학

코틀린이 자바와의 상호운영성에 초점을 맞춘 실용적이고, 간결하며 안전한 언어라고 한다. 이것들에 대해서 보자\
\\

실용성\
코틀린이라는 언어는 연구를 위한 언어가 아닌 개발을 위한 언어이기 때문에 활용도가 높아지면 높아질수록 더욱 간결하고 편하게 코드를 작성하는 것이 가능하다. 그리고 코틀린은 도구를 많이 강조한다. IDE에서도 적용만 해두면 최대한 간결한 구조로 만들도록 계속해서 제안해준다\\

간결성\
코틀린을 만들면서 프로그래머가 작성하는 코드에서 의미가 없는 부분을 줄이고, 언어가 요구하는 구조를 만족시키기 위해서 부수적으로 준비해야 하는 게터, 세터, 생성자파라미터와 같은 것들은 자동으로 준비해준다. 그렇기 때문에 지저분해질 걱정은 없다는 것이다. 그리고 다양한 라이브러리를 제공해주고 있기 때문에 다양한 코드들을 라이브러리의 함수호출을 통해서 줄이는 것이 가능 그리고 람다를 지원하기 때문에 라이브러리의 함수와의 상호작용도 쉽다\\

안전성\
코틀린을 만드는데, 자바보다 더 높은 수준의 안전성을 보여주되, 비용은 더욱 적게가져가는 것을 원했다고 한다. 여기서 일단 jvm 위에서 돌아가는 것은 운영에서의 안전성은 보장되며 버퍼 오버플로우와 같은 문제를 어느정도 예방할 수 있다. 또한 정적 타입 지정언어로써 타입 안전성이 보장된다. 그리고 코틀린은 nullpointerexception을 없애기 위해서 노력한다 코틀린의 타입 시스템은 널이 될 수 없는 값을 추적하며 실행 시점에 nullpointerexception이 발생할 수 있는 연산을 사용하는 코드를 금지해버린다. 그리고 이렇게 널이 될 수 있는지의 표시는 ? 을 통해서 사용한다\\

```java
val s: String? = null //nullable
val s2: String = "" //null-safe
```

추가로 classcastexception도 처리해준다. 어떤 객체를 다른 타입으로 캐스팅하기 전에 타입검사를 해줘야 한다. 자바에서는 원래 생략하는 경우가 많은데, 코틀린에서는 타입 검사와 캐스팅작업이 하나의 연산자에서 이루어지기 때문에 객체의 타입을 검사했고 그 객체가 그 타입에 속한다면 해당 타입의 메소드나 필드를 별도의 캐스팅작업 없이 사용하는 것이 가능하다 그래서 그냥 타입검사를 해버려서 exception도 처리하고 편리하게 사용한다\\

```java
if(value is String)
    println(value.toUpperCase())
```

\\

상호운용성\
코틀린과 자바는 같이 공존하는 것이 가능하다 자바에서 코틀린 함수를 사용할 수도 있고, 자바 라이브러리를 코틀린에서 가져다가 사용하는 것도 가능하다 심지어 상속과 implements도 자유롭게 가능한 부분이다 정말 단순하게 자바와 코틀린 사이에서 왔다갔다가 자유롭다. 그리고 둘이 섞여있는 프로젝트를 디버깅도 자유롭게 가능하다. 마지막으로 자바 메소드를 리팩토링해도 코틀린 코드까지도 자동으로 수정된다 반대도 마찬가지. 이것이 가능한 이유는 자바와의 차이점이 정말 그냥 코드의 작성과 컴파일러의 사용만이 다르다. 컴파일 이후에는 자바와 동일하게 클래스파일이 생성되고 이후에는 동일하게 작동된다. 물론 사실 코틀린 런타임 라이브러리도 같이 가야하지만 요 부분은 프로젝트 컴파일 시, 메이븐이나 그레이들이 알아서 포함시켜준다\
\
\\

정말 신기한 언어이다\
개념 잘 잡고, 맞으면서 배워보자! 화이팅\
\
\\

\
\
\
\
\
\
\
\
\
\\
