[Kotlin In Action] 1장 - 코틀린이란 무엇이며 왜 필요한가?

서영민·2023년 4월 2일
0

코틀린 인 액션

목록 보기
1/1

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

1.1 코틀린 맛보기

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")
}
  1. maxByOrNull : max 값을 가진 데이터 찾기
  2. minByOrNull : min 값을 가진 데이터 찾기
  3. 람다식에서 it 을 사용할 경우 유일한 인자를 사용할 수 있다.
  4. 엘비스연산자 라고 불리는 ?:null 인경우 0을 반환하고 그렇지 않은경우 값을 반환한다

1.2 코틀린의 주요 특성

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

코틀린의 주목적은 자바가 사용되고 있는 모든 용도에 적합하면서도 더 간결하고 생산적이며 안전한 대체 언어를 제공하는 것

  • 서바상의 코드 (특히 백앤드)
  • 안드로이드 모바일 애플리케이션

1.2.2 정적 타입 지정 언어

정적타입 장점
1. 성능 : 실행 시점에 어떤 메서드를 호출할지 알아내는 과정이 필요 없으므로 메서드 호출이 더 빠르다
2. 신뢰성 : 컴파일러가 프로그램의 정확성을 검증하기 때문에, 실행 시 프로그램이 오류로 중단될 가능성이 더 적어진다
3. 유지 보수성 : 코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있기 때문에 처음 보는 코드를 다룰 때도 더 쉽다
4. 도구 지원 : 더 안전하게 리팩토링 할 수 있고, 더 정확한 코드 완성 기능을 제공할 수 있다.

  • 자바와 마찬가지로 코틀린도 정적타입 지정 언어이다.
  • 자바와 달리 코틀린에서는 모든 변수의 타입을 프로그래머가 직접 명시할 필요가 없다
  • 코틀린은 타입추론으로 코틀린 컴파일러가 문맥으로부터 변수 타입을 자동으로 유추할 수 있다.
  • 클래스, 인터페이스, 제네릭이 자바와 비슷하게 동작한다
  • 코틀린은 널이 될 수 있는 타입(nullable type)을 지원한다
    • 컴파일 시점에서 NPE를 검사할 수 있어서 신뢰성을 높힐 수 있다.
  • 코틀린은 함수타입을 지원한다

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

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

  • 일급시민 함수(first-class)
    • 함수일반 값처럼 다룰 수 있다
    • 변수에 저장 할 수있고, 인자로 다른 함수에 전달가능, 함수에서 새로운 함수를 만들어 반환 가능
  • 불변성(immutability)
    • 만들어지고나면 내부 상태가 절대로 바뀌지 않는 불편 객체를 사용해 프로그램을 작성한다
  • 부수 효과 없음
    • 입력이 같으면 항상 같은 출력을 내놓고, 다른 객체의 상태를 변경하지 않는다
    • 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용

함수형 스타일 프로그램의 장점

  1. 간결성
    1. 함수형 코드는 상응하는 명령형 코드에 비해 더 간결하며 우아하다
    2. 함수를 값처럼 활용할 수 있어 더 강력한 추상화를 할 수 있다
    3. 강력한 추상화를 사용해 코드 중복을 막을 수 있다
  2. 다중 스레드를 사용해도 안전하다 (Safe multithreading)
    1. 불변 데이터 구조를 사용하고, 순수함수를 그 데이터 구조에 적용한다면 다중 스레드 환경에서 같은 데이터여러 스레드가 변경할 수 없다
    2. 복잡한 동기화를 적용하지 않아도 된다
  3. 테스트에 용이하다
    1. 부수 효과가 있는 함수는 그 함수를 실행할 때 필요한 전체 환경을 구성하는 준비코드가 따로 필요하지만, 순수 함수는 그런 준비 코드 없이 독립적으로 테스트 할 수 있다.

코틀린의 함수형 프로그래밍 지원

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

코틀린은 함수형 스타일로 프로그래밍을 짤 수 있게 지원하지만, 함수형 프로그래밍 스타일을 강제하지는 않는다.

  • 명령형 방식이 더 적합한 경우라면 함수형 프로그래밍으로 번거롭게 코드를 작성할 필요 없이 직접 변경 가능한 데이터와 부수 효과를 활용하는 함수를 사용해도 된다.
  • 코틀린으로 코드를 작성할 때는, 객체지향과 함수형 접근 방법을 함께 조합해서 문제에 가장 적합한 도구를 사용하면 된다.

1.3 코틀린 응용

1.3.1 코틀린 서버 프로그래밍

  • 자바코드상호운용할 수 있다는 점이 코틀린의 가장큰 장점이다
  • 새로운 컴포넌트를 작성하거나, 기존 서비스 코드코틀린으로 이식해야 하는 경우에 모두 잘 들어맞는다
  • 자바클래스를 코틀린으로 확장해도 문제가 없다
  • 코틀린 클래스 안의 메서드필드에 특정 (자바)어노테이션을 붙여야 하는 경우에도 문제가 없다
  • 시스템 코드는 간결해지고, 신뢰성은 높아지며, 유지보수는 쉬워진다
  • 코틀린의 빌더패턴을 활용하면 간결한 구문을 사용해 객체로 이뤄진 그래프를 쉽게 구축하면서도 코틀린이 제공하는 완전한 추상화와 코드 재활용을 지속적으로 누릴 수 있다
  • 별도의 템플릿 언어를 사용할 필요가 없으므로 새로운 언어의 문법을 익힐 필요도 없다

코틀린의 DSL (DSL: Domain-Specific Languages)

  • 코틀린의 DSL 예로는 영속성 프레임워크를 들 수 있다
  • 익스포즈드(Exposed) F/W는 SQL 데이터베이스의 구조를 기술할 수 있는 읽기 쉬운 DSL을 제공한다
  • 코틀린 코드만을 사용해 완전한 타입 검사를 지원하면서 데이터베이스 질의를 실행할 수 있다

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

  1. 모바일 애플리케이션 엔터프라이즈 애플리케이션보다 더 작고 기존 코드 기반과 새 코드를 통합할 필요도 더 적다
  2. 더 다양한 디바이스에 대해 신뢰성을 보장하면서 빠르게 개발 배포할 필요가 있다
    3. 코틀린 언어의 특성안드로이드 f/w의 특별한 컴파일러 플러그인 지원을 조합하면 개발의 생산성을 높일 수 있다
  • 코틀린을 사용함으로써 애플리케이션의 신뢰성이 높아진다
  • 코틀린 타입 시스템null 값을 정확히 추적하며 널 포인트로 인해 생기는 문제를 줄여준다
  • 자바에서 NPE를 일으키는 코드는 대부분 코틀린에서는 컴파일도 되지 않는다
  • 성능 측면에서도 손해가 없다 (자바와 효율 같음)
  • 코틀린의 런타임 시스템상당히 작기때문에, 패키징한 애플리케이션 크기도 자바 애플리케이션에 비해 그리 많이 늘어나지 않는다
  • 대부분 코틀린 표준 라이브러리 함수인자로 받은 람다 함수인라이닝(inlining) 한다
    • 인라이닝(inlining)은 함수를 함수라는 이름의 몸체의 콜 사이트로 대체하는 수동 또는 컴파일러 최적화 기법이
  • 람다를 사용해도 새로운 객체가 만들어지지 않으므로 객체 증가로 인해 GC이 늘어나서 프로그램이 멈추는 일도 없다

1.4 코틀린 철학

코틀린은 자바와의 상용운용성에 초점을 맞춘 실용적이고 간결하며 안전한 언어다.

1.4.1 실용성

코틀린 설계는 대규모 시스템을 개볼해본 IT업계 경험을 바탕으로 이루어졌으며, 코틀린 커뮤니티 내부의 개발자들이 코틀린 초기 버전을 사용ㅇ하면서 전달한 피드백이 최정 버전에 반영돼 있다.

  • 코틀린은 연구를 위한 언어가 아니다
  • 다른 프로그래밍 언어가 채택한 이미 성공적으로 검증된 해법과 기능에 의존한다
    • 이로 인해 복잡도가 줄어들고, 이미 알고 있는 기존 개념을 통해 코틀린을 더 쉽게 배울 수 있다
  • 코틀린은 특정 프로그래밍 스타일이나 패러다임을 사용할 것을 강제로 요구하지 않는다
  • 실용성에 있어 코틀린은 도구를 강조한다
  • 코틀린의 경우 인텔리J IDE 개발과 컴파일러의 개발이 맞물려 있다
  • 코트린은 항상 도구의 활용을 염두해 두고 설계돼 왔다.

1.4.2 간결성

코드가 더 간단하고 간결할수록 내용을 파악하기가 더 쉽다

  • 간결하다는 말은 그 언어로 작성된 코드를 읽을 때 의도를 쉽게 파악할 수 있는 구문 구조를 제공하고, 그 의도를 달성하는 방법을 이해할 때 방해가 될 수 있는 부가적인 준비 코드가 적다는 뜻이다.
  • 코틀린은 의미없는 코드를 줄이고, 꼭 넣어야 하는 부수적인 요소를 줄이기 위해 노력을 했다.
  • getter, setter, 생성자 파라미터에 대한 여러가지 준비코드를 코틀린은 묵시적으로 제공한다
  • 코틀린은 기능이 다양한 표준 라이브러리를 제공하기 때문에 반복되거나 기렁질 수 있는 코드를 라이브러리 함수 호출로 대치할 수 있다.
  • 코틀린은 람다를 지원하기 때문에 작은 코드 블록을 라이브러리 함수에 쉽게 전달할 수 있다
  • 일반적인 기능을 라이브러리 안에 캡슐화 하고, 작업에 따라 달라져야 하는 개별적인 내용을 사용자가 작성한 코드 안에 남겨둘 수 있다.
  • 코틀린 설계 목표에는 소스코드를 가능한 짧게 만든다는 내용은 들어있지 않다
    • 코틀린은 연산자 오버로딩을 지원하지만, 언어가 제공하지 않는 연산자를 프로그래머가 정의할 수 있게 허용하지는 않는다.
  • 간결성은 여러분의 생산성을 향상시켜주고 개발을 더 빠르게 진행 할 수 있게 해준다

1.4.3 안전성

  • 프로그래밍 언어가 안전하다는 말은 오류 중에서 일부 유형의 오류를 프로그램 설계가 원천적으로 방지해준다는 뜻이다.
  • 단, 어떤 언어도 발생할 수 있는 모든 오류를 막을 수는 없다
  • 더 큰 안정성을 얻기 위해서는 프로그램에 더 많은 정보를 덧붙여야 하므로, 생산성이 하락하는 것을 감수해야 하며 안전성과 생산성 사이에는 트레이드오프 관계가 성립한다
  • 코틀린은 자바보다 높은 수준의 안전성을 제공하며 비용을 적게 지불하고 싶었다.
  • 코틀린은 JVM에서 실행되며 상당한 안전성을 보장한다
    • 메모리 안전성, 버퍼 오버플로우 방지, 동적 할당 메모리에 대한 발생 오류 방지
  • 정적 타입 지정 언어로써 타입 안전성을 보장한다
  • 코틀린 컴파일러의 타입추론으로 자바보다 더 적은 비용으로 타입 안전성을 사용할 수 있다
  • 컴파일 시점 검사를 통해 오류를 더 많이 방지해 준다
    • ex) NPE
    • NPE를 방지학 위해서는 오직 ? 한글자만 추가하면 된다
    • val s: String? = null  // null 가능
      val s2: String = "" // null 불가
  • 코틀린이 방지해주는 다른 예외로는 ClassCastException 이 있다
    • 코틀린에서는 타입 검사와 캐스트가 한 연산자에 의해 이뤄진다.
    • if (value is String)  // 타입 검사 및 캐스팅
          println(value.toUpperCase()) // 타입의 메서드 사용

1.4.4 상호운용성

상호운용성과 관련해 자바 프로그래머들이 던지는 첫 번째 질문은 아마도 '기존 라이브러리를 그대로 사용할 수 있느냐' 일 것이며, 코틀린의 경우는 물론 사용 가능하다

  • 라이브러리가 어떤 API를 제공하던 간에 코틀린에서 그 API를 활용할 수 있다
  • 자바 메서드를 호출하거나 자바 클래스를 상속하거나 인터페이스를 구현 하거나 자바 어노테이션을 코틀린 코드에 적용하는 일이 모두 가능하다

다른 JVM 언어와 달리 코틀린은 상호운용성 측면에서 훨씬 더 많은 것을 제공한다

  • 자바 코드에서 코틀린 코드를 호출할 때도 아무런 노력이 필요 없다
  • 코틀린의 클래스나 메서드를 일반적인 자바 클래스나 메서드와 똑같이 사용할 수 있다
  • 자바와 코틀린 코드를 프로젝트에서 원하는 대로 섞어 쓸 수 있는 궁극적인 유연성을 발휘할 수 있다.

기존 자바 라이브러리를 가능하면 최대한 활용한다

  • 코틀린은 자체 컬렉션 라이브러리를 제공하지 않는다.
  • 코틀린은 자바 표준 라이브러리 클래스에 의존한다
  • 다만, 코틀린에서 컬렉션을 더 쉽게 활용할 수 있게 몇가지 기능을 더할 뿐이다
  • 코틀린에서 자바 API 를 호출할 때 객체를 감싸거나 변환할 필요가 없고, 자바에서 코틀린 API를 호출할 때도 마찬가지로 아무런 변환이 필요 없다는 뜻이다.
  • 코틀린이 제공하는 풍부한 API 는 실행 시점에 아무런 부가 비용을 야기하지 않는다.

코틀린이 제공하는 도구도 다중 언어 프로젝트를 완전히 지원한다

  • 코틀린은 자바와 코틀린 소스 파일이 임의로 섞여 있어도 제대로 프로그램을 컴파일할 수 있다.
  • 소스 파일 사이의 의존관계가 어떤 식으로 이뤄졌든 관계없이 컴파일할 수 있다.
    • 자바와 코틀린 소스 파일을 자유롭게 내비게이션 할 수 있다
    • 여러 언어로 이뤄진 프로젝트를 디버깅하고, 서로 다른 언어로 작성된 코드를 언어와 관계없이 한 단계씩 실행할 수 있다
    • 자바 메서드를 리팩토링 해도 그 메서드와 관련 있는 코틀린 코드까지 제대로 변경된다.
    • 역으로 코틀린 메서드를 리팩토링해도 자바 코드까지 모두 자동으로 변경된다
profile
우렁총각

0개의 댓글