Kotlin - 01
12 Apr 2019 | kotlin programming languageKotlin 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 함수를 사용하면 반대의 순서로 범위를 생성한다.
- 인덱스 기반 for문은 지원하지 않고 for-each만 지원한다.
- 비트 연산자
-
는 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의 배열 - 배열을 인자로 넘기는 경우 (*) 연산자를 사용해서 넘겨야 한다.
- val words : Array
- 가변 인자를 받는경우
- 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)
- 자바와는 다르게 추가 생성자를 정의하는 경우 주 생성자를 반드시 호출해야 한다.
- 인자와 프로퍼티를 함께 선언 불가하므로 프로퍼티 선언의 경우엔 주 생성자에서 해결해야 한다.
- constructor 키워드를 사용
- 인자가 없는 기본 생성자
- 함수
- void 반환값은 Unit으로 사용한다. (ex: fun foo(): Unit{})
- 선언 시 생략 가능하다.
- void 반환값은 Unit으로 사용한다. (ex: fun foo(): Unit{})
- this
- this@{클래스 이름} 를 사용하면 해당 클래스 명시 (동적으로 생성하였을 경우)
- 정적 필드 및 메서드
- 클래스 내에 선언하는것은 불가하고 패키지 단위로 선언할 수 있다.
- import {패키지 이름}.{값 혹은 함수 이름} 후 사용하면 된다.
- 객체 안에 정적 객체를 정의할수 있는데, 이를 companion object 라고 한다.
- companion object {}
- 이를 사용하면 클래스 내 모든 멤버에 접근할 수 있다.