[Chap 3] 코틀린 시작하기

[Chap 3] 코틀린 시작하기

코틀린 언어 소개

코틀린의 등장 배경

- 코틀린이란? JetBrains에서 오픈 소스 그룹을 만들어 개발한 프로그래밍 언어.

- 자바의 가상머신인 JVM에 기반을 둔 언어.

코틀린의 장점

1) 표현력과 간결함(expressive and concise) : 자바보다 간결한 구문

2) 안전한 코드(safer code) : 코틀린은 Null safety를 지원

-> 객체지향 프로그램에서 객체는 널 상태일 수 있으며, 이 때 NullPointerException이 발생할 수 있는데

코틀린에서는 변수를 nullable과 not null로 구분해서 선언하기 때문에 null과 관련된 여러 부분을 컴파일러가 해결

3) 상호 운용성(interoperable) : 코틀린은 자바와 100% 호환. 자바와 코틀린 혼용 가능

4) 구조화 동시성(structured concurrency) : 코루틴corutines을 이용하면 비동기 프로그램을 간소화 가능

- 네트워크 연동이나 데이터베이스 갱신 등에 사용

코틀린 파일 구성

- 확장자는 '.kt'

- package 이름은 kt 파일의 위치와 상관없는 별도의 이름으로도 선언할 수 있다. 이 경우, 컴파일된 클래스 파일은 별도의 이름 폴더에 생성된다.

- 코틀린 파일명을 클래스 파일명과 다르게 선언할 수 있다.

- 변수와 함수는 클래스 안뿐만 아니라 클래스 밖에도 선언할 수 있다.(파일명+Kt로 컴파일)

- 같은 package 안에 선언된 파일은 import 없이 사용할 수 있다.

변수와 함수

변수 선언

1) val(value) : 초깃값이 할당되면 바꿀 수 없는 변수

2) var(variable) : 초깃값이 할당된 후에도 값을 바꿀 수 있는 변수를 선언

val(var) 변수명: 타입 = 값 val data1 = 10

타입 지정과 타입 추론

변수명 뒤에는 콜론(:)을 추가해 타입 명시 가능.

대입하는 값에 따라 타입 유추 가능하다면 생략 가능.

var data1: Int = 10

초깃값 할당

- 최상위에 선언한 변수/클래스의 멤버 변수 : 선언과 동시에 초깃값 할당 필요

- 함수 내부에 선언한 변수 : 선언과 동시에 초깃값 할당할 필요 X

초깃값 미루기

변수를 선언할 때 초깃값을 할당할 수 없는 경우 - 컴파일러에게 알림 필요

1) lateinit : 이후에 초깃값을 할당할 것임을 명시적으로 선언

- 선언과 동시에 초깃값을 할당하지 않아도 되지만 모든 유형의 변수 선언에는 사용 불가

- var 키워드로 선언한 변수에만 사용 가능

- Int, Long, Short, Double, Float, Boolean, Byte 타입에는 사용 불가

lateinit var data: String

2) lazy : 소스에서 변수가 최초로 이용되는 순간 중괄호로 묶은 부분 자동 실행되어 그 결괏값이 변수 초깃값으로 할당

- 변수 선언문 뒤에 by lazy { } 형식으로 선언

val data: Int by lazy{ println("In lazy....") 10 }

데이터 타입

코틀린의 모든 변수는 객체 = 코틀린의 모든 타입은 객체 타입( 기초 데이터 타입 클래스) > 대문자로 시작

- null값 대입

- 객체의 메서드 호출 가능

var data1: Int = 10 var data2: Int? null // null 대입 가능 data1 = data1.plus(10) // 객체의 메서드 이용 가능

1. 기초 타입 객체 : Int, Short, Long / Double, Float / Byte / Boolean

- 기초 데이터를 객체로 표현하는 타입

2. 문자와 문자열 : Char, String

1) Char : 문자를 표현하는 타입. 작은 따옴표로 표시. Number 타입으로 표현 불가

2) String : 문자열을 표현하는 타입

- 큰따옴표(")로 표현한 문자열 : enter, tab 유지하려면 \로 시작하는 이스케이프 시퀀스 필요 ex)

, \t

- 삼중따옴표(""")로 표현할 때는 키보드로 입력한 줄바꿈이나 들여쓰기 등이 데이터에 그대로 반영

-> 사용 시 닫는 따옴표 뒤에 .trimIndent() 자동 추가(문자열 앞에 공백 제거)

- $를 이용해 변숫값 표시

3. Any : 모든 타입 가능

코틀린에서 최상위 클래스. 모든 타입의 데이터 할당 가능

class User var data1: Any = User()

4. Unit : 반환문이 없는 함수

Unit 객체만 대입 가능. 함수에서 반환문이 없음을 명시적으로 나타낼 때 Unit 타입 사용

반환 타입을 생략하면 자동으로 Unit 적용

fun some(): Unit {}

5. Noting : null이나 예외를 반환하는 함수

null만 대입 가능.(데이터로서의 의미 X)

val data1: Nothing? = null fun some1(): Nothing? { return null } // null 반환 함수 fun some2(): Nothing { throw Exception } // 예외를 던지는 함수

6. 널 허용과 불허용

널 허용 : 타입 뒤에 물음표를 추기

널 불허용 : 물음표를 추가하지 않음

함수 선언하기

- fun 키워드 이용

- 함수의 매개변수에는 val이 자동으로 적용.

컬렉션 타입 : 여러 개의 데이터를 표현하는 방법

1. Array : 배열표현

- 배열의 크기, 초깃값 지정 / 배열의 타입은 제네릭(이용하는 곳에서 타입 지정)

(size: Int, init: (Int) -> T) // Array 클래스의 생성자

2. 기초 타입의 배열

- BooleanArray, ByteArray, CharArray, DoubleArray, FloatArray, IntArray, LongArray, ShortArray

val data1: IntArray = IntArray(3, {0, })

- arrayOf() : 배열을 선언할 때 값 할당 -> 기초 타입을 대상으로 하는 ___ArrayOf() 함수 제공

val data1 = arrayOf(10, 20, 30)

3. List, Set, Map(컬렉션 타입 클래스)

Collection 인터페이스를 타입으로 표현한 클래스

순서 중복 List O O Set X X Map 키와 값으로 구성 X(키의 중복)

1) 가변 클래스 : 초깃값을 대입한 이후에도 데이터를 추가하거나 변경 가능 -> size(), get() + add(), set()

2) 불변 클래스 : 초기에 데이터를 대입하면 더 이상 변경할 수 없는 타입 -> size(), get()

구분 타입 함수 특징 List List listOf() 불변 MutableList MutableListOf() 가변 Set Set setOf() 불변 MutableSet MutableSetOf() 가변 Map Map mapOf() 불변 MutableMap mutableMapOf() 가변

- map : Pair 객체를 이용하거나 '키 to 값' 형태로 이용

var map = mapOf(Pair("one", "hello"), "two" to "world")

조건문과 반복문

from http://dev-minji.tistory.com/118 by ccl(A) rewrite - 2021-11-19 01:27:57