본문 바로가기

LANGUAGES, METHODLOGY/Kotlin

[안드로이드 | 코틀린] 코틀린으로 Queue 사용해보기

프로젝트에서 요구사항 구현을 위해 코틀린의 Queue 클래스를 활용해보기로 했다.

 

Queue는 기본 java.util 패키지 내에 포함되어 있으며,

 

Queue를 사용하면 IDE가  java.util.* import를 새롭게 추가하는 것을 확인할 수 있을 것이다.

 

Queue는 Kotlin의 Any 타입을 집어넣을 수 있고 이는 결론적으로 코틀린의 모든 클래스를 넣을 수 있다는 말.

 

그럼 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

 

Queue  |  Android 개발자  |  Android Developers

Queue interface Queue  : MutableCollection Known Direct Subclasses AbstractQueue This class provides skeletal implementations of some Queue operations. BlockingQueue A java.util.Queue that additionally supports operations that wait for the queue to become 

developer.android.com