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

솔트커피·2022년 7월 9일
0

Kotlin In Action

목록 보기
1/2

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

자바 플랫폼(JVM)에서 돌아가는 새로운 프로그래밍 언어다.

코틀린은

  • 간결하고
  • 실용적이며
  • 상호운영성을 중시하며
  • 안전하다.

1.1. 코틀린 맛보기 (p36)

튜토리얼 코드

1.2. 코틀린의 주요 특성 (p37)

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

코틀린의 주 목적은

  • 현재 자바가 사용되고 있는 모든 용도에 적합하면서도
  • 더 간결하고
  • 생산적이며
  • 안전한 대체 언어를 제공하는 것이다.

1.2.2. 정적 타입 지정 언어

자바와 마찬가지로 코틀린도 정적 타입 언어이다.

  • 정적 타입 지정
    • 모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있음
    • 프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해줌
  • 동적 타입 지정
    • 타입과 관계없이 모든 값을 변수에 넣을 수 있고, 메소드나 필드 접근에 대한 검증이 실행 시점에 일어남
    • 그에 따라 코드가 더 짧아지고 데이터 구조를 더 유연하게 생성하고 사용할 수 있음
    • 하지만 반대로 이름을 잘못 입력하는 등의 실수도 컴파일 시 걸러내지 못하고 실행 시점에 오류가 발생함

자바와 달리 코틀린에서는 모든 변수의 타입을 프로그래머가 직접 명시할 필요가 없다.

대부분의 경우 코틀린 컴파일러가 문맥으로부터 변수 타입을 자동으로 유추할 수 있기 때문에 프로그래머는 타입 선언을 생략해도 된다.

컴파일러가 문맥을 고려해 변수 타입을 결정하는 이런 기능을 타입 추론(type inference)라고 부른다.

정적 타입 지정의 장점

  • 성능
  • 신뢰성
  • 유지 보수성
  • 도구 지원

클래스, 인터페이스, 제네릭스는 모두 자바와 비슷하게 작동한다. 하지만 몇가지 새로운 점이 있다.

그중 가장 중요한 특성은 코틀린이 널이 될 수 있는 타입(nullable)을 지원한다는 점이다.

따라서 NPE가 발생할 수 있는지 여부를 검사할 수 있어서 좀 더 프로그램의 신뢰성을 높일 수 있다.

코틀린의 타입 시스템에 있는 다른 새로운 내용으로는 함수 타입(funciton type)에 대한 지원을 들 수 있다.

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

함수형 프로그래밍의 핵심 개념은 다음과 같다.

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

함수형 스타일로 프로그램을 작성하면 얻을 수 있는 이득

  • 간결성
  • 강력한 추상화
    • 코드 중복 제거
    • 공통 부분을 따로 함수로 뽑아내고 세부 사항을 인자로 전달 가능
      • 인자 그 자체가 함수 - 람다 식을 사용하면 간결하게 표현 가능
  • 다중 스레드를 사용해도 안전(safe-multithreading)
    • 불변 데이터 구조를 사용하고 순수 함수를 그 데이터 구조에 적용한다면
      • 같은 데이터를 여러 스레드가 변경할 수 없음
      • 따라서 복잡한 동기화를 적용할 필요 없음
  • 테스트하기 쉬움
    • 부수 효과가 있는 함수는 실행 시 필요한 전체 환경을 구성하는 준비 코드 필요
    • 순수 함수는 준비 코드 없이 독립적으로 테스트 할 수 있음

코틀린은 처음부터 함수형 프로그래밍을 풍부하게 지원

  • 어떤 함수가 다른 함수를 파라미터로 받거나 함수가 새로운 함수를 반환할 수 있음
  • 람다 식을 지원함에 따라 준비 코드를 작성하지 않아도 코드 블록을 쉽게 정의하고 여기저기 전달할 수 있음
  • 데이터 클래스는 불변적인 값 객체(value object)를 간편하게 만들 수 있는 구문을 제공
  • 코틀린 표준 라이브러리는 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API를 제공

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

따라서 명령형 방식이 더 적합한 경우라면 함수형 프로그래밍으로 번거롭게 코드를 작성할 필요 없이 직접 변경 가능한 데이터와 부수 효과를 활용하는 함수를 사용해도 됨

1.3. 코틀린 응용 (p43)

1.3.1. 코틀린 서버 프로그래밍

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

코틀린의 장점

기존 자바 코드와 매끄럽게 상호운용할 수 있다는 점

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

  • 컨트롤에 리스너를 추가하거나 레이아웃 요소를 필드와 바인딩하는 등의 작업을 훨씬 더 적은 코드로 달성 가능
    • 컴파일러가 필요한 코드를 자동 생성해주는 경우도 있음
  • 안코(Anko) 라이브러리를 사용하면 수많은 안드로이드 API에 대한 코틀린 어댑터를 제공 받을 수 있음
  • 애플리케이션의 신뢰성이 더 높아짐
    • 프로세스가 중단됨(Process Hash Stopped) - NPE가 발생한 경우 표시됨
    • 코틀린 타입 시스템은 null값을 정확히 추적하며 널 포인터로 인해 생기는 문제를 줄여줌
  • 일반적인 자바 코드와 똑같이 효율적으로 실행 됨
  • 대부분의 코틀린 표준 라이브러리 함수는 인자로 받은 람다 함수를 인라이닝(inlining, 함수를 함수라는 이름의 몸체의 콜 사이트로 대체하는 수동 또는 컴파일러 최적화 기법) 함.
    • 람다를 사용해도 새로운 객체가 만들어지지 않으므로 GC가 늘어나서 프로그램이 자주 멈추는 일도 없음

1.4. 코틀린의 철학(p47)

1.4.1. 실용성

  • 다른 프로그래밍 언어가 채택한 이미 성공적으로 검증된 해법과 기능에 의존
  • 언어의 복잡도가 줄어들고 이미 알고 있는 기존 개념을 통해 더 쉽게 배울 수 있음
  • 특정 프로그래밍 스타일이나 패러다임을 사용할 것을 강제로 요구하지 않음
  • IntelliJ Idea와 컴파일러의 개발이 맞물려 이뤄짐

1.4.2. 간결성

  • 보통 개발자들은 코드를 새로 작성하는 시간 보다 기존 코드를 읽는 시간이 더 김
  • 코드가 더 간단하고 간결할 수록 내용을 파악하기가 더 쉬움
  • 자바에 존재하는 여러가지 번거로운 준비 코드를 코틀린은 묵시적으로 제공
    • Getter, Setter, 생성자 파라미터를 필드에 대입하기 위한 로직 등 반복되거나 길어질 수 있는 코드를 라이브러리 함수 호출로 대치 가능
  • 람다 지원
  • 연산자 오버로딩 지원
    • 연산자 재정의 불가

1.4.3. 안전성

  • 일부 유형의 오류를 프로그램 설계가 원천적으로 방지해준다는 뜻
  • 애플리케이션의 타입 안전성 보장
    • 자바보다 더 적은 비용으로 타입 안전성 사용 가능
      • 실행 시점에 NPE가 발생할 수 있는 연산을 사용하는 코드를 금지 
      • 코틀린 컴파일러가 타입을 자동으로 추론해줌 
      • 컴파일 시점 검사를 통해 오류를 더 많이 방지
      • 타입 검사와 캐스트가 한 연산자에 의해 이뤄짐
        • 어떤 객체를 다른 타입으로 캐스트하기 전에 타입을 미리 검사
          • 타입 검사를 생략할 이유가 없고, 검사를 생략하지 않으면 오류가 발생할 일도 없다.

1.4.4. 상호운용성

자바 프로그래머들의 질문 - 기존 라이브러리를 그대로 사용할 수 있느냐?

  • YES.
  • 코틀린의 클래스나 메소드를 일반적인 자바 클래스나 메소드와 똑같이 사용 가능
  • 코틀린은 자바 표준 라이브러리 클래스에 의존
  • 자바 API를 호출할 때 객체를 감싸거나 변환할 필요 X, 반대도 마찬가지, 부가 비용 또한 X
  • 다중 언어 프로젝트 지원

1.5. 코틀린 도구 사용 (p53)

1.5.1. 코틀린 코드 컴파일

  • 자바 소스코드를 컴파일할 때와 마찬가지로 코틀린 소스코드를 분석해서 .class 파일을 만듬
  • .class 파일은 애플리케이션의 유형에 맞는 표준 패키징 과정을 거쳐 실행됨

  • 컴파일한 코드는 코틀린 런타임 라이브러리에 의존
  • 런타임 라이브러리에는 코틀린 자체 표준 라이브러리 클래스와 코틀린에서 자바 API의 기능을 확장한 내용이 들어있음
  • 따라서 배포시 런타임 라이브러리도 함께 배포해야 함.
  • 컴파일을 위한 Maven, Gradle, Ant 등의 빌드 시스템과 호환됨

1.6. 요약 (p57)

  • 코틀린은 타입 추론을 지원하는 정적 타입 지정 언어
    • 소스코드의 정확성과 성능을 보장하며 코드 간결하게 유지 가능
  • 객체 지향과 함수형 프로그래밍 스타일 모두 지원
    • 일급 시민 함수
      • 수준 높은 추상화 가능
    • 불변 값 지원
      • 다중 스레드 애플리케이션 개발
      • 테스트 용이
  • 서버 애플리에키션 개발에 활용
    • 자바 프레임워크 완벽 지원
    • HTML 생성기, 영속화 등 도구 지원
  • 안드로이드 개발에 활용
  • 코틀린은 무료이며 오픈소스
  • 실용적이며 안전하고, 간결하며 상호 운용성이 좋음
    • 일반적인 작업에 대해 이미 잘 알려진 해법을 채택
    • NPE와 같이 흔히 발생하는 오류 방지
    • 읽기 쉽고 간결한 코드 지원
    • 자바와 제약 없이 통합될 수 있는 언어                                                                                                                                                                                                                                                                                                       

0개의 댓글