[Kotlin] 2장. 코틀린 문법 - 배열, 컬렉션, 반복문

Hwichan Ji·2020년 12월 17일
2

Kotlin

목록 보기
2/11
post-thumbnail

이것이 안드로이드다 with 코틀린(고돈호 지음) 으로 공부한 내용을 정리한 글입니다.

배열과 컬렉션

배열

배열은 하나의 변수에 여러 개의 값을 저장할 수 있는 대표적인 자료형입니다. 배열은 저장될 수 있는 값의 개수를 먼저 정해놓고 사용해야 하며 중간에 개수를 추가하거나 제거할 수 없습니다.

배열 선언

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

var 배열명 = {Type}Array(개수)

ex) var numbers = IntArray(10)
    var name = CharArray(10)

문자열 배열에 빈 문자열 할당하기

String은 기본 타입이 아니기 때문에 StringArray는 존재하지 않습니다. 대신 다음과 같이 배열을 선언하면 빈 문자열로 된 배열 공간을 할당할 수 있습니다.

var stringArray = Array(10, {item->""})

값으로 배열 공간 할당하기

arrayOf() 함수를 사용하면 배열 선언과 동시에 값을 입력할 수 있습니다.

var dayArray = arrayOf("MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN")

배열 사용

배열에 값 입력하기

배열에 값을 변경하는 방법에는 두가지가 존재합니다.

1. 배열명[인덱스] = 값 
ex) students[0] = 90

2. 배열명.set(인덱스,) 
ex) students.set(1, 91)

배열에 있는 값 꺼내기

배열에 있는 값을 가져오는 방법 역시 두가지가 존재합니다.

1. 배열명[인덱스]
ex) var number = students[0]

2. 배열명.get(인덱스) 
ex) var number = students.get(1)

컬렉션

컬렉션은 배열과 같이 여러 개의 값을 저장하는 자료형입니다. 배열과 다른 점은 공간의 크기가 고정되지 않고 임의의 개수를 담을 수 있는 동적 배열이라는 점입니다. 컬렉션으로는 List , Map , Set 등이 있습니다. 코틀린에서 동적으로 컬렉션을 사용하기 위해서는 항상 자료형 앞에 Mutable 이라는 접두어를 붙여야 합니다.

리스트

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

리스트 생성

var mutableList = mutableListOf("MON", "WED")

리스트에 값 추가

리스트에 값이 추가되면서 자동으로 리스트의 공간도 증가합니다.

mutableList.add(1, "TUE") // 인덱스 1에 값 추가 
mutableList.add("THE") // 리스트 맨 뒤에 값 추가

리스트에 저장된 값 사용

var dayOfWeek = mutableList.get(1)

리스트에 저장된 값 수정

mutableList.set(1, "FRI")

리스트에 저장된 값 제거

리시트에서 값을 삭제하면 그 이후의 값들이 빈공간을 메꾸기 위해 당겨집니다. 즉, 리스트의 공간이 줄어듭니다.

mutableList.removeAt(1)

빈 리스트 사용하기

리스트를 선언할 때 빈 리스트를 생성하면 저장될 데이터의 타입을 알 수 없기 때문에 제네릭을 사용하여 데이터 타입을 알려주어야 합니다.

var 변수명 = mutableListOf<Type>()
ex) var strigList = mutableListOf<String>()

제네릭
클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법

리스트의 개수 가져오기

size 프로퍼티를 사용하여 리스트에 저장된 값의 개수를 가져올 수 있습니다.

mutableList.size

sizeget이나 set과 달리 함수가 아닙니다.

Set

Set은 중복을 허용하지 않는 리스트라고 할 수 있습니다. 리스트와 달리 인덱스와 get 함수가 존재하지 않습니다.

Set 생성

var set = mutableSetOf("A", "B")
var set = mutableSetOf<Type>()

Set에 값 추가

set.add("C")

Set에 저장된 값 사용

Set은 인덱스로 데이터를 조회하는 함수가 없기 때문에 특정 위치의 값을 직접 사용할 수 없습니다.

Set에 저장된 값 삭제

Set은 중복을 허용하지 않기 때문에 값으로 직접 조회해서 삭제할 수 있습니다.

set.remove("A")

Map

Map은 Key와 Value의 쌍으로 저장되는 컬렉션입니다. Map의 Key는 리스트의 인덱스처럼 값을 조회하는데 사용됩니다. Key는 중복될 수 없으나 Value는 중복된 값을 가질 수 있습니다.

Map 생성

var map = mutableMapOf<KeyType, ValueType>()
var map = mutableMapOf(Pair(Key, Value))
var map = mutableMapOf(Key to Value)

Map에 값 추가, 수정

Key에 해당하는 값이 Map에 없다면 Map에 값이 추가되고 있다면 값이 변경됩니다.

map.put(Key, Value)

Map에 저장된 값 사용

var x = map.get(Key)

Map에 저장된 값 삭제

map.remove(Key)

Immutable Collection

코틀린에서 컬렉션은 기본적으로 Immutable로 구현됐습니다. 따라서 Immutable Collection은 컬렉션의 크기와 컬렉션 내에 저장된 값을 변경할 수 없습니다. 그렇기 때문에 동적으로 컬렉션을 사용하기 위해선 mutable이라는 접두어를 붙여야합니다.

var list = listOf("1", "2") // Immutable Collection

var list = mutableListOf("1", "2") // Mutable Collection

Immutable Collection은 최초에 입력된 값만 사용할 수 있기 때문에 addset 함수를 지원하지 않습니다. 이에 Immutable Collection은 상수로 선언(val 사용)하고 컬렉션 이름을 대문자로 표시하는 것이 좋습니다.

반복문

for 반복문

for 반복문은 일반적으로 특정 횟수만큼 코드를 반복하기 위해 사용합니다.

for (반복할 범위) {
    // ...
}

for 반복문 형태

일반적인 형태의 for 반복문

변수를 시작값에서 종료값으로 증가시키면서 코드를 반복합니다.

for (변수 in 시작값..종료값) {
    // ...
}

마지막 숫자 제외하기

.. 대신 until을 사용하면 종료값 이전까지만 반복합니다.

for (변수 in 시작값 until 종료값) {
    // ...
}

건너뛰기

step을 사용하여 변수의 증가폭을 결정할 수 있습니다.

for (변수 in 시작값..종료값 step 증가폭) {
    // ...
}

감소시키기

downTo를 사용하면 시작값에서 종료값로 감소하면서 실행할 수 있습니다. step 사용 가능합니다.

for (변수 in 시작값 downTo 종료값) {
    //  ...
}

배열, 컬렉션 엘리먼트 반복하기

배열이나 컬렉션을 엘리먼트의 개수만큼 반복할 수 있습니다. step은 사용 불가능합니다.

for (변수 in 배열 또는 컬렉션) {
    // ...
}

while 반복문

while 반복문은 일반적으로 특정 조건이 만족할 때까지 반복하기 위해 사용합니다. 조건식이 참인 동안 코드를 반복합니다. 따라서 조건식이 항상 참이라면 무한루프에 빠지게 됩니다.

while (조건식) {
    // ...
}

while 반복문 형태

일반적인 while 반복문

var current = 1
val until = 12
while (current < until) {
    current = current + 1
}

do와 함께 사용하기

do 블록 안의 코드를 먼저 실행하고 while 문의 조건식을 확인합니다.

var game = 1
val match = 6
do {
    game += 1
} while (game < match)

반복문 제어

break

반복문을 탈출합니다.

for (index in 1..10) {
    if (index > 5) {
        break;
    }
}

continue

continue 이후의 코드는 실행하지 않고 다음 반복문을 수행합니다.

for (index in 1..10) {
    if (index > 3 && index < 8) {
        continue
    }
    Log.d("continue", "$index")
}
profile
안드로이드 개발자를 꿈꾸는 사람

1개의 댓글

comment-user-thumbnail
2022년 5월 4일

좋은 글 정리 잘 보고 갑니다

답글 달기