이전 실습에서 기본 데이터 타입을 사용한 예제코드로 실습을 했었다.
<기본 데이터 타입>
1. 정수: Long, Int, Short, Byte
2. 실수: Double, Float
3. 문자: Char
4. 문자열: String
5. 불리언: Boolean
기본 데이터 타입으로 저장된 값들을 하나의 자료(Data)라고 할 때, 우리는 자료들을 효율적으로 저장할 필요가 생긴다.
자료들을 저장하는 방법을 자료구조(Data Structure)라고 한다.
프로그램의 목적과 기능에 따라,
(1) 메모리 저장공간 절약
(2) 실행 시간 단축
두가지 관점에서 어떤 자료구조가 유리한지 선택하게 된다.
이중에서 배열, 리스트, 셋, 맵을 예제로 살펴보자.
배열은 선언시 공간의 크기가 고정되지만
컬렉션(리스트, 셋, 맵)은 공간의 크기가 고정되지 않는다.(동적배열)
컬렉션은 기본적으로 Immutable로 선언되는데 이경우에는 입력된 값을 바꿀수없다. 동적배열로 사용하려면 mutable 타입으로 사용해야한다. (mutableList, mutableMap, mutableSet)
var intAraay = IntArray(10)
var longArray = LongArray(10)
var charArray = CharArray(10)
var floatArray = FloatArray(10)
var doubleArray = DoubleArray(10)
var stringArray = Array(10, {""})
var intAraay = Array<Int>(10, {0})
var longArray = Array<Long>(10, {0})
var charArray = Array<Char>(10, {0.toChar()})
var floatArray = Array<Float>(10, {0.0F})
var doubleArray = Array<Double>(10, {0.0})
var stringArray = Array<String>(10, {""})
배열은 위와 같이 선언하는 방법들이 있다.
배열이 담는 자료형에 따라 선언방법이 달라진다.
var students = Array<Int>(5, {0})
students[0] = 90
students[1] = 91
students[2] = 92
students.set(3, 93)
students.set(4, 94)
println("1번째 student 값은 ${students[0]}입니다")
println("2번째 student 값은 ${students.get(1)}입니다")
배열에 값을 저장할때 [idx]로 접근하거나 set 메소드를 사용하고
값을 읽을때 [idx]로 접근하거나 get 메소드를 사용한다.
var stringList = mutableListOf<String>()
stringList.add("월요일")
stringList.add("화요일")
stringList.add("수요일")
println("두번째 값은 ${stringList.get(1)}입니다.")
stringList.set(1,"날짜 변경")
println("두번째 값은 ${stringList.get(1)}입니다.")
println("리스트크기는 ${stringList.size}입니다.")
stringList.removeAt(1)
println("리스트크기는 ${stringList.size}입니다.")
리스트는 원소의 중복을 허용하며 인덱스로 값에 접근이 가능하다.
리스트 예제에서 원하는 값을 추가, 수정, 제거해보았다.
.add() 메소드: 리스트 원소 추가
.get() 메소드: 리스트 원소 읽기
.removeAt() 메소드: 리스트 원소 제거
.size 프로퍼티: 리스트 크기
var set = mutableSetOf<String>()
set.add("JAN")
set.add("FEB")
set.add("MAR")
set.add("JAN")
println("Set 전체출력 = ${set}")
println("Set 크기 = ${set.size}")
set.remove("FEB")
println("Set 전체출력 = ${set}")
println("Set 크기 = ${set.size}")
셋은 원소의 중복을 허용하지않으며 인덱스참조가 불가능하다.
셋 예제에서 원하는 값을 추가, 삭제해보았다.
.add() 메소드: 셋 원소 추가. 중복된 값은 추가되지않음.
.remove() 메소드: 셋 원소 제거
.size 프로퍼티: 셋 크기
var map = mutableMapOf<String, String>()
map.put("key1", "value1")
map.put("key2", "value2")
map.put("key3", "value3")
println("key1의 값은 ${map.get("key1")}")
map.put("key1", "수정")
println("key1의 값은 ${map.get("key1")}")
println("map 크기 = ${map.size}")
map.remove("key1")
println("key1의 값은 ${map.get("key1")}")
println("map 크기 = ${map.size}")
맵은 (Key, Value) 쌍으로 데이터가 입력된다.
키(Key)를 통해 값(Value)에 접근 할 수 있다.
맵 예제에서 원하는 값을 추가, 삭제해보았다.
.put() 메소드: 맵 원소 추가
.get() 메소드: 맵 원소 읽기 (Key를 통해 참조)
.remove() 메소드: 맵 원소 제거
.size 프로퍼티: 맵 크기
반복되는 작업을 할 시에 반복문을 사용한다.
for(i in 0..100)
{
println("현재 숫자는 ${i}")
}
반복문 for: 0부터 100까지의 숫자를 반복하여 출력
for(i in 0 .. 100 step 3)
{
println("현재 숫자는 ${i}")
}
step을 사용하여 증감 크기를 바꿀 수 있다.
for(i in 100 downTo 0)
{
println("현재 숫자는 ${i}")
}
.. 대신 downTo를 하면 방향을 바꿀 수도 있다.
var array = arrayOf("MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN")
for (i in 0..array.size - 1) {
println("현재 요일은 ${array.get(i)}")
}
for (i in 0 until array.size) {
println("현재 요일은 ${array.get(i)}")
}
for(day in array)
{
println("현재 요일은 ${day}")
}
위 같은 방식으로 array 원소 전체를 참조할 수 있다.
var game = 1
var match = 6
while (game < match) {
println("while테스트 ${game}")
game += 1
}
for 문과 달리 while 반복문에서는 증감을 직접 작성해야한다.
var game = 6
var match = 6
do {
println("do while테스트 ${game}")
game += 1
} while (game < match)
do while문은 조건을 만족하지 않아도 최소 한번은 블럭을 수행한다.
for (i in 1..10) {
if (i == 5) {
break;
}
println("테스트: ${i}")
}
break를 사용하면 원하는 조건에 반복문을 탈출할 수 있다.
for (i in 1..10) {
if (i == 5) {
continue;
}
println("테스트: ${i}")
}
continue를 사용하면 원하는 조건에 블럭수행을 스킵할 수 있다.
캬~