• 변수

    • 필드: 일반적인 자바의 변수를 생각하면 된다
    • 접근자: Getter, Setter와 같은 변수 접근자
    • 프로퍼티: 필드 + 접근자를 합쳐 프로퍼티라고 부른다
    • backing field
      • 접근자에서 접근하는 변수(필드)를 말한다.
      • 가변적인 변수의 경우 backing property를 이용하여 field가 재 할당 되더라도 정상적으로 호출이 가능하게 만들기 위해 사용된다
    • val Vs var Vs const
      • val: 프로퍼티에서 getter만 생성된다
      • var: 프로퍼티에서 getter와 setter이 생성된다
      • const: public static final로 컴파일된다
    • 코틀린에서는 클래스 밖에서도 변수 및 함수 선언이 가능하다 → top class function, variable
    • not null 단언문인 ‘!!’ 키워드 여러 개를 한줄에 함께 사용하지 마라 → 디버깅이 매우 힘들어진다
    • 플랫폼 타입은 코틀린이 Null 관련 정보를 알 수 없는 타입을 말한다
      • IDE에서 함수 시그니쳐 또는 변수에서 제일 뒤에 ‘!’ 으로 표기된다
    • 코틀린에서는 Null이 가능한 원시 타입을 사용하면 래퍼 타입으로 컴파일된다
  • 확장 기능

    • 확장 함수
      • 코틀린에서 원래 객체에 새로운 함수를 추가하기 위한 데코레이터를 말한다
      • fun Int.add(number : Int) = this + number
      • 확장 함수는 실제로 원래의 객체를 Wrapping 한 클래스이기 때문에 private, protected 접근 제어자를 사용할 수 없다
      • 확장 함수는 오버라이드 할 수 없다
      • 확장 함수는 동일 시그니처일 때 실행 우선순위가 가장 낮다 ( 멤버 함수 > 전역 함수 > 확장 함수 )
    • 확장 변수
      • 코틀린에서 원래 객체에 새로운 변수를 추가하기 위한 데코레이터를 말한다
      • val Objects.newNumber : Int
      • 하지만 안 쓰는게 좋다…. → 객체 정의의 범위가 너무 넓어진다
  • 클래스

    • 상속 받은 클래스의 기반 타입의 가시성은 자식 클래스 가시성과 같거나 더 높아야한다
    • 메서드 시그니처에서 타입의 가시성은 메소드의 가시성과 같거나 더 높아야 한다
    • 코틀린의 private는 자바에서의 package-private과 동일하다
    • 중첩 클래스(nested class) → 코틀린 기본
      • 명시적인 요청이 없다면 바깥 클래스 인스턴스에 대한 접근 권한이 없다
    • 내부 클래스(inner class) → 자바 기본
      • 바깥쪽 클래스에 대한 참조가 가능하다
      • this@outer 라는 명령어를 통해 바깥 인스턴스에 접근이 가능하다
    • 봉인 클래스(sealed class)
      • 상속할 하위 클래스의 정의를 제한하는 클래스
      • 클래스 외부의 자신을 상속한 클래스를 만들지 못하게 한다
    • 생성자
      • 코틀린에서는 주 생성자와 부 생성자 2 종류가 존재한다
      • 주 생성자는 생성자 파라미터를 지정하고 초기화하는 프로퍼티를 정의한다
    • 코틀린의 무명 클래스는 바깥의 변수의 값에 대해 수정이 가능하다
  • 인터페이스

    • 인터페이스에 추상 프로퍼티 선언을 넣을 수 있다.
      • 이는 구현 클래스가 반드시 해당 프로퍼티 값을 얻을 수 있는 방법을 제공해야 한다
    • SAM(Single abstract method): 추상 메서드가 단 한 개만 존재하는 인터페이스
      • 람다 형식으로 표현 축약이 가능하다
  • 메서드

    • override 가능한 메서드는 항상 open 상태로 존재한다. 하위 메서드 상속을 금지하기 위해서는 final keyword를 사용해야 한다
    • 가변 인자 함수 ( vararg ) 는 다양한 파라미터를 원하는 만큼 받을 수 있다
      • 가변 인자는 list 등의 인자로 넣을 때에는 '*' (spread 연산자) 를 사용해야 한다
  • 람다

    • 다른 함수에 넘기거나 반환 받을 수 있는 작은 코드 조각
    // 함수의 인자, 반환 타입 지정
    val codeFragment: (Int, Int) -> Int = { x, y -> x + y //함수의 본문 지정
    }
    
    • 이미 함수로 만들어진 기능을 인자로 넘기고 싶다면 차라리 맴버 참조를 사용하라 (EX : class::method )
    • 코틀린 람다는 람다 바깥의 변수를 변경 할 수 있다. 다만 val 변수는 복사해서 가져온다
    • 지연(lazy) 컬렉션 연산
      • 시퀀스를 이용하여 중간 임시 컬렉션을 만들지 않고 연산 시킬 수 있다
      • "".asSequece().filter{ it > 124 }.map { it.toInt }
      • 요소가 매우 많은 컬렉션에 대해서만 사용하라
      • 단순 반복 연산에는 사용하지 말 것
      • 시퀀스 연산에서는 람다가 인라이닝 되지 않기 때문에 기본적인 성능이 더 나쁘다
    • 람다에서의 this 는 그 람다를 둘러싼 객체의 인스턴스를 가르킨다
    • 수신 객체 지정 람다
      • 수신 객체를 명시하지 않고 람다 안에서 객체의 메소드를 호출하는 방법
      • 코틀린에서는 with와 apply가 존재한다
      • fun String.a() = get(1)
      • 위와 같은 확장 함수에서 String 는 수신 객체 타입 , 함수 본문에 쓰이는 this 를 수신 객체라 한다
    • 고차 함수와 인라인 함수
      • 람다에서 바깥 변수를 사용하는 경우 매번 새로운 람다 객체가 생성되므로 주의해야 한다 → 이 때는 inline을 사용하라
      • 람다는 함수 인자를 인라이닝하면 이익이 더 많다
      • 자신을 둘러싼 블록보다 더 바깥의 다른 블록을 반환하는 Return을 Non-Local Return이라 부르며 람다는 기본적으로 Non-Local Return이다
      • 람다식에서는 @label 을 이용한 Local Return을 지원한다
      • 람다와 달리 무명 함수는 기본적으로 Local Return이다
  • 제네릭(Generic)

    • 일반적인 코틀린의 제네릭은 Nullable이다
    • Null을 허용하지 않기 위해서는 ‘<T: Any>’ 와 같이 상한(upper)을 두어야 한다
      • ex: ) fun <T: Any > function : returnValue
    • Type 파라미터에 여러 제약을 가하기 위해서는 ‘where’ keyword를 이용해야한다
    • 실체화된 타입 파라미터
    • 변성(Variance)
    • 스타 프로젝션
    • 함수 인터페이스는 파라미터(입력 값)에 대해서는 반 공변적이고 , 리턴( 출력 값 )에 대해서는 공변적이다
  • 컬렉션

  • 어노테이션

  • 리플렉션