231212 TIL #266 Kotlin #1 코틀린이란?

김춘복·2023년 12월 12일
0

TIL : Today I Learned

목록 보기
266/571

Today I Learned

오늘부터 빡세게 코틀린에 대해서 공부해보려 한다. Kotlin in Action이라는 책을 베이스로 공부를 진행하고 여기에다 필기해 복습이 필요할 때 마다 보려한다.


  • Kotlin Playground을 접속하면 설치없이 웹상으로 코틀린 코드를 작성하고 실행 가능하다.

Kotlin이란?

  • Java 플랫폼에서 돌아가는 프로그래밍 언어
  • 간결하고 실용적이며, Java 코드와의 상호운용성(interperability)을 중시
  • 자바가 사용중인 곳이라면 거의 대부분 코틀린 사용가능
  • 서버, 안드로이드 앱 등의 분야에서 주로 사용
  • 코틀린 코드 예시
data class Person(val name: String, // 데이터 클래스(property가 name과 age)
                 val age: Int?= null) // 디폴트값이 null + null이 될 수 있는 타입(Int?)

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) (toString)은 자동 생성

주요 특징

1. 대상 플랫폼

주로 백엔드 서버, 안드로이드 등 자바가 실행되는 모든 곳
자바뿐만 아니라 자바스크립트로도 코틀린을 컴파일할 수 있다.
멀티 OS 엔진으로도 iOS에서도 실행이 가능하다.

2. 정적 타입 지정 언어

자바와 마찬가지로 코틀린도 정적 타입(statically typed)지정 언어이다.
즉, 모든 프로그램 구송요소의 타입을 컴파일 시점에 알 수 있고 필드나 메서드를 사용할 때 마다 컴파일러가 타입을 검증해준다.
단, 자바와 달리 타입 선언을 생략해도 변수 타입을 코틀린 컴파일러가 문맥에서 추론할 수 있다.

장점

  • 성능 : 실행시점에 어떤 메서드를 호출할 지 알아내는 과정이 없어 성능이 더 빠르다
  • 신뢰성 : 컴파일러가 프로그램의 정확성을 검증하기 때문에 실행시 오류 중단 가능성이 적다
  • 유지보수성 : 코드에서 다루는 객체가 어떤 타입인지 알 수 있어 처음보는 코드일때도 더 쉽다
  • 도구 지원 : 더 안전하게 리팩토링할 수 있으며 IDE의 도움을 받기 쉽다.
  • Nullable type 지원 : 널이 될 수 있는 타입을 지원해 컴파일 시점에 NPE를 검증할 수 있다.

cf. 동적 타입 지정 언어
타입과 관계 없이 모든 값을 변수에 넣을 수 있고, 메서드나 필드 접근에 대한 검증이 실행시점에 일어난다. (짧은 코드와 유연성이 장점이지만 실행 시점에 오류)

3. 함수형 프로그래밍 지원

코틀린은 기본적으로는 자바처럼 객체지향 언어이지만 함수형 프로그래밍 스타일을 모두 지원한다.

함수형 프로그래밍의 핵심 개념

  • first-class 함수
    함수를 일반 값처럼 다룰 수 있다. 함수를 변수에 저장하거나 인자로 다른 함수에 전달하거나, 함수에서 새로운 함수를 만들어 반환할 수 있다.

  • 불변성(immutability)
    일단 만들어지고나면 내부 상태가 절대로 바뀌지않는 불변 객체를 사용한다.

  • side effect 없음
    입력이 같으면 출력이 같고 다른 객체의 상태를 변경하지 않고, 함수 외부와 상호작용하지 않는 순수함수를 사용한다.

장점

  • 간결성 : 명령형 코드에 비해 간결하고, 함수를 값처럼 써서 더 강력한 추상화를 할 수 있어 코드의 중복을 막는다.
  • thread-safe : 다중 스레드 프로그램에서도 안전해 복잡한 동기화가 필요 없다.
  • 부수효과가 없어 독립적으로 테스트하기 쉽다.

in Kotlin

코틀린에서는 함수형 스타일로 프로그램을 짤 수 있게 지원한다.
하지만 함수형 스타일을 강제하지 않는다.
함수 타입, 람다식을 지원하고 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API를 제공한다.

4. 무료 오픈소스

코틀린의 언어, 컴파일러, 라이브러리, 도구는 모두 오픈소스로 무료로 사용할 수 있다.
개발은 Kotlin 깃허브에서 이뤄진다.


코틀린 응용

코틀린 서버 프로그래밍

기존에 자바로 짜여진 기술과 프레임워크들을 그대로 활용하면서 자바 클래스들을 코틀린으로 확장해도 아무 문제가 없다. 오히려 코드는 더 간결해지고 더 신뢰성 있게 유지보수를 할 수 있다.

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

모바일 애플리케이션은 엔터프라이즈 애플리케이션보다 더 작고 기존 코드기반과 새 코드를 통합할 필요도 적다. 그리고 더 다양한 디바이스에 대해 신뢰성을 보장하면서 더 빠르게 개발해 배포해야한다.
코틀린의 특성과 안드로이드 프레임워크의 컴파일러 플러그인 지원을 조합해 안드로이드 앱 개발의 생산성을 더 높일 수 있다.
그리고 NPE문제를 컴파일러가 미리 잡기 때문에 앱 신뢰성이 더욱 높아진다.


코틀린의 철학

  1. 실용성

    코틀린은 연구를 위한 언어가 아니라 실제 문제를 해결하기 위해 만들어진 실용적인 언어이다.
    특정 프로그래밍 스타일이나 패러다임을 강제하지 않는다.
    IDE 지원(특히 인텔리제이)이 매끄럽다.

  2. 간결성

    코드에서 의미가 없는 부분을 줄이고, 구조를 만족하기 위한 부수적인 요소를 줄였다.
    그리고 반복되거나 길어질 수 있는 코드는 라이브러리 함수 호출로 대치할 수 있다.
    더 간결해진 코드 덕분에 가독성이 좋아지고 유지보수하기 편해지며 생산성이 향상된다.

  3. 안전성

    JVM 위에서 실행되기 때문에 메모리 안전성과 버퍼 오버플로우가 기본적으로 방지된다.
    정적 타입 지정 언어라서 타입 안전성을 보장한다.
    실행시점에 NPE를 발생할 수 있는 코드를 금지해 Null 안전성을 제공한다.
    (null이 될 수 있으면 간단하게 ?만 추가하면 된다)

  4. 상호운용성(interperability)
    기존의 자바 라이브러리가 어떤 api를 제공하던 그대로 사용할 수 있다.
    코틀린 안에서 자바 클래스를 상속하거나 구현하는 것도 가능하다.
    반대로 자바 코드에서 코틀린을 호출하는 것도 어떤 노력없이 바로 가능하다.
    자바와 코틀린 소스 파일이 섞여있어도 제대로 프로그램을 컴파일할 수 있다.


컴파일 과정

  • 코틀린은 보통 .kt 확장자로 쓰여진다. 코틀린 컴파일러가 이 파일을 컴파일해 .class 파일로 만든다. 그 뒤 과정은 자바와 같다.
profile
Backend Dev / Data Engineer

0개의 댓글