Kotlin/StoreInfo

<정리> 키오스크 프로그램 구현2

re트 2023. 12. 8. 20:20
728x90

오늘은 저번에 안 써놨던 것들만 쓰려고 한다.

오늘로 과제가 마무리되고 제출까지 마쳐서 전체적으로 돌아볼 수 있을 거 같다.

 

1. 문자열 포매팅

포매팅인지 포맷팅인지는 잘 모르겠지만 지금 끌리는 포매팅으로 말을 이어가자면

생각보다 메뉴들의 길이가 달라서 UI가 예쁘지 않다는 건 튜터님의 피드백 중에 하나이면서 우리 사이에서도 해결해야할 문제로 자리잡았다.

그리고 해결방법을 찾아오셔서 적용시켜준 팀원이 있었기에 해결이 되었다.

(그대의 노가다에 감사의 박수를...!!)

println("  %-9s\t| %s".format("1. 버거", "다양한 버거"))

보통 이런 형식을 주로 사용했다.

형식문자를 이용하는 건데 %d, %s, %f 다양하게 있다.

%와 s 사이에 숫자를 쓰면 해당 문자열이 차지할 총 공간을 지정할 수 있다.

양수로 쓰면 오른쪽 정렬, 음수로 쓰면 왼쪽 정렬이 된다.

 

2. 클래스 구조 변경

이전에는 Item 아래 Burger, Chicken, Drink, Side가 있었는데 그걸 그냥 Menu 아래 Food로 변경했다.

사실 Food 하나만 있었어도 될 거 같다.

그리고 주문 받는 것과 배달 받는 것을 상위 클래스 Receipt를 상속받도록 했다.

Receipt, 뜻은 영수증이지만 코드 내에서는 장바구니랑 동일하게 생각하면 된다.

 

3. 화면 구성 변경

이전에는 when문 안에 쫘~~~~악 코드가 늘어져있고 반복되는 코드가 많았는데 이걸 정리해서 페이지 별로 나눴다.

아주 깔끔해지고 반복되는 코드가 많이 줄어들었다.

여기에 붙이기에는 코드가 너무 길어서 글로만 적으면

메인 메뉴 아래에 음식 선택 페이지, 장바구니 추가 페이지, 주문 페이지, 주문 취소 페이지, 배달 목록 페이지가 존재한다.

이외에 기능을 가진 함수들도 존재한다.

 

4. 입력값 판별 함수

이전에는 그냥 입력 받기 전에 똑같지만 해야만 하는 입력값이 숫자인지, 범위 안에 있는지 확인하는 코드들을 일일히 집어넣었는데 팀원 분의 코드를 보고 깨달아 이걸 쓰기로 하고 잘 집어넣었다.

전에 써본 형식이었는데 왜 혼자 할 때는 생각이 나지 않았을까 싶었다.
역시 협업에서의 장점이 있다.

함수의 일부분만 보면

// 타입에 맞는 입력값인지 판별하는 함수
fun choiceNumber(type: String): Int {
    when (type) {
        // 메인 메뉴
        "mainChoice" -> {
            while (true) {
                try {
                    val mainChoice = readln()
                    val result = mainChoice.toInt()
                    // 범위 확인
                    if (result > 9 || result < 0) {
                        System.err.println("범위를 확인하고 다시 입력해주세요")
                    } else {
                        return result
                    }
                } catch (e: Exception) { // 숫자가 아닌 값이 입력된 경우
                    System.err.println("잘못된 입력입니다 다시 입력해주세요.")
                }
            }
        }
    ...
}

타입에 맞는 범위를 개별적으로 조절할 수 있다..!!

이렇게 또 반복되는 코드를 줄였다.

 

5. delay 사용

이 부분은 해설 영상을 보며 알게 된 부분이라서 적어놓는다.

나는 delay를 사용할 때 runBlocking을 써서 했는데 영상에서는 suspend fun이라는 키워드를 사용해서 간단하게 구현을 하더라

suspend fun은 일시중단 가능한 함수를 지칭하는 것인데 코루틴 내부에서나 다른 suspend fun 내부에서만 사용이 가능하다.

그래서 suspend fun을 만들고 그 안에 delay 함수를 넣은 다음 suspend fun으로 지정해둔 main 안에서 자유롭게 사용하는걸 볼 수 있었다.

코루틴 suspend 함수는 또한 thread를 block하지 않는다는 특징이 있다고 한다.

그래서 시간이 겹치지만 않는다면 동일한 thread에서 여러 코루틴이 실행될 수 있을 것으로 보인다.

 

6. Timer

어제인가 튜터님의 피드백을 받을 때 우리가 구현한 코루틴을 보시고는 타이머를 쓰면 쉽게 할 수 있었을 거라고 하셨었다.

물론 그 때 타이머를 쓰기 위해 검색해보고 이리 저리 키워드를 찾아봤지만 원하는대로 작동하지 않았다.

내가 제대로 사용법을 몰랐기 때문이었던걸로 오늘 판명났다.

fun 함수명() {
    var timer = Timer()
    timer.schedule(object: TimerTask() {
        override fun run() {
            // 실행할 내용
        }
    }, 0, 5000)
}

먼저 Timer 객체를 만들고 schedule 함수를 사용한다.

그러면 별도의 thread에서 반복된 함수를 돌릴 수 있다.

그 내용은 run 메소드에 넣으면 된다.

schedule 함수에는 TimerTask라는 객체를 넘겨주는데 이 객체는 thread로 동작하기 때문에 무조건 run 메소드를 오버라이딩해줘야한다.

첫번째 매개변수는 TimerTask 객체고 두번째 매개변수는 몇 초 후부터 시작할 건지, 세번째는 몇 초 간격으로 실행할 건지를 나타낸다.

반응형