코틀린과 친해지자!

  1. 코틀린이란?
  2. 코틀린의 특징
  3. 코틀린 코딩 컨벤션
  4. 생성자
  5. 상수
  6. 함수
  7. 스마트 캐스트
  8. 참고 자료

코틀린이란?

  • 젯브레인스(JetBrains)에서 오픈소스 그룹을 만들어 개발한 프로그래밍 언어로 2017년 구글에서 안드로이드 공식 언어로 지정하였다.
  • JVM(Java Virtual Machine)에 기반을 둔 언어이며, 간결하고 실용적이며, 자바 코드와의 ‘상호운용성’을 중시한다.
  • 그렇기에 코틀린은 컴파일러가 생성한 바이트코드는 일반적인 자바 코드와 똑같이 효율적으로 실행된다.

코틀린의 특징

  • 코틀린은 자바와 100% 호환한다.
  • 최신 언어 기법을 이용하여 훨씬 간결한 구문으로 프로그램을 작성한다.
  • 정적 타입 지정 언어
    • 정적 타입 지정 언어란?
    • 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고, 프로그램 안에서 객체의 필드나 메서드를 사용할 때마다 컴파일러가 타입을 검증해 준다는 뜻
  • 타입 추론(Type inference)이 가능하다.
    • 타입 추론이란?
    • 프로그래머가 직접 타입을 선언하지 않아도 코틀린에서는 대입하는 값에 따라 타입을 유추할 수 있게 되어 타입을 명시하지 않아도 된다.
  • 코틀린은 널 안정성 null safety를 지원하는 언어
  • 코루틴(coroutines) 기법을 사용하면 비동기 프로그래밍을 간소화 할 수 있다.

이 외에도 lateinit을 이용한 초기화 미루는 법, by lazy, Any, Unit 등 코틀린에서 사용되는 기술들이 있다.

코틀린 코딩 컨벤션

  • 클래스는 프로퍼티, 초기화 블록, 부 생성자, 함수, 동반 객체 순으로 작성한다.
  • 프로퍼티: 코틀린은 기본적으로 필드가 없고, 필드와 getter, setter 혹은 필드와 getter로 이루어져 있다.
    • 그러므로 코틀린에서는 프로퍼티인 필드와 getter, setter 혹은 필드와 getter가 자동으로 생성 된다.
    • 이때, getter의 경우 외부에 보여져도 되나, setter의 경우 외부에 보이지 않게 하고 싶을 수 있다.
    • private set을 선언 해 직접 setter를 접근 제한 할 수 있다.
  • 초기화 블록: 인스턴스를 생성할 때, init 키워드를 사용해 프로퍼티들을 초기화 하거나 생성과 동시에 수행할 함수들을 불러올 수 있다.
    • 초기화 블록은 여러 개 선언 가능하다.
  • 부 생성자: 목록이 다른 생성 방법이 여럿 존재하는 경우 부생성자를 둬 주 생성자를 호출하도록 할 수 있다.
    • 코틀린의 부 생성자는 반드시! 주 생성자를 호출하도록 되어있다.
  • 동반 객체: companion object 키워드를 사용해 생성할 수 있으며, 클래스 내에 하나만 생성 가능하다. 이러한 동반 객체는 코틀린에서는 없는 static을 대신해 companion object를 통해 정적 변수, 함수를 생성할 수 있다.
class Person(val name: String, age: Int = DEFAULT_AGE) {
    var age: Int = age
    private set

    fun introduce() {
        println("Name : $name, Age: $age")
    }

    companion object {
        private const val DEFAULT_AGE = 0
    }
}

생성자

  • 생성자: 코틀린은 간단하고 다양하게 생성자를 정의할 수 있다. 메소드의 수가 많을수록 ‘단일 책임 원칙’을 위반하지만 생성자의 수가 많아질수록 클라이언트가 클래스를 더 유연하게 사용할 수 있다.
    • 단일 책임 원칙이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 한다.
    • 주 생성자는 객체 초기화 프로세스를 시작하는 유일한 장소이기 때문에 제공되는 인자들이 완전해야 한다.
class Person(val name: String, age: Int) {
    var age: Int = age
    private set
}

상수

  • 상수 이름은 밑줄로 구분된 대문자를 사용한다.
  • 최상위 수준에 선언하는 방법과 동반 객체에 선언하는 방법이 있다.

    이러한 방법에는 정답이란 없다. (제이슨…멋져요..)

const val DEFAULT_AGE = 0

함수

  • 코틀린에서는 함수를 꼭 클래스 안에서 안 써도 된다.
  • 매개변수에 함수를 넣어줄 수도 있으며, 반환 값으로도 사용 가능하다.
    • 이를 1급 객체(First-class citizen)이라 한다.
    • 변수나 데이터에 할당 할 수 있어야하며, 함수의 인자로 전달할 수 있고, 함수의 반환 값으로 전달할 수 있는 것을 1급 객체라 한다. 이외에 1급 함수라는 용어도 있다.

스마트 캐스트

  • 어떤 변수가 원하는 타입인지 검사하고 나면 굳이 변수를 원하는 타입으로 캐스팅 하지 않아도 마치 처음부터 그 변수가 원하는 타입으로 선언된 것처럼 사용할 수 있다. 이는 컴파일러가 알아서 알아채기 때문이다.
fun place(titles: String?): String {
    if(text.isNullOrBlank()) 
        throw IllegalArgumentException()
    val title = titles.split(",")   
    // titles는 널 허용 변수로 NotNull !! 연산자를 사용해 null이 아님을 보증해야 하지만, 
    // 앞서 isNullOrBlank 함수로 null 검사를 했기에 스마트 캐스트 되어 그러지 않아도 된다.
    
    ...
}

참고 자료

  • [Do it! 깡샘의 안드로이드 앱 프로그래밍 with 코틀린]
  • 우아한테크코스