본문 바로가기

개발/Kotlin & Java

코틀린 Kotlin 다루기 (6) - 배열 (Array)

반응형

배열 (Array)

이번 편에서는 자료를 저장하는 방법 중 하나인 배열을 알아보려고 합니다.

이해를 돕기 위해 배열이 어떤 것이고 어디에 쓰이는지 짚고 넘어가겠습니다.

 

배열은 같은 자료형의 데이터들을 담을 수 있는 방법입니다.

데이터의 순번, 순차를 나타네는 인덱스(index)와 데이터로 나뉘어있으며 index는 0부터 시작합니다.

 

이렇게 자료를 저장하고 관리하는 방법을 자료 구조라고 하며 배열을 자료 구조 중 하나입니다.

상황을 가정해봅시다.

멀티 게임을 하기 위해 방장을 방을 만들었고, 다른 플레이어는 방에 입장하려고 합니다.

방장이 만든 방에 입장한 플레이어를 기록해야 합니다.

 

변수를 이용해보면

플레이어가 들어올 때마다 변수를 만듭니다.

플레이어가 100명이면 변수 100개가 만들어지고 들어올 때마다 새로운 변수를 만들어야 합니다.

 

이번에는 배열을 이용해봅시다.

배열 "1번방"을 만들어주고 이 안에는 플레이어를 여러 개 넣을 수 있습니다.

플레이어가 들어와도 변수를 만들 필요 없이 배열에 넣기만(push) 하면 되고 플레이어를 가져와야 한다면 index를 이용해서 꺼내오면 됩니다.

 

변수만을 이용했다면 가독성이 떨어지고 데이터의 연관성을 알 수 없으며 배열을 이용하면 가독성이 올라가고 속한 데이터 또한 무엇인지 바로 알 수 있습니다.

Kotlin에서 배열 사용하기

Kotlin에서는 arrayOf(), arrayOfNulls() 함수를 이용하여 배열을 만들 수 있습니다.

val room1 = arrayOf("A", "B", "C") // 방에 A, B, C 플레이어가 들어가있다.
val room2 = arrayOfNulls<String>(100) // 100명이 들어갈 수 있는 이 방에는 아쉽게도 아무도 없다. 

배열을 만드는 동시에 데이터를 넣고 싶으면 arrayOf()를 사용하여 만들 수 있으며 배열의 크기는 앞서 미리 넣은 데이터의 개수가 됩니다.

배열을 만들고 싶지만 지금 당장 데이터를 넣을 필요가 없다면 arrayOfNulls()를 이용해 미리 자료형과 배열의 크기를 알려주고 만들 수도 있습니다.

 

배열에는 데이터를 담을 수 있는 크기가 결정되어있으며 이를 size 또는 length라고 합니다.
size가 100이고 100개의 데이터가 들어가 있으면 index는 0부터 시작하므로 0~99의 index로 데이터에 접근할 수 있습니다.

배열을 만들었으면 이제 데이터를 읽고 써야 합니다. 

아까 플레이어가 없던 room2 배열에 데이터를 넣어봅시다.

val room2 = arrayOfNulls<String>(100) // 100명이 들어갈 수 있는 이 방에는 아쉽게도 아무도 없다.
    
room2[0] = "가" // room2.set(0, "가")
room2.set(1, "나") // room2[1] = "나"

println("첫번째(index: 0)에 있는 값: ${room2[0]}") // room2.get(0)
println("두번째(index: 1)에 있는 값: ${room2.get(1)}") // room2[1]

// 실행결과
// 첫번째(index: 0)에 있는 값: 가
// 두번째(index: 1)에 있는 값: 나

배열에 값을 넣는 방법은 Array[index] = data를 이용하는 방법과 Array.set(index, date)를 이용하는 방법이 있고 주로 전자를 사용합니다.

배열에서 값을 가져오는 방법은 Array[index] 또는 Array.get(index)가 있으며 이 역시 주로 전자의 방법을 사용합니다.

 

위 방법 외에 다른 방법으로 배열을 만들 수 있습니다.

숫자 자료형을 가진 배열을 만들 때 쓰입니다.

val A = IntArrayOf(1, 2, 3)
val B = IntArray(3)
val C = IntArray(3) { 1 }

배열 A는 Int 자료형을 갖는 배열에 1, 2, 3 데이터를 넣어 만듭니다.

배열 B는 size가 3인 비어있는 Int 자료형 배열을 만들며 배열 C는 size가 3이고 데이터가 1로 초기화되어 있는 배열을 만듭니다.

 

이 밖에도 ByteArray, ShortArray 등으로도 사용할 수 있습니다.

 

Q: arrayOf(1, 2, 3) 또는 arrayOfNulls<Int>(3)을 써도 되는데 왜 저렇게 하나요?
A: 기본 자료형을 객체 형태로 만든 Wrapper가 존재하는데 기본 자료형을 Wrapper 자료형으로 바꿔주는 Boxing 과정을 하지 않기 위해 사용합니다. 자세한 건 나중에...

다차원 배열

다차원 배열은 배열 안에 배열이 들어있다는 의미입니다. 즉, 배열이 중첩되어있습니다. (수학, 물리의 차원과 다릅니다.)

보통 두 개의 배열이 중첩된 경우 이차원 배열, 세 개는 삼차원 배열이라고 합니다.

 

활용도를 알아보기 위해 이번에는 이차원 배열을 이용하여 학교를 예로 들어봅시다.

초등학교 1학년에는 3개의 교실이 있습니다. 각 3개의 교실에는 5명의 학생이 있습니다.

이 상황을 배열로 나타내면 1학년이라는 배열 안에 3개의 배열이 있으며 각 3개의 배열 안에는 5개의 학생 데이터가 들어가 있는 구조입니다. 

 

백문이 불여일견, 코드로 작성해봅시다!

val school = arrayOf(arrayOf("학생A", "학생B", "학생C", "학생D", "학생E"),
		     arrayOf("학생ㄱ", "학생ㄴ", "학생ㄷ", "학생ㄹ", "학생ㅁ"),
		     arrayOf("학생1", "학생2", "학생3", "학생4", "학생5"))

// 1학년 1반 5번째 학생이 전학을 가고 새로운 학생이 왔습니다.
school[0][4] = "학생Z"
println("1학년 1반 첫번째 학생은? ${school[0][0]}")
println("1학년 2반 5번째 학생은? ${school[1][4]}")

// 1학년 3반 세번째 학생이 전학을 갔습니다.
school[2][2] = ""

// 실행결과
// 1학년 1반 첫번째 학생은? 학생A
// 1학년 2반 5번째 학생은? 학생ㅁ

똑같이 arrayOf() 또는 arrayOfNulls()를 중첩하여 사용하면 됩니다.

마무리

자료 구조의 제일 기초인 배열을 알아보았습니다.

다음 편은 조건문(if, when)에 대해서 다루지 않을까 싶습니다.

오타 발견, 피드백은 환영합니다!

반응형