반응형
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
참고로 배열과 비슷한 구조체로 리스트가 있는데
리스트는 크기 변경이 가능하여 원소의 추가 및 삭제가 가능하다.
댓글