Skip to content

CH01. 코틀린 소개 (이주영)

leeheefull edited this page Mar 20, 2023 · 1 revision

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

코틀린이란?

  • 자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어
  • 간결하고 실용적
  • 기존 자바 라이브러리나 프레임워크와 함께 잘 작동하며, 성능도 자바와 같은 수준

코틀린 맛보기

data class Person(  // 데이터 클래스
    val name: String, 
    val age: Int? = null    // null이 될 수 있는 타입(Int?)과 파라미터 디폴트 값
)

fun main(args: Array<String>) { // 최상위 함수
    val persons = listOf(
        Person("영희"),   // 영희의 나이는 null
        Person("철수", age=29)
    )
    
    val oldest = persons.maxBy { it.age ?: 0 }  // 람다식과 엘비스 연산자
    println("가장 연장자: $oldest")  // [결과] 가장 연장자: Person(name=철수, age=29)
}

코틀린의 주요 특성

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

    • 서버, 안드로이드 외 다른 환경에서도 잘 작동함
    • 자바스크립트로도 코틀린을 컴파일할 수 있음 -> 브라우저나 노드에서 실행 가능
  • 정적 타입 지정 언어

    • 자바와 같이 정적 타입 지정 언어
    • 자바와 달리 개발자가 모든 변수의 타임을 직접 명시할 필요가 없음(타입추론: 컴파일러가 문맥을 고려해 변 수 타입을 결정하는 기능)
      var x = 1   // x를 정수(Int) 값으로 초기화
    • 정적 타입 지정의 장점
      - 성능: 실행 시점에 어떤 메소드를 호출할지 알아내는 과정이 필요 없으므로 메소드 호출이 더 빠름
      - 신뢰성: 컴파일러가 프로그램의 정확성을 검증하기 때문에 실행 시 프로그램이 오류로 중단될 가능성이 더 적어짐
      - 유지보수성: 코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있기 때문에 처음 보는 코드를 다룰 때도 더 쉬움
      - 도구 지원: 정적 타입 지정을 활용하면 더 안전하게 리팩토링할 수 있고, 도구는 더 정확한 코드 완성 기능을 제공할 수 있으며,
        IDE의 다른 지원 기능도 더 잘 만들 수 있음
      
    • 널이될 수 있는 타입을 지원하여 프로그램의 신뢰성을 높일 수 있음
  • 함수형 프로그래밍과 객체지향 프로그래밍

    • 일급 시민인 함수: 함수를 일반 값처럼 다룰 수 있음
      - 함수를 변수에 저장 가능
      - 함수를 다른 인자로 다른 함수에 전달 가능
      - 함수에서 새로운 함수를 만들어서 반환 가능
      
    • 불변성: 함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그램을 작성함
    • 부수 효과 없음: 함수형 프로그래밍에서는 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용함
    • 함수형 스타일 작성의 장점
      - 간결성: 함수를 값처럼 활용할 수 있으면 더 강력한 추상화를 할 수 있고 강력한 추상화를 사용해 코드 중복을 막을 수 있음
      - 다중 스레드 사용의 안전성: 불변 데이터 구조를 사용하고 순수 함수를 그 데이터 구조에 적용한다면
        다중 스레스 환경에서 같은 데이터를 여러 스레드가 변경할 수 없기 때문에 복잡한 동기화를 적용할 필요가 없음
      - 테스트의 용이성: 부수 효과가 있는 함수는 그 함수를 실행할 때 전체 환경을 구성하는 준비 코드가 따로 필요하지만,
        순수 함수는 독립적으로 테스트 가능
      
  • 무료 오픈소스

    • 코틀린 언어와 컴파일러, 라이브러리 및 코틀린과 관련된 모든 도구는 모두 오픈소스

코틀린 응용

  • 코틀린 서버 프로그래밍
  • 코틀린 안드로이드 프로그래밍

코틀린의 철학

  • 실용성
    • 다른 프로그래밍 언어가 채택한 이미 성공적으로 검증된 해법과 기능에 의존함. 이로 인해 언어의 복잡도가 줄어들고 이미 알고 있는 개념을 통해 코틀린을 더 쉽게 학습 가능
    • 도구를 강조. 항상 도구의 활용을 염두에 두고 설계됨
  • 간결성
    • 코드가 간단해서 내용 파악이 쉬움
    • 람다를 지원하기 때문에 작은 코드 블록을 라이브러리 함수에 쉽게 전달 가능
  • 안전성
    • JVM에서 실행하기 때문에 메모리 안전성 보장, 버퍼 오버플로 방지, 동적 할당 메모리를 오사용하여 발생할 수 있는 다양한 문제 예방
    • 컴파일러가 타입을 자동으로 추론해주기 때문에 자바보다 더 적은 비용으로 타입 안전성 사용
    • 컴파일 시점 오류를 더 많이 방지함
    • 타입검사와 캐스트가 한 연산자에 의해 이뤄짐. 타입 검사를 생략할 이유가 없고, 검사를 생략하지 않으면 검사를 생략해서 생기는 오규가 발생할 일도 없음
      val s: String? = null   // 널이 될 수 있음
      val s2: String = ""     // 널이 될 수 없음
      
      if(value is String)     // 타입을 검사
          println(value.toUpperCase())    // 해당 타입의 메소드를 사용
  • 상호운용성
    • 기존 자바 라이브러리 사용 가능
    • 자바에서 코틀린 코드 소스 파일을 자유롭게 내비게이션 할 수 있음
    • 코틀린의 클래스나 메소드를 일반적인 자바 클래스나 메소드와 똑같이 사용 가능
    • 기존 자바 라이브러리를 가능하면 최대한 활용함

코틀린 도구 사용

  • 코틀린 코드 컴파일
    - 코틀린 컴파일러는 코틀린 소스코드를 분석해서 .class파일 생성
    - 생성된 .class 파일은 개발 중인 애플리케이션의 유형에 맞는 표준 패키징 과정을 거쳐 실행될 수 있음
    - 가장 간단한 방식은 커맨드라인에서 kotlinc 명령을 통해 코틀린 코드를 컴파일한 다음 java 명령으로 그 코드를 실행하는 것
      kotlinc <소스파일 또는 디렉터리> -include-runtime -d <jar 이름>
      Java 一jar <jar 이름>
    
  • 대화형 셀
  • 이클립스 플러그인
  • 온라인 놀이터
  • 자바-코틀린 변환기
Clone this wiki locally