Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- toCharArray
- map
- 백준 java
- GoingBus
- 스프링 컨테이너
- 카카오
- 리눅스마스터 3과목
- Linux
- java 백준 1차원 배열
- 명령어
- 자바
- 코테
- 리눅스마스터 1급 정리
- 리눅스마스터1급
- Memoir
- 스프링 빈
- 코딩테스트
- 월간코드챌린지
- 반복문
- 개발자 회고록
- Java
- 고잉버스
- 백준 javascript
- 프로그래머스
- Kotlin
- 자바스크립트 코딩의 기술
- JavaScript
- 리눅스
- 문자열
- 연습문제
Archives
- Today
- Total
hoon's bLog
Kotlin array 코틀린 배열 참조 및 사용 emptyArray arrayOf 본문
반응형
배열 정의하기, arrayOf()
- 코틀린에서도 역시 배열 구조를 구현하는 타입은 Array
- 배열 크기를 미리 안다면 표준 함수 중 하나를 사용해 배열을 생성 가능
배열 정의
val a = 배열명<배열타입>
val b = arrayOf("배열원소1", "배열원소2", ...)
예제
fun main(){
val a = emptyArray<String>() // Array<String> (원소 0개)
val b = arrayOf("Hello", "World") // Array<String> (원소 2개)
val c = arrayOf(1, 4, 9) // Array<Int> (원소 3개)
// 방법 1: contentToString 사용
println(a.contentToString())
println(b.contentToString())
println(c.contentToString())
// 방법 2: for 루프 사용
for (item in a) {
println(item)
}
for (item in b) {
println(item)
}
for (item in c) {
println(item)
}
// 방법 3: joinToString 사용
println(a.joinToString(", "))
println(b.joinToString(", "))
println(c.joinToString(", "))
// 방법 4: forEach 사용
a.forEach { println(it) }
b.forEach { println(it) }
c.forEach { println(it) }
}
결과
- 필요에 맞게 contentToString(), jointoString("구분자"), for, forEach문을 이용해서 출력
람다식과 Array()
다음은 사용자가 입력한 값에 이르는 정수의 제곱으로 이뤄진 배열을 만든다.
val size = readLine()!!.toInt()
val squares = Array(size) { (it + 1)*(it + 1) }
println(squares.contentToString()) // [1, 4, 9, 16, 25]
- size에 배열의 크기를 입력받음.
- !!는 null 안전성 연산자로 readLine()이 null을 반환할 수 있기 때문에 !!를 사용하여 null이 아닌 값을 보장한다.
- { (it + 1) * (it + 1) } : 배열의 각 요소를 초기화하는 람다 함수
- it는 배열의 인덱스를 표현하는 변수로 자동 선언되며, 0부터 시작!
원시타입(primitive type), 박싱타입(boxing type)
- 원시타입(primitive type) : 실제 값이 스택 메모리에 저장되는 타입
ex). Int, Long, Short, Byte, Float, Double, Char, Boolean- 원시 타입은 박싱 되지 않은 상태로 메모리에 직접 저장
- 즉, 이러한 타입의 변수는 실제 값 자체를 저장하고 있어 성능이 우수하고 메모리 사용이 효율적이다.
- 박싱타입(boxing type) : 원시 타입을 객체로 감싸는 래퍼 클래스
ex). Integer, Long, Float, Double 등- 객체로 감싸져 힙 메모리에 저장되고, 추가적인 메모리 오버헤드가 발생한다
fun main() {
// 원시 타입
val primitiveInt: Int = 100
println(primitiveInt) // 출력: 100
// 박싱 타입
val boxedInt: Int? = primitiveInt
println(boxedInt) // 출력: 100
// 박싱된 타입의 null 처리
val nullInt: Int? = null
println(nullInt) // 출력: null
// 박싱 타입을 사용하는 리스트
val intList: List<Int?> = listOf(1, 2, null, 4)
println(intList) // 출력: [1, 2, null, 4]
}
- 원시 타입은 메모리와 성능 면에서 더 효율적이며, null 값을 가질 수 없음.
- 박싱 타입은 객체로 감싸져 힙 메모리에 저장되며, null 값을 가질 수 있음.
배열 사용하기
배열타입
- 배열 타입은 문자열 타입과 꽤 비슷하여, size와 lastIndex 프로퍼티가 있고,. 과 인덱스 연산으로 원소에 접근하는 점이 비슷하다.
- 잘못 인덱스를 사용하면 런타임에 IndexOutOfBoundsException이 발생
val squares = arrayOf( 1, 4, 9, 16 )
squares.size // 4
squares.lastIndex // 3
squares[3] // 16
squares[1] // 4
배열 원소 변경
위 코드에 이어서 배열의 원소를 변경해 보겠다.
squares[2] = 100 // squares : 1, 4, 100, 16
squares[3] += 9 // squares : 1, 4, 100, 25
squares[0]-- // squares : 0, 4, 100, 16
- 코틀린에서는 배열의 원소에 직접 연산을 하여, 원본 배열을 변경할 수 있다!
참조형 데이터
- 자바처럼 배열 타입의 변수 자체에는 실제 데이터에 대한 참조를 저장한다.
- 이로 인해 배열 변수에 다른 배열을 대입하면 같은 데이터 집합을 공유한다.
val numbers = squares // numbers에 squares 배열을 대입하며 [0, 4, 9, 16]
numbers[0] = 1000 // 바뀐 데이터가 squares와 numbers에 공유됨 [1000, 4, 9, 16]
println(squares[0]) // 1000
배열 복제
- 원본과 별도의 배열을 만들고 싶다면 copyOf() 함수를 사용해야 한다.
- copyOf()는 필요시 다른 크기의 배열을 만들어 내기도 한다.
val numbers = squares.copyOf()
numbers[0] = 1000 // squares에는 영향이 없다.
squares.copyOf(2) // 뒤가 잘림 [1, 4]
squares.copyOf(5) // 부족한 부분에 0이 채워짐 [1, 4, 9, 16, 0]
다른 타입의 배열은 대입 X
- 배열 타입 변수에 타입이 다른 배열 대입 X
val a = arrayOf(1, 4, 9, 16)
a = arrayOf("one", "two") // Error : can't assign Array<String> to Array<Int>
- 자바는 상위 타입의 배열에서 하위 타입 배열을 대입할 수 있었다.
- 코틀린에서는 배열이 가변 데이터 구조 이므로 이런 대입은 런타임시 문제가 될 수 있다.
배열 원소 추가
- 배열을 생성하면 길이를 바꿀 수 없지만 + 연산자로 원소를 추가한 새로운 배열을 만들 수 있다.
val b = intArrayOf(1, 2, 3) + 4 // 원소를 하나만 추가 : 1, 2, 3, 4
val c = intArrayOf(1, 2, 3) + intArrayOf(5, 6) // 다른 배열을 추가 : 1, 2, 3, 5, 6
배열 비교
- 문자열과 달리 배열에 대한 ==, != 연산자는 원소자체를 비교하지 않고 참조를 비교한다.
- 배열 내용을 비교하려면 contentEquals() 함수를 사용하자.
intArrayOf(1, 2, 3) == intArrayOf(1, 2, 3) // false
intArrayOf(1, 2, 3).contentEquals(intArrayOf(1, 2, 3)) // true
배열 표준 함수
함수 | 설명 | 메서드 | 결과 |
isEmpty | 배열이 비었는지 검사 | intArrayOf(1, 2).isEmpty() | false |
isNotEmpty | 배열에 원소가 있는지 검사 | intArrayOf(1, 2).isNotEmpty() | true |
indexOf | 인자와 일치하는 최초의 배열 아이템의 인덱스를 반환 (일치하는 원소가 없으면 -1) |
intArrayOf(1, 2, 3).indexOf(2) intArrayOf(1, 2, 3).indexOf(4) |
1 -1 |
언제나 새로운 정보 공유와 잘못된 정보
비판/지적/태클은 환영입니다!
도움이 되셨다면 공감♥️, 댓글 부탁드려요:)
끝.
728x90
반응형
'IT > Kotlin' 카테고리의 다른 글
Kotlin 코틀린 문자열 템플릿 및 기본 문자열 연산 (0) | 2024.07.31 |
---|---|
Kotlin 비교와 동등성 (5) | 2023.09.14 |
Kotlin boolean 타입 및 비교 연산 (4) | 2023.09.13 |
Kotlin char 문자 타입 (0) | 2023.08.24 |
Kotlin 정수 타입 (2) | 2023.08.14 |