[Kotlin] 코틀린 기본 문법 모음

유재민·2022년 6월 6일
0
post-thumbnail

🤷🏻‍♀️ Who is Kotlin?

  • 객체 지향 언어
    (프로그램을 다수의 객체로 만들고, 이들끼리 서로 상호작용하도록 만드는 프로그래밍 언어)
  • 자바와 100% 연계되는 문법 사용
  • JVM에서 동작
  • 2017 구글 I/O에서 안드로이드 공식언어로 지정

변수 선언

: 타입을 지정해도되고 안해도 됨

val

  • 한번 할당하게 되면 더이상 수정 불가능 (초기화만 가능)
  • Java의 final과 동일
  • 변수의 참조가 가리키는 객체 내부 값은 변경 가능
val nameArray = arrayListOf("Jame")
nameArray.add("Tom")
println("result: $nameArray")

var

  • 초기화 후에도 값 수정 가능
  • 그러나, 다른 타입의 값은 할당 불가능 error: Type mismatch

Null check

?

  • 타입 뒤 ? 를 붙이면 null 사용 가능
val s: String? = null
  • ?. 연산자
fun getLen(s: String?){
	val sLength: Int? = s?.length
    println(sLength)
}

s가 null이 아닐때만 length 함수 실행 / null 이면 null 반환

  • ?: 연산자 (Elvis operator)
val sLength: Int? = s?.length ?: 0

null 일 경우 0 반환

!!

  • null이 확실하게 들어오지 않는 상황에서만 사용
fun getLength(s: String?): Int = s!!.length

s에 null이 들어오면 NPE 발생


범위 지정 함수

  • 특정 객체에 대한 작업을 블록 안에 넣어 실행할 수 있도록 하는 함수
  • 가독성 증가 -> 유지보수 편함

let 함수

  • null이 가능한 객체가 null이 아닐 때 코드 실행
name?.let{ println(it) }

it은 null이 될 수 없음

with 함수

  • 객체의 중복 사용 제거
val person: Person = Person()
println(person.name)
println(person.age)

기존코드

val person: Person = Person()
with(person){
	println(name)
    println(age)
}

with 함수 사용 코드

inline fun <T, R> with(receiver: T, block: T.() -> R): R{
	return receiver.block()
}

with 함수 동작 코드
recevier : 수신 객체
block : 수신 객체 지정 람다

also 함수

  • with 와 비슷한 방식이지만 코드 블록으로 수신 객체 전달 시 차이점이 있음
  • parameter로 명시적 전달 (with: receiver로 암시적 전달)
  • 디버깅 시 사이드 이펙트, 값의 확인 등 객체의 유효성 검사
val person: Person = getPerson().also{
	println(it.name)
    println(it.age)
}

apply 함수

  • 수신 객체 람다 내부에서 수신 객체의 함수를 사용하지 않고,
    수신 객체 자신을 다시 반환 하려는 경우에 사용
  • 생성과 동시에 초기화 후 자기자신 반환
  • 객체 초기화 시 주로 사용
val james = Person().apply {
	name = "James"
    age = 25
}

대표적인 apply 사용인 객체 초기화 예

run 함수

  • 어떤 값을 계산할 필요가 있거나, 여러 개의 지역 변수의 범위 제한
val inserted: Boolean = run {
	// person과 personDao의 지역변수 범위 제한
    val person: Person = Person()
    val personDao: PersonDao = PersonDao()
    
    // 수행 결과 반환
    personDao.insert(person)
}

형변환

  • to변수() 를 통해 형변환 가능
val a: Int = 123
val b: String = a.toString()
println(b)

for 문

in, ..

for (i in 1..3) {
	println(i)
}

1부터 3까지 순서대로 출력

in, until

for (i in 1 until 3){
	println(i)
}

// 1
// 2

until은 마지막 3을 포함하지 않음

step

for (i in 1..5 step(2)){
	println(i)
}

// 1
// 3
// 5

step 수만큼 증가

downTo, step

for (i in 5 downTo 1 step(2)){
	println(i)
}

// 5
// 3
// 1

downTo는 값을 감소

List

val list = arrayListOf("A", "B", "C")
for (i in list){
	println(i)
}

// A
// B
// C

in 다음에 숫자가 아닌 list를 넣게되면 list안의 값들이 순차적으로 i에 담기게 됨

List, indices

for (i in list.indices){
	println(i)
}

// 0
// 1
// 2

indices를 사용하면 list 길이만큼 for문을 돌리는 것이 아닌 list index 출력이 가능함

List value and indices

for ((i, v) in list.withIndex()){
	println("$i, $v")
}

// 0, A
// 1, B
// 2, C

list 값과 index를 둘 다 출력하고 싶은 경우 withIndex를 사용함


배열

arrayOf

  • 선언과 동시에 개별 원소 값 지정
  • 다양한 타입의 데이터를 넣을 수 있음
val anyArray = arrayOf(1, "안녕하세요", true, 1.1)
  • 제네릭을 사용해 특정 타입을 지정할 수 있음
val intArray = arrayOf<Int>(10, 20, 30)
val stringArray = arrayOf<String>("하나", "둘", "셋")
  • 코틀린에서 제공하는 기본타입의 배열함수 이용 가능
val intArray = intArrayOf(100, 200, 300)
val charArray = charArrayOf('A', 'B', 'C')
val booleanArray = booleanArrayOf(true, false)
  • null 배열 선언
  • 자료형 타입이나 사이즈가 없으면 오류 발생
val nullArray = arrayOfNulls<String>(5) // {null, null, null, null, null}

Array

  • 개별 원소 지정 x
  • 람다식 사용 가능
val zeroArray = Array(5) {0} // {0, 0, 0, 0, 0}
val idxArray = Array(5) {i->i+1} // {1, 2, 3, 4, 5}
  • 제네릭 사용
val intArray = Array<Int>(3, {0})
val stringArray = Array<String>(3, {""})
  • 코틀린 제공 클래스
val intArray = IntArray(10, {0})
val charArray = CharArray(10, {''})

listOf

  • 읽기 전용 (배열 안 내용 수정 불가)
val list = listOf(100, 200, 300)
// list.add x
// list.set x
println(list.get(0)) // 100

arrayListOf

  • 가변 배열
  • ArrayList 반환
val arrayList: ArrayList<Int> = arrayListOf<Int>()
arrayList.add(100)
arrayList.add(200)
println(arrayList)

// {100, 200}

arrayList.remove(100)
println(arrayList)

// {200}

mutableListOf

  • 가변 배열
  • MutableList 반환
val mutableList: MutableList<Int> = mutableListOf<Int>()
mutableList.add(100)
mutableList.add(200)
println(mutableList)

// {100, 200}

mutableList.removeAt(0)
println(mutableList)

// {200}

값 접근

  • 인덱싱으로 접근함
  • set, get 함수로도 가능
array[0] = 'A'
  • !주의: 배열에 여러 자료형이 담긴 경우 값의 변경이 안됨
val array = arrayOf(1, "안녕", true, 1.1)
array[0] = 3 // 오류 발생
println(array[0]) // 정상 실행

2차원 배열

val arr1 = Array<Array<Int>>(3) {Array<Int>(3) {0}}
val arr2 = Array(3, {Array(3, {0})})

3차원 배열

val arr = Array(10){Array(10){Array(10){0}}}

진수 변환

2, 8, 16진수 to 10진수

println(Integer.parseInt("A", 16))

// 10

10진수 to 2, 8, 16진수

println(Integer.toBinaryString(10))
println(Integer.toOctalString(10))
println(Integer.toHexString(10))

// 1010
// 12
// a
profile
유잼코딩

0개의 댓글