ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CharArray, Zip, Map, Array, Collection
    Android 2024. 3. 8. 23:33

     

    예외를 처리하는 방법에는 try~catch~finally 문과 throw 문이 있는데, throw 문은 문법적으로 틀리지 않더라도 사용자가 지정한 범위를 넘어가면 예외를 처리할 수 있다.

    if(n !in 1..10000) throw IllegalArgumentException("1부터 10000 사이의 수를 입력하세요!")
    
    catch(e:Exception) {..}
    
    0 % 2 = 0

     

    CharArray

    CharArray의 Char 은 Java의 char 과 대응되고, Array<Char> 의 Char 은 Java 의 Character와 대응된다.

    1. public class CharArray(size:Int)CharArray 생성자를 사용해 초기값을 설정하지 않고 초기화하는 방식으로, 크기만 넘기면 된다. 이때, 기본값은 '\u0000' 으로 설정이 되는데 실제 null 값이 저장되는게 아니라 ASCII 코드인 NUL 문자가 저장되는 것이다.
      • 실제 null 값 : 참조가 없는 값
      • Null 문자 : 실제 값은 있는데 문자 이름이 null 이다
    2. public class CharArray(size: Int, init: (Int) → Char)두번째는 배열의 크기와 인자를 받아오는 방식이다. 원소는 it 으로 받아오는데, 0 부터 1씩 증가한다. init: (Int) → Char 의 의미는 it 으로 0 에서 1씩 증가하는 Int 를 받아오지만, 그 결과값은 결국 Char 로 저장해야 한다는 의미이다. CharArray 배열을 String() 안에 넣으면 문자열로 변환된다.
    val createdArray1 = CharArray(3) { Char(it+65) }
    // it : 0 → 1 → 2
    
    val charArray1 = CharArray(5, {it → if(it%2==0) "수" else "박"})
    // charArray1 = ['수','박','수','박','수']
    
    String(charArray1) // 수박수박수

     

    Zip : 서로 다른 콜렉션의 원소 묶기!

    zip 은 두개의 배열 또는 리스트가 있을때, 인덱스가 같은 값끼리 묶어주는 역할을 한다. 만약에, 배열(리스트)의 크기가 다른 경우, 크기가 작은 쪽에 한하여 쌍을 만들어준다 → 두개의 배열(리스트)에 대해 같은 인덱스끼리 연관이 되어 있는 경우 활용하기 좋다. 접근할 때는, 각각의 쌍에 대하여 인덱스가 0 인건 first, 인덱스가 1인건 second로 접근한다.

    val list1 = listOf(1,2,3,4)
    val list2 = listOf(7,8,9,10,11,12)
    
    list1.zip(list2) // [(1,7),(2,8),(3,9),(4,10)]

    Map : 기존 콜랙션을 조건에 맞게 변형해서 새로운 콜렉션 생성

    map 은 배열의 형태를 변환하는데, 원래 배열의 형태는 변화시키지 않고 새로운 배열을 반환한다. 함수로는 map 과 mapIndexed 가 있다. 추가적으로, mapNotNull 이나 mapIndexedNotNull 의 함수는 결과값에 null 을 포함하지 않고 콜렉션을 생성할 수 있다.

    charList = listOf('a','b','c')
    
    charList.map{it.toUpperCase()} // ['A','B','C']
    
    charList.mapIndexed{idx:Int, s:String → "this is ${idx} : ${s}"}
    // this is 0 : a
    // this is 1 : b
    // this is 2 : c
    
    // map 개념이 들어간 알고리즘 문제
    // map 함수는 원소로 i 를 대신 쓰고, filter 함수는 원소로 it 을 대신 쓴다.
    val left = 13
    val right = 17
    (left..right).map{i -> if((1..i).filter{i%it==0}.size()%2==0) i else -i}.sum()

     

     

    위에서 배운 두가지 개념을 응용하면 내적과 관련된 알고리즘 문제를 더욱 간결하게 풀 수 있다.

    fun solution(a: IntArray, b: IntArray): Int { // a = [1,2,3] b=[4,5,6]
       return a.zip(b).map{it.first*it.second}.sum()
    }
    
    a.zip(b) // [(1,4),(2,5),(3,6)]
    a.zip(b).map{it.first*it.second} // [1*4,2*5,3*6] = [4,10,18]
    a.zip(b).map{it.first*it.second}.sum() // 4 + 10 + 18

     

    Flatten 

    flatten은 2차원 이상의 콜렉션을 전부 1차원으로 형태 변환해주는 함수이다.

    val nestedList = listOf(listOf(1,2), listOf(3,4,5), listOf(6,7))
    // [[1,2],[3,4,5],[6,7]]
    nestedList.flatten() //[1,2,3,4,5,6,7]

     

    문자열이 어떤 값과 같은지 확인할 때 위의 형태가 아니라 아래의 형태로 써야함에 주의하자(내가 위의 형태로 많이 쓴다...)

    if(name1=="남") // 올바른 형태X
    if(names1.equals("남")) // 올바른 형태O

     

    배열

    배열은 크기가 정적으로 정해져 있다. arrayOf() 함수를 사용하며, 소괄호() 안에는 정수, 문자 등이 들어갈 수 있다. (정수형 배열, 문자형 배열) 그냥 print(arr) 을 할 경우, 배열 안에 있는 원소 값이 출력되는게 아니라 해시코드가 출력된다. 아래의 다차원 배열은 3 x 3 형태의 2차원 배열을 만들고, 원소로 정수 0 을 넣는다는 의미이다. 또한, withIndex 함수를 이용해 배열의 인덱스와 원소 값에 루프를 돌면서 접근할 수 있다.

     

    var arr = arrayOf(1,2,3,4,5)
    print(Arrays.toString(arr)) // 배열 요소 모두 출력1
    print(arr.joinToString()) // 배열 요소 모두 출력2
    
    // 다차원 배열
    val matrix = Array(3) {Array(3) {0} }
        for(row in matrix) {
            for(element in row) {
                print("$element ")
            }
            println()
        }
        
    for ((idx, num) in arr.withIndex()) {
            println("${idx}번째 원소 : ${num}")
        }

    콜렉션

    1. List

    listOf 함수는 읽기 전용 함수로, 수정이 불가능하다. mutableListOf 함수는 수정 가능한 함수로, 인덱스에 접근해 값 변경이 가능하다. 배열리스트인 ArrayList 는 mutableList 와 동일하게 값 변경이 가능하다.

    var list1 = listOf(1,2,3) 
    
    var list2 = mutableListOf(4,5,6)
    // var students = mutableListOf<자료형>() → 다른 형태. 아직 값을 받아오지 않음.
    // <자료형> 은 굳이 명시하지 않아도 된다.
    
    var list3 = ArrayList<자료형>(값)
    var list3 = arrayListOf(1,2,3)

    2. Map

    mapOf 함수는 읽기 전용으로 수정 불가능하고, mutableMapOf 함수는 수정이 가능하다. 

    val map1 = mapOf("color" to "빨강", "animal" to "나비", "좋아하는 숫자" to 24)
    
    val map2 = mutableMapOf("color" to "빨강", "animal" to "나비", "좋아하는 숫자" to 24)
    map2["color"]="노랑"
    // var averages = mutableMapOf<String, Int>()
    // var averages = mutableMapOf<key 자료형, value 자료형>() ← 아직 값이 들어있지 않은 상태
    
    for((k,v) in map2) println("${k} : ${v}")

    3. Set

    set은 순서가 존재하지 않고 중복이 존재하지 않는 콜렉션이다. 따라서 인덱스가 존재하지 않는다. 특정 값의 위치를 확인하는 것보다는 값 자체가 존재하는지 확인할 때 많이 쓴다. setOf 함수는 읽기 전용이고, mutableSetOf 는 수정 가능한 함수이다. add 함수, remove 함수 등이 있고, 셋 안에 원소가 포함되어 있는지 확인할 때는 contains 함수를 쓴다. 두 개의 셋을 합치는 합집합 함수는 union, 교집합은 intersect, 차집합은 substract 함수를 쓴다.

    var set1 = setOf("나무","바람","햇빛","강물")
    
    var set2 = mutableSetOf("사람","빌딩","도시","바람","햇빛")
    set2.add("자동차")
    set2.remove("빌딩")
    
    if(set2.contains("사람") {..}
    
    set1.union(set2) // 합집합 ["나무","바람","햇빛","강물","사람","빌딩","도시"]
    set1.intersect(set2) // 교집합 ["바람","햇빛"]
    set1.substract(set2) // 차집합 ["나무","강물"]
Designed by Tistory.