
코틀린에서의 배열 선언

기초타입의 배열
BooleanArray, IntArray...

ArrayOf를 사용한 값 선언

함수 선언 fun
unit 타입 - void(java)
매개변수는값을 변경할 수 X

매개변수 기본값 선언
기본값을 선언하면 호출시 값이 없더라도 문제 X

호출시 매개변수를 지정하여 호출가능

arr 배열
val arr = arrayOf(2.3, 4.3, 7.5, 9.2) // Double 형 길이 4개인 배열
arrayOf 함수를 사용하여 Double 형식의 값을 가지는 배열 arr을 생성합니다.
배열의 길이는 4이며, 각 요소는 2.3, 4.3, 7.5, 9.2입니다.
arr2 배열
val arr2 = intArrayOf(4, 8, 2, 4, 9, 12) // Int 형 배열
intArrayOf 함수를 사용하여 Int 형식의 정수 배열 arr2를 생성합니다.
배열의 길이는 6이며, 각 요소는 4, 8, 2, 4, 9, 12입니다.
arr3 배열
val arr3 = Array<Int>(size = 5) { it * 2 } // 람다식 구문으로 배열 원소 초기값을 설정
Array 생성자를 사용하여 길이가 5인 Int 배열을 생성합니다.
람다식을 사용하여 배열의 각 요소를 초기화하는데, it * 2를 통해 인덱스 값에 2를 곱한 값으로 초기화됩니다.
예를 들어, arr3의 값은 [0, 2, 4, 6, 8]입니다.
arr4 배열
val arr4 = arrayOfNulls<Int>(size = 5) // 각 원소에 null 들어있음
arrayOfNulls 함수를 사용하여 Int 타입의 길이가 5인 배열 arr4를 생성합니다.
배열의 모든 요소는 null로 초기화됩니다.
arr5 배열
val arr5 = emptyArray<Int>() // arr5 변수는 정수 배열로 선언, 배열 생성 안됨
emptyArray 함수를 사용하여 빈 배열을 생성합니다.
arr5는 Int 형식의 빈 배열로, 요소가 없습니다.
arr6 배열
val arr6: Array<String> = emptyArray() // String 형 빈 배열
String 형식의 빈 배열 arr6을 생성합니다.
이 배열도 요소가 없는 빈 배열입니다.
arr7 배열
val arr7 = IntArray(size = 5) // Int 형 배열, 크기만 설정됨
IntArray 생성자를 사용하여 길이가 5인 Int 배열을 생성합니다.
각 요소는 0으로 초기화됩니다.

배열 요소 접근
val x = arr[2]
arr 배열의 인덱스 2에 위치한 요소를 변수 x에 할당합니다.
배열은 0부터 인덱스를 시작하므로, arr[2]는 배열의 세 번째 요소를 의미합니다.
배열 요소 값 수정
arr2[0] = arr2[1] + 2
arr2 배열의 첫 번째 요소(arr2[0])에 두 번째 요소(arr2[1])의 값에 2를 더한 결과를 할당합니다.
이 코드로 arr2 배열의 첫 번째 요소 값이 변경됩니다.
배열 요소에 값을 더하기
arr5 += 1
arr5 배열의 마지막에 1을 추가하려는 시도로 보이지만, 배열에 직접적으로 값을 추가할 수는 없습니다.
Kotlin에서 배열은 불변 크기이기 때문에, 이렇게 값을 추가하는 방식으로는 동작하지 않습니다.
배열 요소에 값을 더하기 - 두 번째 예시
arr5 += 2
위와 동일하게 arr5에 2를 추가하려는 시도로 보입니다.
그러나 arr5는 배열로 선언되었기 때문에 이렇게 값을 더하는 방식으로는 크기를 늘릴 수 없습니다.
배열 내용 출력
println(arr5.contentToString())
arr5 배열의 내용을 문자열로 변환하여 출력합니다.
contentToString() 함수는 배열의 요소들을 문자열 형태로 보여줍니다.
배열에 값을 더하기
arr += 11.3
이 역시 배열에 값을 추가하려는 시도로 보이지만, 배열에 직접적으로 값을 추가할 수 없습니다.
배열에 요소를 추가하려면 arrayListOf 같은 가변 리스트를 사용하거나, 기존 배열을 확장하여 새로운 배열을 생성해야 합니다.

향상된 for 루프 사용
for (e in arr) {
println(e)
}
이 루프는 arr 배열의 각 요소를 순차적으로 탐색합니다.
e는 arr 배열의 각 요소를 나타내며, println(e)를 통해 요소를 출력합니다.
이 방식은 배열의 각 요소에 직접 접근할 때 유용합니다.
인덱스를 이용한 for 루프
for (i in 0..arr.size - 1) {
// 여기서 arr[i]를 통해 요소에 접근할 수 있습니다.
}
이 루프는 인덱스를 사용하여 배열 요소에 접근합니다.
0..arr.size - 1은 0부터 arr 배열의 마지막 인덱스까지 순회하는 범위를 나타냅니다.
배열의 크기가 n일 때, 마지막 인덱스는 n-1이므로 arr.size - 1까지 순회합니다.
arr[i]를 통해 인덱스 i에 위치한 요소에 접근할 수 있습니다.


myfunc 함수 호출 예시
myfunc(a = 4, b = 2.3)
myfunc(a = 5)
myfunc(b = 4.5, a = 8
myfunc 함수는 a와 b라는 매개변수를 받으며, b는 기본값이 1.2입니다.
첫 번째 호출: a에 4, b에 2.3을 전달합니다.
두 번째 호출: a에 5를 전달하고, b는 기본값 1.2를 사용합니다.
세 번째 호출: a에 8, b에 4.5를 전달하여 호출합니다.
myfunc2 함수 호출 예제 (가변 인자와 배열 전달)
1. 기본 가변 인자 호출
myfunc2(2, 3, 4)
myfunc2(2, 3, 4, 5)
myfunc2(2, 3, 4, 5, 6)
myfunc2 함수는 가변 인자 vararg를 사용하여 여러 개의 Int 값을 받을 수 있습니다.
각 호출에서 여러 개의 정수 값이 인자로 전달되며, 함수 내부에서는 data 배열로 처리됩니다.
예를 들어 myfunc2(2, 3, 4) 호출 시, data는 [2, 3, 4]로 구성됩니다.
2. 배열로 myfunc2 호출
myfunc2(*intArrayOf(3, 4, 5, 6, 7, 8, 9))
intArrayOf 함수를 사용하여 [3, 4, 5, 6, 7, 8, 9] 배열을 생성합니다.
myfunc 함수 정의
fun myfunc(a: Int, b: Double = 1.2): Double {
var aa = a
if (a < 5) --aa else ++aa
return aa * b
}
myfunc 함수는 a와 b를 매개변수로 받으며, b의 기본값은 1.2입니다.
aa라는 변수를 a 값으로 초기화합니다.
if 조건문을 통해 a가 5보다 작으면 aa를 1 감소(--aa), 그렇지 않으면 1 증가(++aa)시킵니다.
최종적으로 aa * b를 반환합니다.
myfunc2 함수 정의
fun myfunc2(vararg data: Int) {
println(data.contentToString())
myfunc2 함수는 가변 인자 vararg data: Int를 사용하여 여러 개의 정수 인자를 받을 수 있습니다.
data.contentToString()을 사용하여 배열 data의 내용을 [요소1, 요소2, ...] 형식으로 출력합니다.
예제 출력
myfunc(4, 2.3)을 호출하면, a는 4이므로 aa는 3이 되고, 결과는 3 * 2.3 = 6.9입니다.
myfunc2(2, 3, 4, 5)를 호출하면 [2, 3, 4, 5]가 출력됩니다.
sum 함수
fun sum(a: Int, b: Int) = a + b
두 개의 정수 a와 b를 받아 이들의 합을 반환하는 간단한 함수입니다.
outer 함수 (클로저)
fun outer(a: Int): Unit {
val b = 5
outer 함수는 매개변수 a를 받아 Unit 타입으로 반환합니다.
함수 내부에 b라는 변수를 선언하고 5로 초기화합니다.
outer 함수 내에는 또 다른 함수인 inner 함수가 정의되어 있으며, inner 함수는 outer 함수의 변수 b에 접근할 수 있습니다.
inner 함수 (중첩 함수)
fun inner(c: Int): Int {
val x = 9
return x * 2 + b + c
}
inner 함수는 c라는 정수 매개변수를 받고, 정수 값을 반환합니다.
함수 내부에 x라는 변수를 선언하고 9로 초기화합니다.
return 문을 통해 x * 2 + b + c의 값을 반환합니다.
여기서 b는 outer 함수에 정의된 변수이며, inner 함수에서 접근할 수 있습니다. 이러한 방식으로 inner 함수는 outer 함수의 환경을 "클로저"로 캡처하게 됩니다.
inner 함수 호출
val c = inner(a)
outer 함수 내부에서 inner 함수를 호출하고, a 값을 c 매개변수로 전달합니다.
inner(a)의 결과가 c 변수에 저장됩니다.
클로저의 역할
inner 함수는 outer 함수 내부에서 정의된 함수이기 때문에, outer의 변수 b에 접근할 수 있습니다.
이러한 구조는 클로저(closure)라고 하며, 외부 함수의 변수를 내부 함수가 캡처하고 사용할 수 있는 것을 의미합니다.
이 방식으로 inner 함수는 outer 함수의 변수를 사용할 수 있게 됩니다.

뷰 요소 초기화
val title: TextView = findViewById(R.id.title)
val price: TextView = findViewById(R.id.price)
val button: Button = findViewById(R.id.button)
findViewById를 사용하여 XML 레이아웃 파일에 정의된 TextView와 Button을 참조합니다.
title, price, button 변수는 각각 제목, 가격을 표시할 TextView와 클릭 시 동작을 수행할 Button입니다.
버튼 클릭 리스너 설정
button.setOnClickListener {
if (pos < titles.size) {
title.text = titles[pos]
price.text = prices[pos].toString()
pos++
} else pos = 0
}
button에 클릭 리스너를 설정하여, 버튼이 클릭될 때마다 특정 동작을 수행하도록 합니다.
pos는 리스트에서 현재 표시할 항목의 인덱스를 나타내는 변수로, 리스트 항목을 순차적으로 탐색하는 데 사용됩니다.
리스트 항목 표시 및 인덱스 관리
if (pos < titles.size) 조건문은 pos가 리스트 크기보다 작은 경우에만 실행됩니다. 즉, 리스트의 범위를 벗어나지 않도록 합니다.
title.text = titles[pos]: titles 배열에서 현재 인덱스 pos에 해당하는 항목을 가져와 title TextView에 표시합니다.
price.text = prices[pos].toString(): prices 배열에서 현재 인덱스 pos에 해당하는 항목을 가져와 price TextView에 문자열 형태로 표시합니다.
pos++: 다음 항목으로 넘어가기 위해 pos를 1 증가시킵니다.
else pos = 0: pos가 리스트 크기와 같아지면(리스트의 마지막 항목을 넘어가면) pos를 0으로 재설정하여 처음으로 돌아가도록 합니다.
동작 예시
버튼을 처음 클릭하면 titles[0]과 prices[0]이 표시됩니다.
버튼을 계속 클릭할 때마다 titles와 prices 리스트의 다음 항목이 표시됩니다.
리스트의 마지막 항목에 도달한 후 다시 클릭하면 pos가 0으로 초기화되어 첫 번째 항목이 다시 표시됩니다.
이 코드는 리스트 순회와 순환 반복을 간단히 구현한 예제입니다. 안드로이드 앱에서 버튼 클릭으로 리스트를 순차적으로 탐색하거나 반복할 때 유용하게 사용할 수 있습니다.