Android - 배열 (Array)
배열 객체를 생성하는 방법 - Array(), arrayOf(), (Type)ArrayOf()
배열 객체를 생성하는 방법에는 세 가지가 존재함.
- Array()
- arrayOf()
- IntArrayOf() - 잘 사용하지 않음
[중요] arrayOf<>() 의 반환 Type 은 Array<String>
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.button.setOnClickListener {
// arrayOf<>() : 원소의 개수가 제한적이고 각 원소의 초기 값이 다를 때 사용.
// type: Array<type>
val strArr: Array<String> = arrayOf<String>("Red", "Green", "Blue")
// Array<>() : 원소의 개수가 많으며 초기 값이 같을 때 사용.
// type: Array<type>
val strArr2: Array<String> = Array(strArr.size) { idx -> strArr[idx] }
// (type)ArrayOf : 대부분의 자료형을 사용할 수 있지만 String Type 은 사용하지 못한다.
// type: (Type)Array
val boolArr = booleanArrayOf(true, false, false)
val intArr:IntArray = intArrayOf(9, 8, 0, 1, 1, 6)
// stringArrayOf 사용 불가.
// val stringArr = stringArrayOf("red", "green", "blue")
binding.textView.text = boolArr.contentToString()
}
}
}
- Array() & arrayOf()
- Array() 와 arrayOf() 의 자료형은 Array<type> 으로 동일하다.
- (type)ArrayOf()
- (type)ArrayOf() 의 자료형은 (Type)Array 로서 다르게 표현됨.
- 대부분의 자료형을 지원하지만 String 자료형은 지원하지 않음.
- stringArrayOf() 는 사용불가.
배열과 List Collection
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.button.setOnClickListener {
// 정적 자료구조. 크기가 정해져 있으며 수정 불가.
val strArr = arrayOf("red", "green", "blue")
// List Collection. Immutable List. 불변 리스트
// 추가, 삭제 및 변경 불가.
val strList = listOf<String>("Red", "Green", "Blue")
// List Collection. Mutable List. 가변 리스트 (동적 자료 구조)
val strList2 = mutableListOf<String>("Red", "Green", "Blue")
// List 내 모든 원소에 대하여 조건을 생성함으로서 Filtering 수행.
binding.textView.text = "${strList.filter { it.length == 3 }}"
// List 내 모든 원소에 대하여 같은 (수정) 동작을 수행.
binding.textView.text = "${strList.map { "Color $it" }}"
// List 와 배열 내의 모든 원소에 대하여 조건을 생성.
// 해당 조건을 충족하는 원소가 하나도 없을 경우 True 반환.
// List 에 적용.
binding.textView.text = "${strList.none { it.length < 4 }}" // false
// 배열에 적용.
binding.textView.text = "${strArr.none { it.length < 4 }}" // false
}
}
}
배열(Array)
- 정적 자료 구조
- 크기가 정해져 있으며 수정이 불가능 하다.
List Collection
- Immutable List (불변 리스트)
- listOf<>()
- 리스트 내 원소의 추가, 삭제 및 변경 불가.
- Mutable List (가변 리스트, 동적 자료 구조)
- mutableListOf<>()
- 리스트 내 원소의 추가, 삭제 및 변경 가능
- 메소드
- .filter { }
- List 내 모든 원소에 대하여 조건을 생성하여 Filtering 수행.
- .map { }
- List 내 모든 원소에 대하여 같은 (수정) 동작을 수행.
- .none { }
- List 와 Array 모두 사용 가능.
- 모든 원소에 대하여 조건을 생성.
- 해당 조건을 충족하는 원소가 하나도 없을 경우 True 반환.
- .any { }
- List 와 Array 모두 사용 가능.
- 모든 원소에 대하여 조건을 생성.
- 해당 조건을 충족하는 원소가 하나라도 있을 경우 True 반환.
문자열 배열 리소스를 Array 객체에 저장
[string.xml] 배열 리소스 생성
<resources>
<string name="app_name">Android Array</string>
<string-array name="colors">
<item>Red</item>
<item>Green</item>
<item>Blue</item>
</string-array>
</resources>
string-array 를 사용하여 문자열 배열 리소스를 생성한다.
문자열 배열 리소스를 MainActivity 의 Array 객체에 저장
string.xml 파일에 정의한 문자열 배열 리소스 (string-array) 를 MainActivity 에서 가져오려면 resources 를 참조.
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.button.setOnClickListener {
// 아래처럼 코드 내에 배열의 원소를 직접 할당하는 경우는 드물다.
// val strArr = arrayOf("red", "green", "blue")
// 대신 아래처럼 타 리소스 파일에 정의한 후 참조하는 방식을 주로 사용함.
val strArr: Array<String> = resources.getStringArray(R.array.colors)
binding.textView.text = strArr.contentToString()
}
}
}
resources.getStringArray()
- 반환 타입
- Array<String>
- 파라미터
- R.array.(string-array name)
For 문과 StringBuilder() 를 사용하여 배열 리소스 탐색
strArr.contentToString()
대신 For 문과 StringBuilder() 를 사용하여 배열 리소스를 탐색해보자.
binding.button.setOnClickListener {
val strArr: Array<String> = resources.getStringArray(R.array.colors)
var sb = StringBuilder()
for (element in strArr) {
sb.append("$element ")
}
binding.textView.text = sb.toString()
}
- StringBuilder 객체 (sb) 를 생성.
- StringBuilder 에 배열의 원소를 append.
- sb.toString() 을 사용하여 StringBuilder 의 모든 원소를 출력.
아래와 같이 for 문에서 원소 자체가 아닌 Index 를 사용하여 Loop 하는 방법도 있다.
binding.button.setOnClickListener {
val strArr: Array<String> = resources.getStringArray(R.array.colors)
var sb = StringBuilder()
for (idx in strArr.indices) {
sb.append("${strArr[idx]} ")
}
binding.textView.text = sb.toString()
}
Array 의 메서드인 indices 사용.
- strArr.indices : strArr 의 범위를 반환.
- idx 는 strArr 의 index 가 되어 Loop.
forEach { } 람다식 사용
binding.button.setOnClickListener {
val strArr: Array<String> = resources.getStringArray(R.array.colors)
var sb = StringBuilder()
// 원소 자체가 움직이므로 it 사용.
strArr.forEach { sb.append("$it ") }
binding.textView.text = sb.toString()
}
(array).forEach { }
- 사용 시 배열의 각 원소에 람다 식을 적용.
it
은 원소 자체가 됨.
forEachIndexed { } 람다식 사용
forEachIndexed { } 를 사용하여 Index 를 추출 할 수 있다.
binding.button.setOnClickListener {
val strArr: Array<String> = resources.getStringArray(R.array.colors)
var sb = StringBuilder()
strArr.forEachIndexed { idx, element -> sb.append("$idx = $element ") }
binding.textView.text = sb.toString()
}
위와 같이 배열의 전체 원소 및 그 Index를 추출 할 수 있다.
Iterator 사용
binding.button.setOnClickListener {
val strArr: Array<String> = resources.getStringArray(R.array.colors)
val iter: Iterator<String> = strArr.iterator()
var sb = StringBuilder()
while (iter.hasNext()) {
sb.append("${iter.next()} ")
}
binding.textView.text = sb.toString()
}
(배열).iterator()
- iterator 를 사용해서 간단한 While 문을 통해 배열 내의 원소를 탐색할 수 있다.
- 자료형: Iterator<type>
배열 객체 생성 및 정렬
배열 정렬 메소드
정렬은 문자의 크기를 ASCII 순서로 비교하게 된다.
아래와 같은 배열을 정렬해보자.
strings.xml
<resources>
<string name="app_name">Android Array</string>
<string-array name="colors">
<item>red</item>
<item>!Green</item>
<item>Blue</item>
</string-array>
</resources>
MainActivity.kt
/* ... */
binding.button.setOnClickListener {
val strArr = resources.getStringArray(R.array.colors)
strArr.sort()
binding.textView.text = strArr.contentToString()
}
/* ... */
정렬 실행 결과
위와 같이 ASCII Code 순으로 오름차 순 정렬된 것을 볼 수 있다.
- 현재 가장 작은 ASCII 값을 가진 문자는
!
이다.
binding.button.setOnClickListener {
val strArr = resources.getStringArray(R.array.colors)
var sb = StringBuilder()
val chArr = Array(strArr.size) { i -> strArr[i][0] }
chArr.forEach { sb.append("ch=${it.code} ") }
binding.textView.text = sb.toString()
}
위 코드로 간단하게 각 문자열의 첫번째 문자 ASCII Code 를 확인해 볼 수 있다.
Android - strings.xml 에 배열 리소스 정의
<resources>
<string name="app_name">Android Array</string>
<string-array name="colors">
<item>red</item>
<item>!Green</item>
<item>Blue</item>
</string-array>
<integer-array name="intArr">
<item>11</item>
<item>22</item>
<item>33</item>
</integer-array>
<string-array name="floatArr">
<item>3.14</item>
<item>23402.3</item>
<item>-0.63</item>
</string-array>
</resources>
위와 같이 <string-array name=”colors”> 와 같은 태그를 이용하여 배열을 정의 할 수 있다.
- string-array, integer-array 는 지원하지만 float-array 는 없음.
- 따라서 실수 배열을 정의해야 하는 경우에는 string-array 로 리소스 생성 후 MainActivity 등과 같은 kotlin 파일에서 toFloat() 등을 사용하여 형 변환 후 사용해야 한다.
실수 배열 사용 예시
binding.button.setOnClickListener {
val intArr = resources.getIntArray(R.array.intArr)
// string 배열로 생성된 실수 배열을 받아온 후
val strArr = resources.getStringArray(R.array.floatArr)
// toFloat() 를 사용하여 형 변환.
val floatArr: Array<Float> = Array(strArr.size) { i -> strArr[i].toFloat() }
binding.textView.text = floatArr.contentToString()
}
지식 공유를 위한 Android 개인 학습 포스트입니다. 피드백은 항상 환영합니다! 긴 글 읽어주셔서 감사합니다.
Task Lists
- 배열 객체를 생성하는 방법 - Array(), arrayOf(), (Type)ArrayOf()
- 배열과 List Collection
- 문자열 배열 리소스를 Array 객체에 저장
- [string.xml] 배열 리소스 생성
- 문자열 배열 리소스를 MainActivity 의 Array 객체에 저장
- For 문과 StringBuilder() 를 사용하여 배열 리소스 탐색
- forEach { } 람다식 사용
- forEachIndexed { } 람다식 사용
- Iterator 사용
- 배열 객체 생성 및 정렬
- 배열 정렬 메소드
- Android - strings.xml 에 배열 리소스 정의
Comments