[코틀린] study day 9

승아·2020년 11월 19일
0

제네릭(generic)

  • 자료형의 객체들을 다루는 메서드나 클래스에서 컴파일 시간에 자료형을 검사해 적당한 자료형을 선택할 수 있도록 해줌
class Box<T>(t: T) { // 제네릭을 사용해 형식 매개변수를 받아 name에 저장
    var name = t
}

fun main() {
    val box1: Box<Int> = Box<Int<(1)
    val box2: Box<String> = Box<String>("Hello")
    
    println(box1.name) // 1
    println(box2.name) // Hello
}
  • 형식 매개변수 이름
    • E : 요소(element)
    • K : 키(key)
    • N : 숫자(number)
    • T : 형식(type)
    • V : 값(value)
    • S, U, V etc. : 두번째, 세번째, 네번째 형식(2nd, 3rd, 4th types)
  • 자료형이 추론 가능한 경우 앵글 브라켓 표현 생략

제네릭 가변성의 3가지 유형

  • 무변성(invariance)
    • 자료형 사이의 하위 자료형 관계가 성립하지 않음
    • 코틀린에서는 따로 지정해 주지 않으면 기본적으로 무변성
class Box<T>(val size: Int)

fun main(args: Array<String>) {
    val anys: Box<Any> = Box<Int>(10) // 자료형 불일치 오류!
    val nothings: Box<Nothing> = Box<Int>(20) // 자료형 불일치 오류!
}
  • 공변성(covariance)
    • 하위 자료형 관계가 그대로 인스턴스 자료형 사이의 관계로 이어지는 경우
    • out 키워드를 사용해 정의
class Box<out T>(val size: Int)

fun main(args: Array<String>) {
    val anys: Box<Any> = Box<Int>(10) // 관계성립으로 객체 생성 가능 Any > Int
    val nothings: Box<Nothing> = Box<Int>(20) // 오류 자료형 불일치 Int > Noting
}
  • 반공변성(contravariance)
    • 자료형의 상하 관계가 반대
    • 하위 클래스의 자료형을 상위 클래스의 자료형이 허용
    • in 키워드를 사용해 정의
class Box<T>(val size: Int)

fun main(args: Array<String>) {
    val anys: Box<Any> = Box<Int>(10) // 자료형 불일치 오류! Any > Int
    val nothings: Box<Nothing> = Box<Int>(20) // 관계 성립으로 객체 생성 가능 Int > Noting
}

배열

  • 데이터를 연속적으로 나열한 형태
  • arrayOf()나 Array() 생성자를 사용해 배열 생성
  • arrayOfNulls()은 빈배열
val numbers = arrayOf(4,5,7,3) // 정수형으로 초기화된 배열
val arr2d = arrayOf(arrayOf(1,2,3),arrayOf(4,5,6)) // 다차원 배열
val mixArr = arrayOf(4,5,7,3,"Chike", false) // 다양한 자료형 혼합 배열
val arr1 = arrayOf<Int>(1,2,3) // Int 자료형으로 제한
val arr2 = intArrayOf(1,2,3) // 위와 똑같음 자료형이름+ArrayOf()로 자료형 제한

arr1.get(2) // arr1에 2번 요소 3을 나타냄 
arr1[2] // 이런식으로 사용 가능
arr1.set(2,7) // arr1 2번 요소를 값 7로 교체

println(Arrays.toString(arr1) // toString()을 사용하여 배열 내용 출력
println(Arrays.deepToString(arr2d)) // 다차원 배열은 이렇게 [[1,2,3],[4,5,6]]

val arr3 = Arrays(5, {i -> i*2 }) // 람다식으로 정의 가능
var a = arrayOfNulls <Int>(1000) // 1000개의 null로 채워진 정수 배열
var a = Array(1000,{0}) // 0으로 채워진 배열
var a = ARray(1000, {i -> myClass(i)} // 특정 클래스 객체로 배열 생성 
  • 기타 API
val arr2 = arr.plus(6) // 하나의 요소를 추가한 새 배열 생성
val arr3 = arr.sliceArray(0..2) //필요한 범위를 잘라내 새 배열 생성

arr.first() // 첫번째 요소
arr.last() // 마지막 요소
arr.indexOf(3) // 요소 3의 인덱스 출력
arr.average() // 배열의 평균 값 출력
arr.count() // 배열의 요소 개수 출력
arr.contains(4) // arr에 4가 포함되어있으면 true 아니면 false
4 in arr // 위와 기능 같음
  • 배열의 순환
arr.forEach { element -> print("$element ") { // forEach에 의한 요소 순환

arr.forEachIndexed({i, e -> println("arr[$i] = $e")}) /// forEachIndexed에 의한 요소 순환

// Iterator의 이용
val iter: Iterator<Int> = arr.iterator()
while(iter.hasNext()) {
    val e = iter.next()
    print("$e ")
}
  • 배열의 정렬
val sortedNums = arr.sortedArray() // 오름차순으로 정렬된 배열을 반환
val sortedNums = arr.sortedArrayDescending() // 내림차순으로 정렬된 배열을 반환

arr.sort(1,3) // sort(FromIndex, toIndex + 1) 요소 1 ~ 2만 정렬
arr.sortDescending() // 내림차순 정렬

val listSorted: List<Int> = arr.sorted() // List 으로 반환
val listDesc: List<Int> = arr.sortedDescending() 

val items = arrayOf<String>("Dog", "Cat", "Lion", "Kangaroo", "Po")
items.sortBy { item -> item.length } // sortBy를 이용한 특정 표현식에 따른 정렬
  • 배열 필터링하기
val arr = arrayOf(1, -2, 3, 4, -5, 0)
arr.filter { e -> e > 0 }.forEach { e -> print("$e ")}

products.minBy { it.price } // 작은 값 골라내기
products.maxBy { it.price } // 큰 값 골라내기

val numbers = arrayOf(1,2,3)
val stars = arrayOf("one", "two", "three")

val simpleArray = arrayOf(numbers, strs) 
val flattenSimpleArray = simpleARray.flatten() // 단일 배열로 반환하기
// [1, 2, 3, "one", "two", "three"]로 출력

문자열의 기본 처리

  • 문자열은 불변(immutable) 값으로 생성
val hello: String = "Hello World!"
println(hello[0]) // H
hello[0' = 'K' // 오류!
var s = "abcdef"
s = "xyz" // 새로운 메모리 공간이 생성된다. 기존 문자열은 GC에 의해 제거됨

StringBuilder

  • 문자열이 사용할 공간을 좀 더 크게 잡아 사용함
  • 단, 기존의 문자열보다는 처리가 좀 느리고, 만일 단어를 변경하지 않는 경우 불필요한 메모리 낭비
  • 문자열이 자주 변경되는 경우에 사용
var s = StringBuilder("Hello")
s[2] = 'x'

s.append("World") // 문자열이 추가되어 HexloWorld
s.insert(10,"Added") // 인덱스 10부터 추가되어 HexloWorldAdded
s.delete(5,10) // 인덱스 5에서부터 10 전까지 삭제되어 HexloAdded

부스트코스 코틀린강좌를 참고하였습니다.

0개의 댓글