Kotlin - 01

|

Kotlin 1

  • 자바와 100% 호환
    • 원하는 부분만 코틀린으로 작성하여 사용가능
  • 세미콜론을 붙이지 않음
  • new 키워드 사용하지 않음
  • null 값을 허용하는지의 여부
    • 허용하는 경우엔 타입의 끝에 ? 를 붙인다.
    • 널 허용 여부에 대한 정보를 포함하지 않는 경우엔 ! 를 붙인다.
  • 변경할 수 있음/없음의 여부
    • 변경할 수 없는 변수는 val, 변경할 수 있는 변수는 var
    • 클래스의 멤버로 사용하는 프로퍼티는 초깃값을 명시적으로 지정해야 함
      • lateinit var을 사용하면 선언 시점에 값을 할당하지 않아도 됨
      • lazy 를 사용하면 변경할수 없는 val을 사용 가능, val 선언 뒤에 by lazy 블록에 초기화에 필요한 코드 작성
  • 람다 지원
  • 스트림 API 지원
  • 값 및 변수 선언 방법
    • 이름을 먼저 적고 타입을 적는다. (val a : String = “foo”)
    • 자동 타입 추론 가능하므로 타입 생략 가능
    • 선언 시 자료를 할당하지 않으면 타입을 붙여야 한다
  • 함수 선언 방법
    • 변수와 동일하게 타입이 뒤에온다.
    • fun greet(name: String) : Unit { }
  • 조건문
    • if/else는 자바와 동일하다
    • when은 switch와 동일하다
      • 값을 반환할 수 있다. (when(str) { str.startsWith(‘a’) -> Log.d(“Message”, “A for Android”)})
  • 반복문
    • 인덱스 기반 for문은 지원하지 않고 for-each만 지원한다.
      • for(item in items)
      • 인덱스를 사용하고 싶은 경우엔 Collection.indices 프로퍼티를 사용하면 된다.
        • for (i in names.indicies)
        • 범위는 .. 연산자를 사용하여 정의한다.
          • for(i in 0..10)
        • unitl 함수를 사용하면 가장 마지막 값을 포함하지 않는 범위를 생성한다.
          • for(i in 0 until 4)
        • downto 함수를 사용하면 반대의 순서로 범위를 생성한다.
  • 비트 연산자
    • 는 or로, &는 and로
  • 문자열 인자는 $를 사용
    • val lengthText : String = “TextLength: ${text.length}”
  • 배열
    • val words : Array = arrayOf("Lorem", "ipsum", "dolor", "sit")
    • val intArr : IntArray = intArrayOf(1,2,3,4,5) - 원시타입 int의 배열
    • val intArr : Array = arrayOf(1,2,3,4,5) - 래퍼 타입 Int의 배열
    • 배열을 인자로 넘기는 경우 (*) 연산자를 사용해서 넘겨야 한다.
  • 가변 인자를 받는경우
    • fun bar(vararg args: String)
  • 컬렉션은 자바와 동일하게 사용 (ArrayList, HashMap, HashSet…)
    • 자료를 수정가능한 MutableCollection, MutableList가 따로 존재
    • 일반 Collection, List에서는 자료를 조회만 할 수 있다.
    • 컬렉션에 접근하거나 수정할때는 인덱스로 접근
      • immutableList[0] = 1
  • 컬렉션을 쉽게 생성하는 함수를 제공

    함수명 자료 수정가능 여부 반환 타입
    listOf() X kotlin.collections.List
    arrayListOf() O kotlin.collections.ArrayList (java.util.ArrayList)
    setOf() X kotlin.collections.Set
    hashSetOf() O kotlin.collections.HashSet (java.util.HashSet)
    linkedSetOf() O kotlin.collections.LinkedHashSet (java.util.LinkedHashSet)
    sortedSetOf() O kotlin.collections.TreeSet (java.util.TreeSet)
  • 접근 제한자
    • 지정하지 않는경우 public으로 간주 (생략하는 것을 권장)
    • 나머지는 자바와 동일
    • internal 접근 제한자는 동일한 모듈 내에 있는 클래스들로의 접근을 제한
  • 클래스 / 인터페이스 본체 없이 이름만으로 선언 가능
    • class Foo 또는 class Foo {}
    • interface Foo 또는 interface Foo {}
  • 추상 클래스 / 인터페이스의 구현
    • abstract class Foo {
          abstract fun bar()
      }
      
      val foo = object : Foo() {
          override fun bar() {
              TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
          }
      }
      
    • 클래스를 상속하는 경우 반드시 부모 클래스의 생성자를 요청해야 한다.
    • open 키워드를 붙이지 않으면 클래스를 상속하거나 함수를 재정의 할 수 없다.
    • 부모 클래스의 메서드를 재정의하는 경우 override 키워드는 강제.
  • 생성자
    • 인자가 없는 기본 생성자
      • init { }
    • 인자가 있는 생성자
      • class Foo(a: Int) {
           init { Log.d("Foo", "Number: $a") }
           }
        
    • 생성자의 인자를 통해 클래스 내부 프로퍼티에 값 할당 가능
      • class Foo(val a: Int, var b: Char) {}
        
    • 주 생성자 외에 다른 생성자가 필요한 경우
      • constructor 키워드를 사용
        • constructor(a: Int) : this(a, 0)
        • constructor() : this(0,0)
        • 자바와는 다르게 추가 생성자를 정의하는 경우 주 생성자를 반드시 호출해야 한다.
        • 인자와 프로퍼티를 함께 선언 불가하므로 프로퍼티 선언의 경우엔 주 생성자에서 해결해야 한다.
  • 함수
    • void 반환값은 Unit으로 사용한다. (ex: fun foo(): Unit{})
      • 선언 시 생략 가능하다.
  • this
    • this@{클래스 이름} 를 사용하면 해당 클래스 명시 (동적으로 생성하였을 경우)
  • 정적 필드 및 메서드
    • 클래스 내에 선언하는것은 불가하고 패키지 단위로 선언할 수 있다.
    • import {패키지 이름}.{값 혹은 함수 이름} 후 사용하면 된다.
    • 객체 안에 정적 객체를 정의할수 있는데, 이를 companion object 라고 한다.
      • companion object {}
      • 이를 사용하면 클래스 내 모든 멤버에 접근할 수 있다.