1.  컬렉션

자바에서 리스트 List, 셋 Set, 맵 Map 등 여러 자료 구조를 사용하는데, 코틀린에서도 이러한 컬렉션을 모두 사용할 수 있을 뿐만 아니라 몇 가지 편리한 함수를 추가로 제공. 또한 코틀린은 컬렉션을 읽기 전용 immutable 컬렉션읽기-쓰기 mutable 컬렉션으로 크게 두 가지로 나눔


1) 리스트 List


  👻 리스트 List는 저장되는 데이터에 인덱스를 부여한 컬렉션이며 중복된 값을 입력할 수 있음
  👻 코틀린에서 동적으로 리스트를 사용하기 위해서는 리스트 자료형 앞에 뮤터블 Mutable 이라는 접두어 prefix가 붙음
        💫  접두어가 있는 리스트도 있지만 잘 사용하지 않기 때문에 항상 mutableList, mutableMap, mutableSet을 사용

 

 뮤터블과 이뮤터블


프로그래밍 언어에서 뮤터블은 변할 수 있는 데이터 타입을 가르키는 용어변수로는 var이 뮤터블
그리고 반대 개념인 이뮤터블 Immutable이 있는데 이것은 val과 같이 변할 수 없는 데이터 타입을 가르키는 용어.

  ⚡️ 코틀린은 컬렉션 데이터 타입을 설계할 때 모두 이뮤터블로 설계
  ⚡️ 기본 컬렉션인 리스트, 맵, 셋은 모두 한 번 입력된 값을 바꿀 수 없음
  ⚡️ 컬렉션의 원래 용도인 동적 배열로 사용하기 위해서는 뮤터블로 만들어진 데이터 타입을 사용해야 함

 

읽기 전용 리스트는 listOf() 함수를 사용
읽기 쓰기 모두 가능한 리스트는 mutableListOf() 함수를 사용
    // 이뮤터블
    val numList = listOf(1, 2, 3)
    println(numList[1]) // 2
    // numList[0] = 10    // error
   // 뮤터블
   val mutableList = mutableListOf("MON", "TUE", "WED") 
    // 3개의 값을 가진 크기가 3인 동적 배열 리스트가 생성

2) 리스트에 값 추가하기 : add


  👻  mutableList 변수에 add 메서드를 사용해서 값을 추가
  👻  값이 추가되면서 동적으로 리스트의 공간이 자동으로 증가

        mutableList.add("THU") 
        // 입력될 위치인 인덱스를 따로 지정해주지 않아도 입력되는 순서대로 인덱스가 지정.
        println(mutableList) 
        // [MON, TUE, WED, THU]

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


  👻  입력할 때와는 다르게 사용할 때는 인덱스를 지정해서 몇 번째 값을 꺼낼 것인지 명시

        var variable = mutableList.get(1) // 두 번째 값을 변수에 저장
        variable = mutableList[1]
        println(variable) // TUE

4) 리스트 값 수정하기 : set


  👻  특정 인덱스 값을 수정

        mutableList.set(1, "수정할 값") // 두 번째 값을 수정
        println(mutableList) // [MON, 수정할 값, WED, THU]
        mutableList[1] = "수정할 값" // 두 번째 값을 수정.

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


  👻  리스트에 입력된 값의 인덱스를 지정해서 삭제

        println(mutableList.get(1)) // 수정할 값
        mutableList.removeAt(1) // 두 번째 값을 삭제
        // 두 번째 값을 삭제하면 세 번째 값부터 인덱스가 하나씩 감소하면서 빈자리의 인덱스로 이동
        println(mutableList.get(1)) // WED

6) 빈 리스트 사용하기


  👻  아무것도 없는 빈 리스트를 생성하면 앞으로 데이터 타입을 알 수 없기 때문에 값의 타입을 추론할 수 없음
  👻  빈 컬렉션의 경우 앞에서처럼 '데이터타입of'만으로는 생성되지 않고 데이터 타입을 직접적으로 알려주는 방법을 사용해야 함

var 변수명 = mutableListOf<컬렉션에 입력될 값의 타입>()
var stringList = mutableLisfOf<String>()
        // 생성
        val stringList = mutableListOf<String>() // 문자열로 된 빈 컬렉션을 생성

        stringList.add("월")
        stringList.add("화")
        println(stringList[1]) // 화

7) 컬렉션 개수 가져오기 : size


  👻  size 프로퍼티를 사용하면 컬렉션의 개수를 가져올 수 있음

        println("stringList에는 ${stringList.size}개의 값이 있습니다.")
        // stringList에는 2개의 값이 있습니다.

 


예제


    문자열을 저장할 수 있는 List 객체를 생성하고 여기에 "a", "b", "c", "d", "e"를 저장한 후 이것을 출력하는 프로그램을 생성
    출력 예:  [a, b, c, d, e]

    1. 뮤터블  2. 이뮤터블 두 케이스 다 작성

fun main() {

    val charList = listOf("a", "b", "c", "d", "e") 
    println(charList) // [a, b, c, d, e]

    val mutableList = mutableListOf<String>()
    // val mutableList: MutableList<String> = mutableListOf()
    mutableList.add("a")
    mutableList.add("b")
    mutableList.add("c")
    mutableList.add("d")
    mutableList.add("e")

    println(mutableList) // [a, b, c, d, e]
}

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1. 리스트  list

 

🚀  사전적 의미는 '목록'이며 파이썬에서 리스트 의미는 여러가지 자료를 저장할 수 있는 자료

🚀  저장하고자 하는 값들의 자료형(type)이 서로 다르더라도 하나의 리스트에 저장

 

  ⚡️  리스트를 생성하는 방법 : 대괄호 []에 자료를 쉼표로 구분해서 입력 또는 리스트 함수 list() 를 이용해서 생성

  ⚡️  대괄호 내부에 넣는 자료를 요소 element 라고 한다

[요소, 요소, 요소...]

 

# 정수, 실수, 문자열을 각 1개씩 저장하고 있는 리스트 생성
li = [100, 3.14, 'hello']
print(li)  # [100, 3.14, 'hello']
print(type(li))  # <class 'list'>

 

 

100 3.14 hello

                   [0]                                       [1]                                       [2]

                   [-3]                                     [-2]                                     [-1]

 

  👾  각각의 요소는 위와 같은 형태로 저장 된다.

  👾  대괄호 [] 안에 들어간 숫자를 인덱스 index라 부르며, 0부터 센다.

  👾  뒤에서부터 문자를 선택할 때 0이아닌 -1부터 센다

 


 

💡 리스트 접근 연산자를 이중으로 사용하는 방법

list = [333, 7, 'hello', True]
list[2]  # hello
list[2][0]  # h

 

👾  list [2]를 지정하면 'hello'를 꺼내오고 list[2][0] 이면 'hello'에서 다시 0번째를 가져와 출력

 


 

💡  리스트 안에 리스트 사용 가능

list = [[1,2,3], [4,5,6], [7,8,9]]
list[1]  # [4,5,6]
list[1][1]  # [5]

 


 

2. 리스트 연산하기: 연결(+), 반복(*), len()

 

🚀  문자열과 리스트는 비슷한 자료형으로 사용할 수 있는 연산자와 함수도 비슷함

# 리스트 선언
list_a = [1,2,3]
list_b = [4,5,6]

# 출력
print("list_a = ", list_a)
print("list_b = ", list_b)
print()

# 기본 연산자
print("list_a + list_b = ", list_a + list_b)  # 자료 연결
print("list_a * 3 = ", list_a * 3)  # 자료 반복
print()

# 함수
print("len(list_a) = ", len(list_a))

실행 결과

 


 

3. 리스트 정렬: sort(), sorted(), reverse = True

 

🚀  sort(), sorted()는 리스트 요소를 정렬할 때 쓰는 함수로 기본 오름차순 정렬이다

🚀  reverse = True 옵션을 추가할 경우 내림차순 정렬로 반환

리스트.sort()  # 원본이 정렬됨
sorted(리스트명)  # 원본이 정렬된 것 x

 

list_a = [33, 100, 1, 6, 29]
list_a.sort()  # 오름차순 정렬
print(list_a)  # [1, 6, 29, 33, 100]

 

my_list2 = ['b', 'c', 'a', 'd']
print(sorted(my_list2))  # ['a', 'b', 'c', 'd']
print(sorted(my_list2, reverse=True))  # ['d', 'c', 'b', 'a']

my_list = [6, 3, 1, 2, 5, 4]
print(sorted(my_list))  # [1, 2, 3, 4, 5, 6]
print(sorted(my_list, reverse=False))  # [1, 2, 3, 4, 5, 6]
print(sorted(my_list, reverse=True))  # [6, 5, 4, 3, 2, 1]

print(sorted(my_list))  # [1, 2, 3, 4, 5, 6]
print(my_list)  # [6, 3, 1, 2, 5, 4] / 실제로 정렬이 된건 아님

my_list = sorted(my_list)  # 오름차순 정렬 결과를 덮어쓰기
print(my_list)  # [1, 2, 3, 4, 5, 6]

 


 

4. 리스트 내부에 있는지 확인: in/not in 연산자

 

🚀  특정 값이 리스트 내부에 있는지 확인하기 위해 in 연산자 사용

🚀  리스트 내부에 값이 있으면 True, 없으면 False를 출력

🚀  not in 연산자는 리스트 내부에 해당 값이 없는지 확인하는 연산자

 

값 in 리스트
list_a = [273, 33, 100, 51, 99]
273 in list_a  # True
98 in list_a  # False

273 not in list_a  # False
98 not in list_a  # True

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 자료 및 책 '혼자 공부하는 파이썬' ]

 


1. 리스트 요소 추가

 

1)  append()

 

👾 '리스트의 끝'에 인수로 전달된 데이터를 추가하는 함수

리스트명.append(요소)
# 리스트 선언
my_list = ['apple', 'banana']
# 리스트 뒤에 요소 추가
my_list.append('cherry')
print(my_list)  # ['apple', 'banana', 'cherry']

 


 

2)  insert()

 

👾  리스트의 특정 인덱스에 데이터를 추가

리스트명.insert(위치, 요소)
# 리스트 선언
my_list = ['apple', 'banana']
# 0번 인덱스에 요소 추가
my_list.insert(0,'cherry')
print(my_list)  # ['cherry', 'apple', 'banana']

 


 

3) extend()

 

👾  한 번에 여러 요소를 추가하고 싶을 때 사용, 매개 변수로 리스트를 입력한다.

       ▶️ 리스트에 다른 리스트나 튜플과 같은 반복가능객체를 추가하여 기존 리스트를 확장

👾  원래 리스트 뒤에 새로운 리스트 요소를 추가

my_list = ['apple', 'banana']
my_list.extend(['cherry', 'mango'])
print(my_list)  # ['apple', 'banana', 'cherry', 'mango']

my_list = ['apple', 'banana']
my_list += ['cherry', 'mango']
print(my_list)  # ['apple', 'banana', 'cherry', 'mango']

 

  📌 리스트 연결 연산자와 요소 추가의 차이

 

    - 리스트 연결 연산자와 extend() 함수는 비슷한 형태로 동작

    - 차이점리스트 연결 연산자는 원본에 어떠한 영향도 주지 않는 '비파괴적'   

                       리스트에 직접적인 영향을 주는 함수 (append(), insert(), extend()) 또는 연산을 '파괴적'

''' 리스트 연결 연산자 '''
list_a = [1, 2, 3]
list_b = [4, 5, 6]
list_a + list_b
# 실행결과 : [1, 2, 3, 4, 5, 6]
print(list_a) # [1, 2, 3]
print(list_b) # [4, 5, 6]
# -> list_a, list_b에 어떠한 변화도 없다 (비파괴적 처리)

''' extend() 함수 '''
list_a = [1, 2, 3]
list_b = [4, 5, 6]
list_a.extend(list_b)
print(list_a)  # [1, 2, 3, 4, 5, 6]
# -> 앞에 입력했던 list_a 자체에 직접적인 변화가 있다 (파괴적 처리)
print(list_b)  # [4, 5, 6]

 

   💡  헷갈리면 위의 예시처럼 직접 하나하나 입력해서 원본에 변화가 있는지 없는지 확인 

 


 

2. 리스트 요소 제거

 

1) 인덱스로 제거:  del 키워드, pop()

 

👾  요소의 위치를 기반으로 요소를 제거

# 1) del 키워드
del 리스트명[인덱스]
del 리스트명[시작_인덱스:종료_인덱스:증감값] # 범위 지정해 한꺼번에 제거, 종료 인덱스는 포함 x
# 2) pop()
리스트명.pop(인덱스)

 

# del 키워드로 제거
my_list = ['apple', 'banana']
del my_list[0]
print(my_list) # 결과 : ['banana']

# pop()으로 제거 
# 리스트의 마지막 요소가 반환되면서 삭제
my_list = ['apple', 'banana']
item = my_list.pop()
print(item)  # 결과 : banana
print(my_list)  # 결과 : ['apple']

# 인덱스 값을 인수로 전달하면 해당 인덱스 값이 삭제
my_list = ['apple', 'banana']
item = my_list.pop(0)
print(item)  # 결과 : apple
print(my_list)  # 결과 : ['banana']

 


 

2) 값으로 제거 :  remove()

 

👾  값을 지정해서 제거하는 함수

리스트.remove(값)

 

# 인수로 전달된 값과 동일한 요소를 찾아서 제거. 동일한 요소가 여러 개인 경우에는 첫 번째 요소가 제거
my_list = ['apple', 'banana', 'cherry', 'mango']
my_list.remove('cherry')
print(my_list)  # ['apple', 'banana', 'mango']

# 중복된 값이 있는 경우 제일 앞에 있는 것만 삭제
my_list = ['apple', 'banana', 'cherry', 'mango', 'cherry']
my_list.remove('cherry')
print(my_list)  # ['apple', 'banana', 'mango', 'cherry']

# 특정 값을 전부 삭제를 원할 경우 반복문 사용.
my_list = ['apple', 'banana', 'cherry', 'mango', 'cherry']
for idx in range(my_list.count('cherry')):
    my_list.remove('cherry')
print(my_list)  # ['apple', 'banana', 'mango']

 


 

3) 모두 제거: clear()

 

👾 리스트 내부의 요소를 모두 제거

리스트.clear()
my_list = ['apple', 'banana']
my_list.clear()
print(my_list)  # []

my_list = ['apple', 'banana']
my_list = []
print(my_list)  # []

 

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 자료 및 책 '혼자 공부하는 파이썬' ]

+ Recent posts