Kotlin

[Kotlin] 코틀린 입문 - 기본 문법

노소래 2021. 7. 16. 00:16

[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를 파라미터로 넘겨주고 있는 것이다.

 

 

 

나머지 사항은 코틀린 공식홈페이지의 공식 도큐먼트를 읽어보자

 

Get started with Kotlin | Kotlin

 

kotlinlang.org