[Hello Kotlin!]
- 2016년에 Jet Brains사에서 만든 언어
- 자바를 보완하기 만들어져서 자바가 동작하는 환경에서는 100% 호환
- 2017에 안드로이드개발의 공식언어로 지정됨 (구글이 지원하겠다는 의미, sdk나 예시코드를 코틀린으로 하는 등..)
- Jet Brains에서 만든 IDE가 Inteli-J, Inteli-J를 기반으로 만들어진 Android Studio 에서 사용할 수 있다.
[기본 변수 선언]
var, val
var은 변수, 두번이상 값을 할당 가능
val은 상수, 선언과 동시에만 값을 할당 가능
lateinit
코틀린은 null-safe타입으로 변수 만들면 초기화를 꼭 해줘야한다.
val로 선언을 했을 때 초기값이 없으면 초기화가 안돼서 lateinit이라는 개념이 등장한다.
전역변수(지역변수는 x), non-null타입에만 가능하다.
전역변수로 설정했는데 초기값을 미리 알지 못하는 경우 사용
하지만 lateinit으로 선언하고 초기화하지 않으면 실행하는 과정에서 에러가 날 수 있다.
lazy
나중에 초기화를 해주겠다는 말이다. 선언 따로 해두고 실제로 사용할 때 초기화 해주겠다는 말이다.
변수 선언시 코틀린의 특징
1. 타입추론을 해준다.
val a = 2
이렇게 쓰면 자동으로 Int로 추론해서 선언해준다.
2. null safe기능이 있어서 초기화가 되어있지 않으면 에러가 날 수 있다.
val str: String
이렇게 선언만하고 이후에 초기화하지 않으면 null
String? 이렇게 끝내야 null이 가능하다.
= 뒤에 if-else문으로 값을 바로 할당할 수 있다. (코틀린의 거의 모든 문법이 반환값을 가지고 있기 때문(?))
[표현식으로 작성한 함수]
fun 함수이름(인자명: 타입, 인자명2: 타입2 ... ): 반환타입(생략가능) {
return 반환값
}
[구문식으로 작성한 함수]
fun 함수이름(인자명: 타입, 인자명2: 타입2 ... ) = 반환값(반환값에 if-else문을 쓸수도 있다.)
ex) fun min(a: Int, b: Int) = if(a < b) a else b
[Primitive types]
정수
- Byte
- Short
- Int
- Long (정수 뒤에 L을 붙여야 Long으로 추론한다.)
실수
- Float (실수 뒤에 f를 붙여야 Float로 추론한다.)
- Double
그 외
- Char
- String
- Boolean (true false null 값을 가진다.)
타입에 대해 더 알아보려면 이 링크를 참고해보는 건 어떨까요?
[반복문]
for
for(변수명 in 시작..끝)
for(변수명 in 시작..끝 step 보폭)
for(변수명 in 시작 downTo 끝)
for(변수명 in 시작 downTo 끝 step 보폭)
for(변수명 in 리스트, 맵, 셋.. 등 컬렉션)
while
while (조건문) {}
do {} while (조건문)
if
반환으로 변수에 값 할당이나 함수 return 을 할 수 있다는 점 이외에는 자바와 크게 다른 것이 없다.
when
(자바의 switch 와 유사)
when(변수) {
값1 -> 명령어1
값2 -> 명령어2
...
else -> {}
}
when(변수) {
값1, 값2 -> 명령어1
값3 -> 명령어3
...
else -> {}
}
in연산자 활용
when(변수) {
in 시작..끝-> 명령어1
!in 10..20 -> 명령어3
...
else -> {}
}
is연산자 활용
when(변수) {
is 타입 -> 명령어1
...
else -> {}
}
[Null-Safe]
Nullable, Null-Safe로 나뉘는 코틀린 vs Nullable만 있는 자바(그래서 예외처리가 필요)
선언시 기본으로 Null-Safe타입으로 선언되고 그 변수에는 null값을 넣을 수 없다.
타입 뒤에 ?를 붙이면 Nullable타입이 된다.
Nullable변수는 ?나 !!와 함께 사용해야 컴파일에 성공한다.
Nullable변수?.멤버 (null일 경우는 실행하지 않겠다는 의미, 이것이 자바의 예외처리와 동일)
Nullable변수!!.멤버 (무조건 null이 아니라고 명시하는, Null-Safe타입으로 치환해주는 와일드카드 !!)
처음엔 뭐가 좋은지 모르겠고 불편하기만 했는데, 확실히 명시적으로 Null 체크를 하다보니 Null Point Error 를 만나는 횟수가 현저히 줄어들었다!
[Scope Function]
(apply, with, let, also, run)
객체에 대해 어떤 것을 해주는 것
코드를 좀 더 읽기 쉽게 해준다.
특징 | 예시 | |
apply | 블록 내부에서 this를 생략하고 객체의 property에 접근 할 수 있고 반환값이 자기자신이라서 주로 객체를 초기화할 때 사용된다. | val student = Student().apply { id = 1 ... } |
also | 객체가 파라미터를 통해서 전달되어 람다의 입력값으로 내려오게 되고 이 람다의 입력값을 it으로 접근할 수 있다. 물론 '변수명->'로 명시해서 사용할 수도 있다. 그리고 그 객체를 다시 반환한다. 객체의 유효성을 확인하거나 디버깅 용도로 사용된다. | Random.nextInt(100). also { value -> } Random.nextInt(100). also { //it으로 접근 } |
let | 주로 null이 아닌 객체에서 람다를 실행할 때 주로사용한다. String의 orEmpty()함수를 붙여주면 빈값이 들어가서 null을 방지할 수 있다. 즉 null-safe한 코드를 작성하기 위해 자주 사용 |
Nullable변수?.let { 반환값/*(?)*/ } //변수가 null이면 반환도 null로 되는듯? |
with | with함수의 반환값은 람다의 결과값. with함수의 인자로 객체를 넣으면 그 객체의 함수,변수들을 호출할 수 있다. |
with(객체) {멤버 } |
run | 어떤 값을 계산할 필요가 있거나, 객체구성과 결과계산이 한번에 있을 때 유용하게 쓰인다. 객체구성이라함은 초기화의미를 가진다. 초기화하고나서 결과계산이 한번에 있을 수 있다. with함수와 비슷하게 반환값이 람다의 결과값이고, 오브젝트의 레버런스인 this가 들어온다. 그러나 with함수와 다르게 확장함수로 사용할 수 있다. | 객체.run { 멤버 반환값} |
[data class]
코틀린은 data class 라는 기능을 제공한다.
class앞에 data를 붙여서 자바의 생성자, getter함수, setter함수, copy, toString, hashCode등등이 자동으로 만들어진다. 그래서 주로 Model클래스를 만들 때 사용한다.
val로하면 setter는 자동 생성되지 않는다. (val은 초기화후 값을 변경하는 게 안되기 때문인가보다)
var로 해야 생성된다.
코틀린은 람다식을 쉽게 이용할 수 있게 해준다.
코틀린이 함수형언어에 가까운 특징을 가지고 있기 때문,
람다식은 함수에 함수를 전달하고 전달된 함수에서 함수를 실행시키는 역할을 한다.
예시)
객체.setOnClickListener(new View.OnClickListener() { onClick(View view)함수});
이렇게 버튼에 setOnClickListener함수를 통해 뒤에있는 OnClickListener라는 인터페이스의 onClick 구현해서 그 구현체를 버튼에 넘겨서 버튼에 클릭이 일어나면 구현체에 있는 onClick함수를 실행하는 방식.
객체.setOnClickListener {v -> }
인터페이스에 메소드가 한개밖에 없을 때는 이렇게 간단하게 람다식으로 구현해서 넘겨줄 수 있다.
v -> 를 생략하고 it으로 대체할 수 있다.
객체.setOnClickListener { }
두가지 방식 모두 같은 View를 파라미터로 넘겨주고 있는 것이다.
나머지 사항은 코틀린 공식홈페이지의 공식 도큐먼트를 읽어보자
'Kotlin' 카테고리의 다른 글
[Kotlin] lambda 와 higher-order function (0) | 2021.08.03 |
---|---|
[Kotlin] 함수 기초 (선언, 반환, default value, compact functions) (0) | 2021.08.03 |
[Kotlin] 리스트, 배열, 반복문에서 흥미로웠던 부분 (0) | 2021.08.03 |
[Kotlin] 기존 클래스의 확장함수 사용 (0) | 2021.07.18 |
[Kotlin] Random (0) | 2021.07.16 |