Kotlin 문법- "컬렉션 中 리스트"

SHY(code poet)·2024년 2월 1일

뮤터블 컬렉션
컬렉션(Collection)은 다른 이름으로는 동적 배열이라고도 한다.
배열과는 다르게 공간의 크기를 처음 크기로 고정하지 않고 임의의 개수를 담을 수 있기 때문이다. 여러 개의 값을 담을 수 있는 배열은 값의 개수가 증가하면 사용할 수 없는 단점이 있기 때문에 동적으로 크기를 변경할 수 있도록 만들어진 동적 배열이다.
컬렉션은 크게 세 가지의 데이터 타입으로 리스트(List), 맵(Map), 셋(Set)이 있고, 각각은 다음과 같은 용도로 사용할 수 있다.

※ 뮤터블(Mutable, 변할 수 있다)
입력된 값을 변경할 수 있는 것을 말한다.
Kotlin은 컬렉션 데이터 타입을 설계할 때 모두 이뮤터블(Immutable: 변할 수 없는)로 설계하였다. 기본 컬렉션인 리스트(List), 맵(Map), 셋(Set)은 모두 한 번 입력된 값을 바꿀 수 없다. 그래서 컬렉션의 원래 용도인 동적 배열로 사용하기 위해서는 뮤터블로 만들어진 데이터 타입을 사용해야 한다. 대표적으로 var로 선언된 변수는 모두 뮤터블이다.
즉, kotlin에서 동적으로 리스트를 사용하기 위해서는 리스트 자료형 앞에 뮤터블(Mutable)이라는 접두어(Prefix)가 붙는다. (mutableList, mutableMap, mutableSet)

※ 컬렉션 값의 단위 = 엘리먼트
컬렉션에 입력되는 값은 각각을 엘리먼트(Element)라고 한다.
값이라고 해도 되지만 맵을 지칭할 때 맵의 값(엘리먼트 자체)을 가리키는 건지 엘리먼트의 값(실제 값)을 가리키는 건지, 2개의 용어가 충돌할 수 있기 때문에 엘리먼트라고 이해하고 있는 것이 좋다.
엘리먼트는 맵의 입력 단위인 키와 값을 합친 것을 말하는데 이것은 리스트와 셋에서도 동일한 용어로 사용된다.. 즉 리스트의 값 또한 엘리먼트라고 부른다.
리스트 엘리먼트 = 리스트의 (값)
맵 엘리먼트 = 맵의 (키와 값)

① 리스트(List)

  • 저장되는 데이터에 인덱스를 부여한 컬렉션이며 인덱스가 있기 때문에 중복된 값을 입력할 수도 있다.
    이에 비해, set은 중복을 허용하지 않는다.

a. 리스트 생성: mutablaListOf
-배열의 arrayof와 같이, “데이터 타입of”의 형태로 사용한다.
var mutableList = mutableListOf("MON", "TUE", "WED)
ㄴ변수에 "MON", "TUE", "WED“의 값을 가진 크기가 3인 동적 배열 리스트가 생성된다.

b. 리스트에 값 추가: add
-값이 추가되면서 동적으로 리스트의 공간이 자동으로 증가한다.
mutableList.add("THU")
ㄴ인덱스를 따로 지정해주지 않아도 입력되는 순서대로 인덱스가 지정된다.
"MON": [0], "TUE": [1], "WED": [2] --> "MON": [0], "TUE": [1], "WED": [2], "THU": [3]

c. 리스트에 입력된 값 사용: get
-입력과는 다르게 사용할 때는 인덱스를 지정해서 몇 번째 값 꺼낼 것인지 명시
var variable = mutableList.get(1) / 두번째 값을 꺼낸다. log 사용해서 꺼내보기.
Log.d("Collection", "mutableList의 첫 번째 값은 ${mutableList.get(0)}입니다")
/

d. 리스트값 수정: set
mutalbeList.set(1, "수정할 값")
ㄴ첫번째 인덱스의 값 즉, 두번째 값을 수정하는 것.

e. 리스트값 제거: removeAt
mutableList.removeAt(1)
ㄴ두번째 값을 삭제했음. 이 경우, 세번째 값부터 인덱스가 하나씩 감소하면서 빈자리의 인덱스로 이동한다.
"MON": [0], "TUE": [1], "WED": [2] --> "MON": [0], "WED": [1]
"TUE"가 삭제되면서 3번 째 값인 "WED"의 인덱스는 2에서 1로 바뀌게 된다.

f. 빈리스트 사용
: 아무것도 없는 빈 리스트를 생성하면 앞으로 입력되는 값의 데이터 타입을 알 수 없기 때문에 값의 타입을 추론할 수 없다.
그래서 빈 컬렉션의 경우 앞에서처럼 '데이터 타입Of'만으로는 생성되지 않고 데이터 타입을 직접적으로 알려주는 방법을 사용해야 한다. 즉, 값의 자료형을 선언해 주라는 것이다.
Q. 빈리스트만 만들어 놓고, 값을 넣기만 하면 자연스럽게 타입이 확정되도록 할 순 없나.

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

-빈 리스트 생성 조작 과정

// 생성
var stringList = mutableListOf<String.>()

// 입력
stringList.add("월")
stringList.add("화")

// 사용
Log.d("Collection", "stringList에 입력된 두 번째 값은 ${stringList.get(1)}입니다.")

// 수정
stringList.set(1, "수정된 값")

// 삭제
stringList.removeAt(1) // 두 번째 값이 삭제 됩니다.

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

g. 컬렉션 개수 가져오기: size
size 프로퍼티를 사용하면 컬렉션의 개수를 가져올 수 있다. (mutableList.size)


set, get 등은 '함수'라고 하고, size는 '프로퍼티'라는 용어를 사용했는데, 이 둘을 구분하는 방법은 괄호의 유무.
-괄호가 있으면 함수
-괄호가 없으면 프로퍼티

profile
진정한 개발자는 코드를 두려워하지 않는다. 오히려 코드가 그를 두려워한다.

0개의 댓글