티스토리 뷰

728x90

 

 

자바와 코틀린을 둘다 사용하고 있어서, 코틀린에 대한 어려움은 없지만..

코딩 테스트에서만 자주 쓰이는 컬렉션 다루는 함수들이나 입출력 관련 함수들은 아직 익숙치 않은 것 같다.

안드로이드 직무는 코딩 테스트 언어를 코틀린으로만 제한하는 경우가 종종 있어서, 

이번 기회에 코테 준비를 위한 코틀린 함수를 정리해보려 한다!

 

 

입력

fun main() = with(System.'in'.bufferedReader()) {
    // Int 읽기
    val integer = readLine().toInt() 
    
    // 입력된 String을 공백 기준으로 나눈 후 Int로 변환
    val nums = readLine().split(" ").map { it.toInt() }
}

자바처럼 속도를 개선하기 위해 Scanner 보다는 bufferedReader를 사용한다.

with 문을 함수에서 작성하면 따로 bufferedReader 객체를 함수 앞에 붙이지 않아도 된다.

 

 

 

출력

fun main() {
    print("Hello World")
    
    val str1 = "hello"
    val str2 = "world"
    print("$str1 $str2 !")
    
    // val bw = System.out.bufferedWriter()
    val bw = BufferedReader(OutputStreamWriter(System.out))
    bw.flush()
    bw.close()
    
    val sb = StringBuilder()
    sb.append(5)
    sb.append("abc")
    
    print(sb)
}

출력도 속도를 위해 BufferedWriter나 StringBuilder를 사용할 수 있다.

System.out.println()는 간단히 print()로 사용할 수 있다.

 

 

 

자료구조

  • 배열
val arr1 = intArrayOf(1, 2, 3)

val arr = IntArray(4) { 0 } // 0, 0, 0, 0
val arr = IntArray(4) { it * 2 } // 0, 2, 4, 6

print(arr.contentToString()) // 배열 원소들 전체 출력

함수나 생성자로 배열을 생성할 수 있다.

람다식 안의 it은 원소의 인덱스를 뜻한다.

val arr = Array(n) {
    BooleanArray(m) 
}

arr[0][0] = true

다차원 배열은 배열 안에 배열을 생성한다. 말그대로 다차원 배열..

 

 

  • 리스트
val list = listOf(1, 2, 3)
val list = mutableListOf(1, 2, 3)

val list = List<Int>(5) { 0 } // 0, 0, 0, 0, 0

코틀린은 불변 객체와 가변 객체를 구별한다.

listOf()는 불변 객체를 생성하기 때문에 리스트를 읽을 수만 있고 수정은 불가능하다.

반면에 mutableListOf()는 가변 객체를 생성하기 때문에 수정이 가능하다.

리스트 뿐만 아니라 map, set 등의 컬렉션도 가변/불변 객체로 나뉘어서 생성한다.

 

여기서 말하는 불변/가변은 val과 var 키워드로는 다른 개념이다.

val, var는 list의 메모리 할당이라고 생각하면 된다.

즉, val로 생성한 list에는 새로운 list를 생성하여 대입하는 것이 불가능하다.

 

 

  • 스택
val stack = MutableList<Int>(4) { it }

stack.add(5) // push
stack.removeLast() // pop
stack.last() // peek

stack.isEmpty()
stack.isNotEmpty()

코틀린에서는 별도의 스택 클래스가 존재하지 않는다.

자바의 라이브러리를 가져다 쓸 수는 있지만, 가변 리스트도 스택처럼 사용할 수 있다.

 

 

val q = LinkedList<Int>()
q.offer(3)
q.peek()
q.poll()

별도의 큐 클래스가 존재하지 않고, LinkedList를 큐처럼 사용한다.

 

 

import kotlin.collections.ArrayDeque

val deque = ArrayDeque<Int>()

deque.addLast(1)
deque.offerFirst(2)

deque.removeFirst()
deque.pollLast()

deque.peekFirst()
deque.peekLast()

 

 

 

데이터 클래스

data class User(val id: Int, val pw: Int)

데이터 클래스를 생성하면 equals(), hashCode(), toString(), copy(), setter(), getter()를 자동으로 생성해준다.

DTO 클래스를 한줄이면 생성할 수 있어서 좋다!

 

 

 

컬렉션 함수

  • map()
println(listOf("red", "green", "blue").map { it.length })                       // 3, 5, 4
println(listOf("1", "red", "2", "green", "3").mapNotNull { it.toIntOrNull() })  // 1, 2, 3

인자로 원소에 적용하고 싶은 함수가 들어간다.

컬렉션 각각의 원소에 대해 함수를 적용하여 새로운 컬렉션을 생성한다.

mapNotNull()은 널이 아닌 값만 새로운 컬렉션의 원소로 추가한다.

 

 

  • 추출
val list = List(6) { it * it } 
println(list.slice(1..3))           // 1, 4, 9
println(list.take(2))               // 0, 1
println(list.drop(2))               // 4, 9, 16, 25
     
println(list.takeWhile { it < 10 })  // 0, 1, 4, 9
println(list.dropWhile { it < 10 })  // 16, 25

slice(): 정수 범위를 통해 리스트나 배열의 일부를 추출한다.

take(): 원소를 주어진 개수만큼 추출한다.

drop(): 주어진 개수만큼 원소를 제거한 나머지를 추출한다.

takeWhile() / dropWhile(): 주어진 조건을 만족하지 못하는 원소를 발견할 때까지 원소를 남기거나 제거한다.

 

 

  • 집계
val list = (1..5).toList()

println(list.reduce { acc, n -> acc + n * 2 }) // 29
println(list.fold(0) { acc, n -> acc + n * 2}) // 30

fold(): 함수를 통해 누적한 값을 반환한다. 초깃값 -> 원하는 대로 지정

reduce(): 함수를 통해 누적한 값을 반환한다. 초깃값 -> 컬렉션의 첫 번째 원소

 

 

  • 필터
val list = listOf("red", "green", "blue")
println(list.filter { it.length > 3 })	// [green, blue]
println(list.filterNot { it.length > 3 })	// [red]

filter(): 조건을 만족하는 원소만을 갖는 새로운 불변 컬렉션 생성한다.

filterNot(): filter()와 반대로, 조건을 만족하지 않는 원소만 남긴다.

 

예전에 정리했던 코틀린 문법/기능들인데, 참고하면 좋을 것 같아 같이 올려본다.

컬렉션 https://thdbs523.tistory.com/344 

고차 함수 https://thdbs523.tistory.com/339

기초 문법 https://thdbs523.tistory.com/321 

 

 

 

 

 

 

참고

https://velog.io/@oune/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%9C%BC%EB%A1%9C-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함