(kotlin) Array, Collection

박용석·2023년 7월 14일
0
post-custom-banner

클래스명은 대문자로시작 이후 새로운 단어는 다시 첫 글자는 대문자
함수명과 변수명 첫 글자만 소문자, 이후 새로운 단어는 첫 글자는 대문자
상수명은 모두 대문자로 작성

배열

var 변수 = Array(개수)

배열 객체는 Int, Long, Char 등과 같은 타입 뒤에 Array를 붙여서 만든다.

var students= IntArray(10)
var LongArray = LongArray(10)
var CharArray = CharArray(10)

String은 Int, Double 등과 같은 기본 타입이 아니기 때문에 StringArray는
없지만 다음과 같이 사용할 수 있다.
var stringArray = Array( 10, {item -> ""} )
괄호 안의 첫 번째 숫자인 10만 변경해서 사용하면 그 숫자 만큼 빈 문자열로
된 배열 공간을 할당

배열에 값 입력하기
배열명[인덱스] = 값
배열명.set(인덱스, 값)

배열에 있는 값 꺼내기
배열명[인덱스]
배열명.get(인덱스)

컬렉션
컬렉션(Collection)은 다른 이름으로는 동적 배열이라고도 한다.
배열과는 다르게 공간의 크기를 처음 크기로 고정하지 않고 임의의 개수를 담을 수
있기 때문
컬렉션은 크게 세 가지로 리스트(List), 맵(Map), 셋(Set)이 있으며 각각은 다음과 같은
용도로 사용할 수 있다.

리스트(List)
리스트는 저장되는 데이터에 인덱스를 부여한 컬렉션이며 중복된 값을 입력할 수 있다.
Kotlin에서 동적으로 리스트를 사용하기 위해서는 리스트 자료형 앞에
뮤터블(Mutable) 이라는 접두어(Prefix)가 붙는다.
예를 들면 mutableList, mutableMap, mutableSet이 있다.
배열과 같이 '데이터 탑입Of' 형태로 사용

뮤터블이란
뮤터블(Mutable)이란 변할 수 있다라는 의미를 가지고 있다.
Kotlin은 컬렉션 데이터 타입을 설계할 때 모두 이뮤터블(Immutable: 변할 수 없는)로
설계하였다.
기본 컬렉션인 리스트(List), 맵(Map), 셋(Set)은 모두 한 번 입력된 값을 바꿀 수 없다.
그래서 컬렉션의 원래 용도인 동적 배열로 사용하기 위해서는 뮤터블로 만들어진
데이터 타입을 사용해야 한다.

리스트 생성하기 : mutableListOf

var list = mutableListOf("MON", "TUE", "WED")

리스트에 값 추가하기 : add
mutableList.add("THU")
add 함수를 사용하면 입력될 위치인 인덱스를 따로 지정해주지 않아도 입력되는
순서대로 인덱스가 지정됨

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

var variable = mutableList.get(1)

리스트값 수정하기 : set

mutableList.set(1, "수정할 값")

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

mutableList.removeAt(1)

두 번째 값을 삭제하면 세 번째 값부터 인덱스가 하나씩 감소하면서
빈자리의 인덱스로 이동한다.

빈 리스트 사용하기

var 변수명 = mutableListOf<컬렉션에 입력될 값의 타입>()
var stringList = mutableListOf<String>()

제네릭(Generic)
리스트 컬렉션을 생성하면서 <> 괄호를 사용했는데, 정식 명칭은 제네릭이다.
제네릭은 컬렉션이 사용하는 값의 타입을 지정하기 위한 도구
Kotlin에서 컬렉션은 제네릭을 사용하지 않으면 사용할 수 없다.
단, 값으로 초기화 할 때는 입력되는 값으로 타입을 추론할 수 있기 때문에
제네릭을 쓰지 않아도 생성할 수 있다.

컬렉션 개수 가져오기 : size
size 프로퍼티를 사용하면 컬렉션의 개수를 가져올 수 있다. (mutableList.size)
위에서 set, get 등은 '함수'라고 하고, size는 '프로퍼티'라는 용어를 사용했는데
이 둘을 구분하는 방법은 괄호의 유무이다.

  • 괄호가 있으면 함수
  • 괄호가 없으면 프로퍼티

셋(Set)
셋은 중복을 허용하지 않는 리스트
셋은 인덱스로 조회하는 함수가 없기 때문에 특정 위치의 값을 사용할 수 없다.
리스트와 유사한 구조이지만 인덱스로 조회할 수 없고, get 함수도 지원하지 않음
String 타입의 값을 입력받기 위해 다음과 같이 선언할 수 있다.

var set = mutableListof<String>()

빈 셋으로 초기화하고 값 입력하기
셋은 중복을 허용하지 않는다.

var set = mutableSetOf<String>()
set.add("JAN")
set.add("FEB")
set.add("MAR")
set.add("JAN") // 동일한 값은 입력되지 않음

셋의 값 삭제하기
셋은 값을 직접 입력하여 삭제하여야 한다.

set.remove("FEB")

맵(Map)
맵은 키(Key)와 값(Value)의 쌍으로 입력되는 컬렉션이다.
맵의 키는 리스트의 인덱스와 비슷한데 맵에서는 키를 직접 입력해야 한다.
제네릭으로 키와 값의 데이터 타입을 지정해서 맵을 생성한다.

빈 맵으로 생성하고 값 추가하

var map = mutableMapOf<String, String>()
map.put("key1", "value2")
map.put("key2", "value2")
map.put("key3", "value3")

키와 값을 추가할 때마다 리스트처럼 맵의 공간이 늘어남

맵 사용하기
get 함수에 키를 직접 입력해서 값을 꺼낼 수 있다.

Log.d("CollectionMap", "map에 입력된 key1의 값은 ${map.get("key1")}이다.")

맵 수정하기
put 함수를 사용할 때 동일한 키를 가진 값이 있으면 키는 유지된 채로
그 값만 수정된다.

map.put("key2", "수정")

기존 "key2"의 값인 "value2"는 "수정"으로 바뀌게 된다.

맵 삭제하기

map.remove("key2")

리스트와는 다르게 인덱스에 해당하는 키의 값이 변경되지 않고 그대로 유지됨

컬렉션 값의 단위 = 엘리먼트
컬렉션에 입력되는 값은 각각을 엘리먼트(Element)라고 한다.
엘리먼트는 맵의 입력 단위인 키와 값을 합친 것을 말하는데 이것은 리스트와
셋에서도 동일한 용어로 사용
리스트 엘리먼트 = 리스트의 (값)
맵 엘리먼트 = 맵의 (키와 값)

이뮤터블 컬렉션은 언제 사용할 수 있을까
일반 변수 var와 읽기 전용 변수 val의 관계에서 그 사용법을 유추할 수 있는데,
기준이 되는 어떤 값의 모음을 하나의 변수에 저장할 필요가 있거나 또는 여러 개의
값을 중간에 수정하지 않고 사용할 필요가 있을 때 이뮤터블 컬렉션을 사용한다.
대표적인 예 - 요일 데이터

var dayList = listOf("월", "화", "수", "목", "금", "토", "일")

------------------------------------정리------------------------------------------------
배열
하나의 변수에 여러 개의 정해진 값을 담을 수 있게 해주는 데이터 타입
처음 정해진 값의 개수는 바꿀 수 없다.

컬렉션
여러 개의 값을 담을 수 있는 배열은 값의 개수가 증가하면 사용할 수 없는
단점이 있기 때문에 동적으로 크기를 변경할 수 있도록 만들어진 동적 배열
동적 배열은 리스트, 셋, 맵 세 가지의 데이터 타입이 있으며 이것들을 모두
통칭해서 부르는 용어가 컬렉션

뮤터블
입력된 값을 변경할 수 있는 것을 말함
대표적으로 var로 선언된 변수는 모두 뮤터블

리스트
컬렉션의 한 종류로 인덱스를 사용하는 데이터 타입
인덱스가 있기 때문에 중복된 값을 넣을 수도 있다.


리스트에서 인덱스가 빠진 데이터 타입
값을 중복해서 넣을 수 없다


키와 값을 쌍으로 갖는 데이터 타입
맵의 키는 리스트의 인덱스처럼 사용할 수 있다.

profile
슬기로운 개발 활동
post-custom-banner

0개의 댓글