[TIL]Kotiln 기본 문법 : 배열과 리스트

지혜·2023년 11월 23일

Android_TIL

목록 보기
4/70

✏231123 목요일 TIL(Today I learned) 오늘 배운 것

📖배열 (Array)

  • 배열 공간의 개수를 할당하거나, 초기화 시에 데이터를 저장해두면 데이터의 개수만큼 배열의 크기가 결정된다.
    => 개수를 정해 놓고 사용해야 한다.(개수 추가/제거 불가능)

1. 배열생성하기 : var 변수 = Array(개수, {할당값})

//원시 타입 배열 클래스로 만들기
//index 0~9 의 10개 공간을 가지고 있는 각 타입의 배열들이다.
var students = IntArray(10)
var longArray = LongArray(10)
var CharArray = CharArray(10)
var FloatArray = FloatArray(10)
var DoubleArray = DoubleArray(10)
var BooleanArray = BooleanArray(10) //초기화 값은 false. null을 가질 수 없다.

//람다식을 통해 생성과 동시에 초기화가 가능하다. (람다식은 ( )밖으로 뺼 수도 있다.)
//제네릭으로 타입을 한정시켜준 배열.
val arr: Array<Int> = Array(3) {0} //arr = [0,0,0]
//개별 원소값을 지정할 수 없지만 람다식을 활용할 수 있다.
val arr: Array<Int> = Array(5,{i -> i*2}) //=>여기서 i는 인덱스 값. arr = [0,2,4,6,8] 

//문자 배열 만들기
var stringArray = Array(10, { item -> "" } )// ""(빈공간) 10개가 만들어져있음.

2. 배열생성하기 : var 변수 = arrayOf(할당값)

//선언과 동시에 개별 원소 값을 지정해 줄 수 있다.
var dayArray = arrayOf("MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN")
var anyArray = arrayOf(1, 400.25, "문자", true) // 특정 타입을 지정하지 않은 상태로 다양한 타입의 데이터를 넣는 배열 생성 가능

//마찬가지로 기본 타입 배열도 가능
var arrayInt = intArrayOf(100, 200, 300)
var arrayChar = charArrayOf('A', 'B', 'C')
var arrayBoolean = booleanArrayOf(false, false, true)

//제네릭으로 타입을 한정할 수도 있다.
var intArray = arrayOf<Int>(10,20,30)
var strArray = arrayOf<String>("십","이십","삼십")

3. 배열에 값 입력(변경)하기. / 꺼내오기

//입력(변경)하기
배열명[인덱스] = 값

배열명.set(인덱스, 값)

//꺼내오기
var 배열을저장할변수 = 배열명[인덱스]
var seventhValue = intArray[6]

var 배열을저장할변수 =배열명.get(인덱스)
var tenthValue = intArray.get(9)

//배열에 추가하기
//컬렉션이 아닌 배열은 add를 지원안해서 plus사용 
배열명.plus(추가할원소) //=> 요소를 추구한 후 새로운 배열 반환.
배열명 += 추가할원소
// 배열은 크기가 고정되었기 떄문에 값의 추가와 삭제가 불가능 하지만 경우에 따라 다음의 경우들로 새 어레이를 만들 수 있다.
  • 당연한 이야기지만, 배열 범위를 벗어난 인덱스에 값을 넣을 경우 Exception 발생으로 프로그램 종료.

📖리스트 (List)

1. 리스트 생성하기 : mutableListOf

  • 개수가 정해지지 않은 동적 배열이다. =>mutable접두어를 붙여야한다.
var mutableList = mutableListOf("MON", "TUE", "WED")

2. 제네릭을 이용하여 빈 리스트 생성하기

var 변수명 = mutableListOf<컬렉션에 입력될 값의 타입>()
//<제네릭>에 해당 되는 타입의 값들을 .add()로 추가할 수 있다.
//사용, 수정, 삭제도 모두 가능하다.

val result = ArrayList<Int?>()  //null이 될 수 있는 int값으로 이뤄진 리스트 생성
//참고로 제네릭 안에 타입에 ?를 붙이면 null이 될 수 있는 값으로 이루어진 리스트를 만들 수 있다.

3. 리스트에 값 추가, 수정(변경)하기. / 꺼내오기 / 제거하기

//값 추가하기 (입력하는 순서대로 인덱스 지정) : 공간 자동 증가
배열명.plus // 요소를 추가한 새로운 리스트 반환
배열명.add(추가할 값) //컬렉션은 plus는 물론, add도 지원.
배열명 += 추가할 값

//값 수정(변경)하기
배열명.set(인덱스번호, 수정할값)

//입력된 값 꺼내오기
배열명.get(인덱스번호) //인덱스 지정 필수

//값 삭제하기 : 삭제된 값에 해당하는 인덱스는 비워져있지 않고 그 다음 값들이 당겨져서 채워진다.
배열명.remove(삭제할값)
배열명.removeAt(인덱스번호)
//예를 들어 두 번째 값을 삭제하면 세 번째 값부터 인덱스가 하나씩 감소하면서 빈자리의 인덱스로 이동한다.
//"MON": [0], "TUE": [1], "WED": [2] --> "MON": [0], "WED": [1]

4. List , MutableList, ArrayList

참조 : https://zladnrms.tistory.com/140
  • list와 mutableList차이
    : Read-only인지 아닌지 차이 =>이마저도 컴파일에서는 그냥 둘다 list

    • listOf : 읽기 전용타입 (immutableList : 변경불가능리스트)
    • mutableListOf, arrayListOf : 변경가능 타입
  • mutableList와 ArrayList차이
    : 현재 Kotlin에서는 mutableList나 arrayListOf나 둘 다 ArrayList를 반환한다.

    • MutableList = 추가, 삭제 등 수정이 가능한 리스트
    • ArrayList = 내부에 Array로 구현되어 있는 (추가, 삭제 등 수정이 가능한) 리스트
      => MutableList 중에서도 ArrayList를 사용하겠다 라고 명시

📖배열,컬렉션에서 활용 가능한 메소드

배열명.sliceArray(숫자1..숫자2)  //인덱스 숫자1 부터 숫자2까지 원소를 배열 형태로 반환
배열명.slice(숫자1..숫자2) //인덱스 숫자1 부터 숫자2까지 원소를 리스트형태로 반환

배열명.size  //리스트의 크기(개수) 반환

배열명.sum() //배열값들의 합산 값
배열명.average() //배열값들의 평균 값
배열명.count()  // 배열의 요소 개수 세기
배열명.reduce{람다식} // 배열의 첫번째 값부터 시작해서 순서대로 지정한 연산을 수행한 값을 반환
배열명.map{람다식} // 각 요소마다 연산을 수행하여 그 결과를 리스트로 반환한다.

+(플러스)연산자로 동일한 타입의 두 리스트를 하나의 배열로 합칠 수 있다.
-(마이너스)연산자로 앞의 리스트에서 뒤의 리스트 내용을 삭제한 리스트를 얻을 수 있다. (중복 내용도 모두 삭제)

배열명.reverse() //원본 배열 자체를 뒤집는 함수
배열명.reversed()  // 배열의 순서가 뒤집어진 리스트 반환
배열명.reversedArray() //배열의 순서가 뒤집어진 배열 반환

배열명.toString() //배열의 내용을 문자열로 변환하여 

배열명.sort() //리턴값 없이 원본 배열 자체 오름차순 정렬
배열명.sortDescending() //리턴값 없이 원본 배열 자체 내림차순 정렬
배열명.sorted()  //배열을 오름차순으로 정렬해서 리스트로 반환(return값 있음)
배열명.sortedDescending()  //배열을 내림차순으로 정렬해서 리스트로 반환(return값 있음)
배열명.sortBy {it.정렬기준} // 단일 정렬기준에 따라 오름차순으로 정렬
배열명.sortByDescending{it.정렬기준} //단일 정렬기준에 따라 내림차순으로 정렬
배열명.sortWith(compareBy({it.정렬기준1},{it.정렬기준2})) //compareBy를 인자로 하여 다중 조건에 따라 정렬
=> 보통 ~edArray가 붙으면 배열로 반환.
=> ~ed로 끝나면 리스트로 반환.
=> 아무것도 붙지 않는 경우 원본 정렬.

배열명.indexOf(값)  //해당하는 값의 인덱스 번호를 반환
배열명.disctinct() //중복된 값을 제거하여 리스트로 반환한다. (원본 배열,리스트에는 영향이 없다.) 

배열명.first() //배열의 첫번째 값 반환
배열명.first{조건람다식(boolean)} //배열 안에서 조건에 맞는 첫번째 값 반환
배열명.last() //배열의 마지막 값 반환
배열명.last{조건람다식(boolean)} //베열 안에서 조건에 맞는 마지막 값 반환
배열명.contains(값) //해당하는 값이 포함되어 있는지 확인한다. (=> 값 in 배열명 과 같은 표현)

배열명.filter{람다식조건(boolean)} // Boolean이 true일 경우 해당 값은 반환되는 List에 포함 
배열명.filterNotNull() // 리스트의 null 값을 걸러준다.

배열명.forEach{람다식} // 리스트의 원소들을 하나씩 반복한다.
배열명.forEachIndexed{인덱스,value} // 해당 리스트의 value와 그 index까지 같이 하나씩 반복한다.

✏오늘 발생 문제 및 해결

📖새롭게 알게된 것

  • 배열,리스트와 함께 사용되는 메서드들을 정리하면서, 새로운 메서드들도 많이 알게 되었다.
    이렇게 여러 기능을 하는 메서드들이 다 존재하는데, 어디까지 있는 건지 모르니까 막상 찾아보는것도 잘 안하게 되어서, 이렇게 공부하면서 다양한 메서드들을 최대한 알아나가는게 좋을 것 같다.

📖오늘의 문제 발생

  • 풀어놓은 알고리즘 문제를 정리하는데, 리스트를 값으로 반환해야하는 문제가 있었다 : 📖x만큼 간격이 있는 n개의 숫자. 이 문제 말고도 배열만 나오면 형태 못 맞췄다고 오류, 문법적으로 잘못되었다고 오류.. 오류파티여서 꼭 정리해야겠다고 마음 먹었다.

📖해결

  • 타입을 맞추는 것은 명확하게 보여서 비교적 생각하기 쉽지만, 배열과 함께 사용되는 메서드들이 배열로 반환되는지, 리스트로 반환되는지도 따져봐야한다는 것을 이번에 정리하면서 다시 알게 되었다.
profile
파이팅!

0개의 댓글