본문 바로가기
Programming Language/Kotlin

[코틀린 Kotlin] arrayOf, Array를 이용한 배열 선언 및 변경, 여러가지 메소드 활용

by ggyongi 2021. 7. 7.
반응형

 

1. 배열 선언

배열 선언은 크게 arrayOf와 Array 두 가지가 존재한다. 둘의 차이점이라면

arrayOf는 선언과 동시에 개별 원소 값을 지정해줄 수 있지만

Array는 개별 원소값을 지정할 수 없다. 대신 Array는 람다식을 활용할 수 있다. 

개별 원소를 각각 설정하기엔 arrayOf가 훨씬 자유로운 느낌이다.

import java.util.*

fun main() {
    val names = arrayOf("홍길동1", "홍길동2", "홍길동3", 1, 2, 3)     //arrayOf를 통한 배열 선언
    val names2 = arrayOf<String>("홍길동1", "홍길동2", "홍길동3")     // 특정 자료형 지정 가능
    val names3 = arrayOfNulls<String>(3)                //널 배열 선언. 자료형 타입이나 사이즈가 빠지면 오류 발생함.

    val names4 = Array<String>(3, {i -> "Name${i+1}"})  //람다식을 활용한 배열 선언, 람다식의 왼쪽에는 index가 들어감
    val names5 = Array<String>(3){"None"}         //람다식을 밖으로 뺄 수 있으며 화살표 왼쪽은 경우에 따라 생략 가능.
    val names6 = emptyArray<String>()             // 비어있는 배열 선언. 괄호 안에 숫자가 들어가면 오류 발생함.

    println(Arrays.toString(names))
    println(Arrays.toString(names2))
    println(Arrays.toString(names3))
    println(Arrays.toString(names4))
    println(Arrays.toString(names5))
    println(Arrays.toString(names6))
}

// 출력
[홍길동1, 홍길동2, 홍길동3, 1, 2, 3]
[홍길동1, 홍길동2, 홍길동3]
[null, null, null]
[Name1, Name2, Name3]
[None, None, None]
[]

 

2. 값의 변경, 값 불러오기

arrayOf와 Array 모두 값을 변경할땐

변수이름[인덱스] = 새로운 값

을 해주면 된다. 변수이름.set(인덱스, 새로운 값)의 방법도 있으나 위의 방법이 선호된다.

값을 불러올 때도 변수이름[인덱스]를 사용하고 변수이름.get(인덱스)의 방법은 잘 사용되지 않는다.

import java.util.*

fun main() {
    val names = arrayOf<String>("홍길동1", "홍길동2", "홍길동3")
    val names2 = Array<String>(3, {i -> "Name${i+1}"})

    // 값 변경
    names[0] = "Hong"
    names2[0] = "Hong"
    println(Arrays.toString(names))
    println(Arrays.toString(names2))

    // 값 불러오기
    println(names[0])
    println(names2[0])
}


// 결과
[Hong, 홍길동2, 홍길동3]
[Hong, Name2, Name3]
Hong
Hong

 

* 주의할 점: arrayOf에 여러가지 자료형을 섞어 담을 경우 값의 변경이 되지 않는다.

import java.util.*

fun main() {
    val names = arrayOf("Hi", 1, true, "hello")

    // 값 변경
    names[0] = "Hong"   // 오류 발생!

    // 값 불러오기
    println(names[0])   // 정상 실행!
}

 

 

3. 값의 추가 및 삭제

크기가 고정된 채로 생성되는 배열은 값의 추가와 삭제가 불가능하다.

다음과 같이 새로운 변수를 만들어 기존 배열에 원소를 추가한 새 배열을 할당할 수는 있다. 

import java.util.*

fun main() {
    val names = arrayOf<String>("홍길동1", "홍길동2", "홍길동3")
    val names2 = Array<String>(3, {i -> "Name${i+1}"})

    val names3 = names.plus("추가 원소")
    val names4 = names2.plus("추가 원소")
    
    println(Arrays.toString(names))
    println(Arrays.toString(names2))
    println(Arrays.toString(names3))
    println(Arrays.toString(names4))
}

// 출력
[홍길동1, 홍길동2, 홍길동3]
[Name1, Name2, Name3]
[홍길동1, 홍길동2, 홍길동3, 추가 원소]
[Name1, Name2, Name3, 추가 원소]

 

4. 여러가지 메소드

배열은 활용가능한 다양한 메소드를 제공한다.

fun main() {
    val names = arrayOf<String>("홍길동1", "홍길동2", "홍길동3")
    val nums = arrayOf<Int>(2,3,5,1,7,6,4)

    println(names.size)          //배열의 크기 반환
    println(names.reversed())    // 거꾸로 뒤집은 배열을 반환

    println(nums.indexOf(2))        //2의 인덱스를 반환
    println(nums.sorted())           // 오름차순 정렬
    println(nums.sortedDescending()) //내림차순 정렬
    
    val sliced = nums.sliceArray(1..3)   // 인덱스 1부터 3까지의 원소를 배열 형태로 반환
    println(Arrays.toString(sliced))

}

// 출력
3
[홍길동3, 홍길동2, 홍길동1]
0
[1, 2, 3, 4, 5, 6, 7]
[7, 6, 5, 4, 3, 2, 1]
[3, 5, 1]

 

forEach 메소드로 원소 하나씩 출력하기

fun main() {
    val nums = arrayOf<Int>(1,2,3,4,5)
    nums.forEach{value -> println("값은 : $value")}
    nums.forEachIndexed{ idx, value -> println("${idx}번째 : ${value}") }

}

// 출력
값은 : 1
값은 : 2
값은 : 3
값은 : 4
값은 : 5
0번째 : 1
1번째 : 2
2번째 : 3
3번째 : 4
4번째 : 5

 

filter 메소드 : 람다식의 왼쪽 i는 각 원소를 의미한다. 오른쪽의 조건에 만족하는 원소만을 필터링해주는 함수이다.

fun main() {
    val nums = arrayOf<Int>(1,2,3,4,5,6,7,8,9,10)
    nums.filter{i -> i%2==0}.forEach {
        println(it)
    }
}

// 출력
2
4
6
8
10

 

 

참고로 배열과 비슷한 구조체로 리스트가 있는데

리스트는 크기 변경이 가능하여 원소의 추가 및 삭제가 가능하다.

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글