프로젝트에서 요구사항 구현을 위해 코틀린의 Queue 클래스를 활용해보기로 했다.
Queue는 기본 java.util 패키지 내에 포함되어 있으며,
Queue를 사용하면 IDE가 java.util.* import를 새롭게 추가하는 것을 확인할 수 있을 것이다.
그럼 Queue를 쓸 때에 사용 가능한 function을 살펴보자.
- add(element: E)
Any type의 element를 Queue에 추가한다. Any는 코틀린의 모든 클래스의 최상단 super 클래스로, 결국 어떤 클래스든지 문제없이 사용이 가능하다는 것이다. Queue에 element를 더하는데 성공하면 true를 return하며, 실패시 IllegalStateException을 발생시킨다.
- element()
element()는 Queue의 head를 제거하지 않고 head에 어떤 값이 들어가 있는지 알려준다. Queue의 현재상태를 건드리지 않고, head의 데이터만 확인하고 싶을 때 사용할 수 있을듯.
- offer(e: E)
add()와 동일한 기능을 수행하지만, add()와 다르게 용량 관계로 새 element를 queue에 추가할 수 없을 때 IllegalStateException을 던져주지 않는 것으로 보인다.
- peek()
element()와 동일한 기능을 수행하지만, Queue가 비어있을 경우 null을 return하는 차이점을 가진다.
- poll()
Queue에서 일반적으로 사용될 function으로, Queue의 head에 존재하는 element를 return하고, 동시에 element를 Queue에서 제거한다. Queue의 기본 원리와 같이 Queue에 존재하는 element들은 한칸식 당겨져 정렬된다. Queue가 비어있는 경우 null을 return한다.
- remove()
poll()과 동일한 기능을 수행하지만, Queue가 비어있는 경우 null을 return하지 않는 차이점이 있다. return 타입이 E로 되어있는 걸 보니 Queue가 비어있을 때 remove를 수행하면 null 데이터로 인해 Kotlin 에러가 발생할듯?
그럼 이제 실제로 프로젝트에 구현을 해보도록 하자.
..
private lateinit var sampleQueue: Queue<Int>
override fun onCreate(savedInstanceState: Bundle?) {
..
// queue의 형은 Queue<Int>로 선언하되, init시에는 LinkedList()로 생성한다.
sampleQueue = LinkedList()
// 초기 queue의 모습을 보이기 위해 0 값을 가진 element를 미리 넣었다.
sampleQueue.add(0)
sampleQueue.add(0)
sampleQueue.add(0)
// 1초 간격으로 도는 thread를 만들어 add와 poll 수행시의 Queue 모습을 확인해본다.
thread {
while(true) {
val stringBuilder = StringBuilder()
for (indices in sampleQueue) {
// stringBuilder에 queue에 존재하는 element를 append
stringBuilder.append("[$indices]")
}
Log.d("queueTest", "elements in queue : $stringBuilder")
// 0부터 5까지의 랜덤한 Int element를 queue에 집어넣는다.
sampleQueue.add(Random.nextInt(0..5))
// queue의 head를 제거
sampleQueue.poll()
sleep(1000)
}
}
..
}
포인트는 Queue의 데이터형은 Queue<Int>로 설정하고, init시에는 LinkedList()로 생성해주어야 한다는 것.
상기 코드를 돌려보면 3개의 사이즈를 가진 Queue가 새로운 element를 받으면서 queue를 밀어내는 모습을 감상할 수 있을것이다.
https://developer.android.com/reference/kotlin/java/util/Queue
'LANGUAGES, METHODLOGY > Kotlin' 카테고리의 다른 글
[Kotlin] Default Argument와 Named Argument 활용하기 (0) | 2020.10.06 |
---|---|
[안드로이드] Kotlin sealed class로 여러 클래스들을 보다 분명하게, 유연하게 활용하기 (0) | 2020.08.10 |
[안드로이드 | ExoPlayer] EventListener를 활용해 여러개의 동영상 연달아 재생하기 (0) | 2019.11.11 |
[GDG Seoul | 코틀린 ] 코틀린의 미래는 어디로? | Kotlin / Everywhere Seoul 2019에 가다 [2부] (0) | 2019.09.01 |
[GDG Seoul | 코틀린 ] Kotlin / Everywhere Seoul 2019에 가다 [1부] (0) | 2019.08.27 |