코틀린 언어 특징

  1. 정적 타입 언어
    1. 모든 프로그램의 구성요소의 타입을 컴파일 시점에 알 수 있고, 컴파일러가 타입을 검증 해줌.
    2. 자바와 다르게 개발자가 타입을 선언하지 않아도 타입 추론이 지원됨
    3. 컴파일러가 프로그램 타입의 정확성을 검증하기 때문에 런타임에 프로그램이 오류로 중단될 가능성이 적어짐.
  2. NULL 안전성
    1. 코틀린은 null이 될 수 있는 타입도 지원한다.
    2. null 값 허용여부를 컴파일 단계에서 검사하기 때문에 널 포인터 에러로 인한 프로그램 중단 예방 가능
    3. null pointer exception 에서 자바와 다르게 이 에러를 컴파일 탐임에 에러를 알려준다.
  3. 함수 타입에 대한 지원
    1. 코틀린은 함수형 프로그래밍
    2. 순수함수
      1. 같은 인자에 대하여 항상 같은 값을 반환
      2. 함수 외부의 어떤 상태도 바꾸지 않음
    3. 함수형 프로그래밍에서는 함수를 일급객체로 여김
    4. 일급 객체란
      1. 함수의 인자로 전달 가능
      2. 함수의 반환값으로 사용 가능
      3. 변수에 담기 가능
    5. 람다식 지원
      1. 람다식이란, 다른 함수의 인자로 넘기는 함수, 함수의 결과값으로 반환하는 함수, 변수에 저장하는 함수
      2. 고차 함수 : 고차 함수는 다른 함수를 인자로 사용하거나, 함수를 결과값 반환하는 함수를 말함. 일급 객체 or 일급 함수를 서로 주고 받을 수 있는 함수가 고차함수가 된다.
      3. 일급 객체인 함수, 그로인한 내부 상태가 절대로 바뀌지 않은 불변 객체를 사용해 side effect가 없음. 입력이 같으면 항상 같은 출력을 내놓고, 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않은 순수함수를 사용할 수 있음.
  4. 자바와 호환성
    1. JAVA Virtual Machine이 코틀린의 타겟 플랫폼이기 때문에 자바 메소드 호출, 자바 클래스 상속, 인터페이스 구현 등 자바에서 적용하던걸 모두 코틀린에서 할 수 있음.
    2. 자바 표준 라이브러리 클래스에 의존하기에 자바 라이브러리를 활용 할 수 있다.
  5. 간결성
    1. getter, setter 같은 자바의 보일러 코드를 코틀린에서는 묵시적으로 제공
  6. 안전성
    1. JVM에서 실행 하기 때문에 메모리 안전성과 버퍼 오버 플로우, 동적 메모리 할당의 문제 예방 가능
    2. 정적 타입 언어로 타입 자동 추론을 통해 타입 안전성 보장
    3. null 타입 가능성도 지원하기 때문에 NullPointerException 으로 인한 프로그램 오류 방지
    4. Class Cast Exception 예방 : 자바와 달리 코틀린에서는 타입 검사와 Cast가 한 연산자에 의해 이뤄진다. 어떤 객체의 타입을 검사했고, 그 객체가 그 타입에 속한다면 별도의 Cast 없이 해당 타입의 메소드나 필드 등의 멤버를 사용할 수 있다. 따라서 타입 검사를 생략할 이유가 없기에, 검사를 생략해서 생기는 오류가 발생할 일이 없다.

val과 var의 차이점

  1. val은 불변 변수입니다. val로 지정된 불변 타입 변수는 초기에 값을 할당하게 되면 나중에 값을 변경할 수 없다.
  2. val은 java의 final과 같다고 볼 수 있다.
  3. val은 값을 변경시키는 것은 불가능하지만, 변수의 참조가 가리키는 객체의 내부 값은 변경 가능
  4. var로 지정된 가변 타입 변수는 초기화 후 값의 변경이 가능합니다.
  5. 하지만 var 변수는 다른 타입의 값을 넣을 수는 없습니다.
  6. 이미 정의된 타입을 변경하려면 ‘형 변환’을 해주어야 합니다.

Null Safey와 Nullable Types 이란? Elvis 연산자란?

  1. 코틀린은 NPE를 방지하기 위해, String?, Int? 같은 nullable 타입들을 이용합니다. 이러한 타입들은 null 값을 가질 수 있습니다.
  2. 엘비스 연산자는 이런 nullable 타입들을 안전하게 값을 이용할 수 있도록 사용할 수 있게 합니다. nullable 타입 뒤에 ?: 로 표시하며, nullable 타입의 값이 null 일 경우 오른쪽 값을 이용합니다. null 이 아니면 엘비스 연산자의 왼쪽 값이 변수에 할당 됩니다.

const와 val 비교

  1. 기본적으로 val 프로퍼티는 runtrime에 결정됨.
  2. const 를 붙이면, val은 compile-time에 상수가 됩니다.

!! 와 ? 의 차이점은? nullable 값을 안전하게 이용 할 수 있는 다른 방법은?

  1. !! 는 nullable 타입의 값을 강제로 가져오기 위해 쓰입니다.
  2. !! 은 개발자가 null이 아니라고 확신 할때만 이용해야 합니다. 아니라면 NPE가 발생합니다.
  3. ?(안전한 호출 연산자)는 피연사자가 null이 아닌 경우 일반적인 함수 호출 처럼 작동함. 하지만 수신 객체가 null이면 안전한 호출 연산자는 호출을 수행하지 않고 그냥 null을 돌려 준다.
  4. let 함수를 ? 연산자 뒤에 사용하여, null이 아닌 경우에만 함수 타입의 람다를 실행하게끔 할 수 도 있다.

== 와 === 의 차이점

  1. == : value 비교
  2. ==== : reference 비교

코틀린에서 생성자의 타입들은 어떤 차이가 있는가?

  1. Primary
    1. Class Header에 정의
    2. Logic을 가질 수 없음.
    3. Class당 하나만 존재
  2. Secondary
    1. Class Body에 정의
    2. Primary 생성자가 있는 경우, 반드시 위임 해야 한다.
    3. Logic을 가질 수 있다.
    4. Class 당 1개 이상 존재 가능

코틀린에서 init block이란?

  1. init은 코틀린의 초기화 block 이다.
  2. Primar 생성자가 인스턴스화 되면 실행됨.
  3. Secondary 생성자가 호출되면, Primary 생성자 다음에 실행됨.

생성자 내부 argument들의 타입들은?

  1. var로 따로 지정하지 않는 한, 기본적으로 val이다.

코틀린에서 switch 문에 해당하는 것은? JAVA와의 차이점은?

  1. when 에서는 임의 조건을 검사할 수 있지만, switch에서는 주어진 식의 여러가지 값 중 하나만 선택할 수 있다.
  2. when 은 switch와 다르게 fall-through 를 하지 않고, 조건을 만족하는 가지만 실행한다.

data class 란?

  1. Java에서는 data를 저장하는 class를 생성하기 위해, 변수마다 getter, setter를 설정하고, toString(), haseCode(), copy() 함수를 직접 override 해야 한다.
  2. 하지만 코틀린에서는 class 앞에 data 키워드를 추가하면, 위와 같은 코드를 자동으로 생성해줌.

구조 분해 선언(destructing declaration) 이란?

  1. 구조 분해 선언이란 객체가 가지고 있는 여러 값을 분해해서 여러 변수에 한꺼번에 초기화 할 수 있는 방법
  2. 구조 분해 선언의 내부에서는 각 변수를 초기화 하기 위해 componentN이라는 함수를 호출하게 되며, 여기서 N은 구조 분해 선언에 있는 변수 위치에 따라 붙는 번호 이다.

lazy 와 lateinit

  1. lateinit을 사용하면 변수의 값을 지정하는 작업을 뒤로 미룸.
  2. Nullable 하지 않는 변수를 선언하면서 Assign 하는 작업을 뒤로 미루고 싶을때는 lateinit 키워드를 사용하면 가능하다.
  3. lateinit은 mutable 한 변수만 가능하기 때문에 var 키워드를 가진 변수에서만 사용이 가능하다.
  4. by lazy 키워드는 lateinit과 비슷하게 값을 지정하는 작업을 미루는 것인데, Assign 되는 시점이 변수를 호출하는 시점이다.
  5. by lazy는 immutable 변수에서만 적용이 가능해, val 키워드 변수에만 적용이 가능하다. 변수에 값을 최초에만 설정하고 변경할 필요가 없는 경우에 사용하면 유용하다.