본문 바로가기

차근차근 코틀린

차근차근 Kotlin(3) - Array, Collection

배열(Array)

- 하나의 변수에 여러 개의 값을 저장할 수 있다.
- 값을 담기 전에 먼저 배열 공간의 개수를 할당하거나 초기화 시에 데이터를 저장해두면 데이터의 개수만큼 배
  열의 크기가 결정된다.
- 먼저 개수를 정해놓고 사용해야 하며 중간에 개수를 추가하거나 제거할 수 없다.

사용법 : var 변수명 = Array(개수)

1. 배열객체는 기본 타입 뒤에 Array를 붙여서 만든다.

  ex) var students = IntArray(10) / LongArray(10) / DoubleArray(10) / CharArray(10) / FloatArray(10) / DoubleArray(10)

 

2. 이후 배열의 공간에 값을 입력한다.

 

· 배열명[인덱스] = 값 ex) students[0] = 10

· 배열명.set(인덱스, 값) ex) students.set(1, 20)

 

↑위처럼 각 공간에 값을 입력하는 방법은 2가지이다.(코드는 동일하나 표현만 다를뿐!)

 

arrayOf() 함수를 사용해서 값을 직접 할당할 수도 있다. ex) var studentsNumber = arrayOf(10, 20, 30, 40, 50)

 

· 문자배열에 빈 공간 할당하기

- String은 기본 타입이 아니기 때문에 StringArray는 없다.

- 대신 var stringArray = Array(10, {item -> ""}) 로 선언 가능

 

 

※ 배열의 범위를 벗어난 인덱스에 값을 할당할 경우

 

 

java.lang.ArrayIndexOutOfBoundsException

java.lang.ArrayIndexOutOfBoundsException 이라는 에러 메시지가 출력된다.

 

3. 배열의 값 꺼내기

 

· 배열명[인덱스] ex) var seventhValue = students[6]

· 배열명.get(인덱스) ex) var tenthValue = students.get(9)

컬렉션(Collection)

- 배열과 같이 여러 개의 값을 넣을 수 있는 자료형이다.
- 하지만 공간의 크기를 처음 크기로 고정하지 않고 임의의 개수를 담을 수 있다는 점이 배열과 다르다.
   → (동적배열)

- Kotlin에서 동적으로 리스트를 사용하기 위해서는 리스트 자료형 앞에 Mutable이라는 접두어가 붙는다.
  ex) MutableList, MutableMap, MutableSet

종류 : List, Map, Set

1. List

- 저장되는 데이터에 인덱스를 부여한 컬렉션이며 중복된 값을 입력할 수 있다.

- Array와 같이 '데이터타입Of' 로 사용 

var vehicle = mutableListOf("자동차", "비행기", "보트", "바이크")         
var array2 = ArrayListOf<Int>()

 

리스트에 값 추가하기(add)

- mutableList 변수에 add함수를 사용해서 값을 추가한다.

dayMutableList.add("THU")

- 값이 추가되면서 동적으로 리스트의 공간이 자동으로 증가한다.

- Index를 지정해주지 않아도 입력되는 순서대로 Index가 지정된다.

 

리스트에 입력된 값 사용하기(get)

-입력할 때는 인덱스를 지정하여 몇 번째 값을 꺼낼 것인지 명시해야한다.

today = dayMutableList.get(3)

 

리스트값 수정하기(set)

- set 함수를 사용해서 특정 인덱스의 값을 수정할 수 있다.

   mutableList.set(1, "Water") //1번 인덱스의 값을 Water로 수정한다는 뜻!

 

리스트에 입력된 값 제거하기(removeAt)

- removeAt 함수로 리스트에 입력된 값의 인덱스를 지정해서 삭제할 수 있다.

mutableList.removeAt(1) 
/* 리스트의 1번 인덱스의 값을 삭제한다는 의미!        
>>>> 1번 인덱스를 삭제함으로써 2번 인덱스부터 인덱스부터는 빈자리의 인덱스로 이동하게 된다.       
>>>> 즉 [2]→[1], [3] →[2], [4] →[3]으로 변하게 된다. */

 

빈 리스트 사용하기 

- 아무것도 없는 빈 리스트를 생성할 경우 입력되는 값의 데이터 타입을 알 수 없기 때문에 값의 타입을 추론할 수 없다.

- 때문에 제네릭<>을 사용해서 데이터 타입을 직접 명시해주어야 한다.

var nameOfStudents = mutableListOf<String>()

 

컬렉션 개수 가져오기(size)

- size 프로퍼티를 사용해서 컬렉션의 개수를 가져올 수 있다.

nameOfStudents.size

 

2. Set

- 중복을 허용하지 않는 리스트이다.

- 리스트와 유사한 구조이지만 인덱스로 조회할 수 없으며 get 함수를 지원하지 않는다.

var set = mutableSetOf<String>()

 

Set 값 입력하기 & 사용하기 

- add 함수를 통해서 값을 입력하고, 인덱스로 조회가 불가능하기 때문에 set의 모든 데이터를 출력해서 사용한다.

fun main() {
    var setOfName = mutableSetOf<String>()

    setOfName.add("평화")
    setOfName.add("진수")
    setOfName.add("나영")
    setOfName.add("평화") // Set은 중복을 허용하지 않기 때문에 이 코드는 결과값에 반영이 안된다.

    print("이름 set 전체 출력 = ${setOfName}")
}

 

 

Set 삭제하기(remove)

- remove함수로 직접 값을 조회해서 삭제할 수 있다.

setOfName.remove("평화")
println("이름 set 전체 출력 = ${setOfName}")

 

3. Map

- Key Value의 쌍으로 입력되는 Collection

- Map에서의 Key는 List의 Index와 비슷하지만 직접 입력해야 한다는 점에서 차이가 있다.

- Generic으로 Key와 Value의 값의 데이터 타입을 지정해서 생성한다. ex) var map = mutableMapOf<String, String>()

 

빈 Map으로 생성하고 값 추가하기(put)

fun maptest(){
	var costOfSubway = mutableMapOf<String, String>()
    
	costOfSubway.put("성인", "1250원")
	costOfSubway.put("학생", "1000원")
	costOfSubway.put("어린이", "800원")
	costOfSubway.put("65세 이상", "무료")
}

 

Map 사용하기(get)

- get()함수에 Key를 입력하여 값을 꺼낼 수 있음

fun mapTest(){
	val sc = Scanner(System.`in`)
    var costOfSubway = mutableMapOf<String, String>()
    println("지하철 요금 조회!")
    
    val name = sc.nextLine()
    costOfSubway.put("성인", "1250원")
    costOfSubway.put("학생", "1000원")
    costOfSubway.put("어린이", "800원")
    costOfSubway.put("65세 이상", "무료")
    
    when(name) {
    	"성인" -> {
        	println(costOfSubway.get("성인"))
            }
        "학생" -> {
        	println(costOfSubway.get("학생"))
            }
        "어린이" -> {
        	println(costOfSubway.get("어린이"))
        }
        "65세 이상" -> {
        	println(costOfSubway.get("65세 이상"))
        }
    }
 }

 

Map 수정하기

- put함수에 Key값을 입력했을 때, 그 Key값이 존재하고 있다면 Key값은 그대로 유지된 채 값만 수정된다.

    costOfSubway.put("성인", "1250원")
    costOfSubway.put("학생", "1000원")
    costOfSubway.put("어린이", "800원")
    costOfSubway.put("65세 이상", "무료")

    costOfSubway.put("성인", "1400원")

위 코드에서 최종적으로 "성인" Key의 Value는 "1400원"이다!

 

Map 삭제하기(remove)

- remove 함수에 Key를 입력해서 값을 삭제할 수 있다.

- 리스트와는 다르게 인덱스에 해당하는 Key의 값은 변하지 않고 그대로 유지된다. 

  (리스트는 인덱스는 유지되고 값들이 한 칸씩 당겨진다.)

costOfSubway.remove("어린이")

 

Immutable Collection

- 코틀린은 일반 배열처럼 크기와 값을 변경할 수 없는 Immutable Collection을 지원한다
- 기존 컬렉션에서 mutable이라는 접두어만 제거된 형태로 사용한다. ex) var list = listOf("1","2")
- 한 번 입력된 값은 변경이 불가능하기 때문에 add, set 함수를 지원하지 않는다. 
- 이뮤터블 컬렉션은 상수로 선언하고 상수명을 대문자로 표시하는게 좋다. Set과 Map도 마찬가지!
val IMMUTABLE_LIST = listOf("JAN", "FEB", "MAR")
Log.d("Immutable Collection", IMMUTABLE_LIST.get(1))