10월 19일

Yullgiii·2023년 10월 19일
3
post-thumbnail

내일 배움 캠프

오늘의 목표!

어제 하던 개인프로젝트에 필수 구현 하는 부분을 목표로 우선 다 구현하는것이 오늘의 목표이다!
필수구현으로서는

Java 클래스 설계 시 필수 요구사항!

  • 메뉴 클래스는 이름, 설명 필드를 가지는 클래스로 만들어주세요.
  • 상품 클래스는 이름, 가격, 설명 필드를 가지는 클래스로 만들어주세요.
  • 상품 클래스의 이름, 설명 필드는 메뉴 클래스를 상속받아 사용하는 구조로 개발해주세요.
  • 주문 클래스도 만들어서 상품 객체를 담을 수 있도록 해주세요.
1. 메인 메뉴판 화면
- 메인 메뉴판이 출력되며 메뉴판에는 상품 메뉴가 출력 됩니다.
- 상품 메뉴는 간단한 설명과 함께 출력 되며 최소 3개 이상 출력 됩니다.
- 상품 메뉴 아래에는 Order(주문)와 Cancel(주문 취소) 옵션을 출력해줍니다.

2. 상품 메뉴판 화면
- 상품 메뉴 선택 시 해당 카테고리의 메뉴판이 출력됩니다.
- 메뉴판에는 각 메뉴의 이름과 가격과 간단한 설명이 표시됩니다.

3. 구매 화면
- 상품 선택 시 해당 상품을 장바구니에 추가할지 확인하는 문구가 출력 됩니다.
- `1.확인` 입력 시 장바구니에 추가되었다는 안내 문구와 함께 메인 메뉴로 다시 출력 됩니다.

4. 주문 화면
- `5.Order` 입력 시 장바구니 목록을 출력해줍니다.
- 장바구니에서는 추가된 메뉴들과 총 가격의 합을 출력해줍니다.
- `1.주문` 입력 시 주문완료 화면으로 넘어가고, `2.메뉴판` 입력 시 다시 메인 메뉴로 돌아옵니다.

5. 주문완료 화면
- `1.주문` 입력 시 대기번호를 발급해줍니다.
- 장바구니는 초기화되고 3초 후에 메인 메뉴판으로 돌아갑니다.

6. 주문 취소 화면
- 메뉴판에서 `6.Cancel` 입력시 주문을 취소할지 확인을 요청하는 문구가 출력 됩니다.
- `1.확인` 을 입력하면 장바구니는 초기화되고 취소 완료 문구와 함께 메뉴판이 출력 됩니다.

이라는 필수 구현의 틀이 있으니까 이걸 보면서 현재 해둔 틀을 확실하게 잡고 그뒤에 구현목표를 향해 나아갈것이다!

우선
1번은 끝내놨다!!!

1번 메인 메뉴판 화면

    public void start() {
        while (true) {
            System.out.println("\nYULL's CAFE에 오신 것을 환영합니다!");
            System.out.println("아래의 메뉴를 보시고 원하는 번호를 입력해 주세요!!!");
            System.out.println("[ MENU ]");
            System.out.println("1. 커피        | 직접 로스팅을 하여 향을 극대화한 커피");
            System.out.println("2. 차         | 아 오늘은 커피는 별론데...하는 그대를 위한거에요");
            System.out.println("3. 토스트      | 배고프고 출출한 상태에서 카공 중 밥먹으로 가기 밍구스러운 당신!");
            System.out.println("4. 디저트      | 알고있어 당신은 케잌이 먹고싶다는걸!");
            System.out.println("___________________________________________________");
            System.out.println("[ ORDER ]");
            System.out.println("5. 장바구니     | 뭘 샀는지는 알아야지 결제를 하겠죠?");
            System.out.println("6. 나가기      | 아쉽지만...먹고싶은게 없으시군요 더 노력할게요... ");
            System.out.print("옵션을 선택해주세요: ");
            int choice = scanner.nextInt();
            scanner.nextLine();

            switch (choice) {
                case 1:
                    showProducts("커피");
                    break;
                case 2:
                    showProducts("차");
                    break;
                case 3:
                    showProducts("토스트");
                    break;
                case 4:
                    showProducts("디저트");
                    break;
                case 5:
                    checkout();
                    break;
                case 6:
                    System.out.println("이용해주셔서 감사합니다!");
                    return;
                default:
                    System.out.println("잘못된 선택입니다. 다시 선택해주세요.");
            }
        }
    }

이런 식으로 스위치문과 와일문을 이용하여서 메뉴가 출력 되는 동안 입력을 받을수있게 하고 각 카테고리를 출력하도록 했다
장바구니는 checkout();으로 구현을 해둔상태이다 이렇게 해두니까 현 상황에서 실행을 하면

이러한 사진처럼 나온다!!!
만족과 불만족의 사이이다 왜냐면 저 |부분이 나열이 잘 안되있기 떄문이다...
하지만 할일이 많으니까 일단 넘어가자!!!

2. 상품 메뉴화면

어제의 노력으로 각 메뉴는 사실 다 구성해 두었기떄문에

    private void showProducts(String category) {
        System.out.println("\n[ " + category + " 메뉴 ]");

이정도만 해도 우리는 어제 각 카테고리에 있는 메뉴를 뽑아올수있었다.
하지만 우리는 뭘해야하는가!
장바구니에 추가도 해야하고 으이?!
그러면 바로 연결되어버리는

3. 구매화면

구매는 이제 뭐라 떠야하드라..
아 메뉴를 선택을 하면 장바구니에 담을건지 물어봐야하는 기능이였다!!
그러기 위해선 선택이 가능해야하기에
선택을 받을수있는 칸을 만들어줘야하지만 우선 머리가 깨지기전에
번호를 지정해줘야하기에
변수를 초기화 해주고!!!

int i = 1;
List<Product> availableProducts = new ArrayList<>();

목록을 쫘라락 표시를 해준다!!!

for (Product product : products) {
    if (product.getCategory().equals(category)) {
        availableProducts.add(product);
        System.out.println(i + ". " + product);
        i++;
    }
}

그런데 여기서 의문..만약...커피가 아니라 다른걸 먹고싶었다면? 젠장...뒤로가기 버튼도 만들어줘야겠어
지금은 모든 메뉴를 9개로 통일해서 번호는 상관이 없지만 더 추가될수있으니 마지막에 추가를 해주기위해 뒤쪽에 써주고

System.out.println(i + ". 뒤로가기");

이젠 선택을 강요할 시간 뭐든 골라야지!

System.out.print("선택: ");
int choice = scanner.nextInt();
scanner.nextLine();

이로서 선택을 해주면 장바구니에 담을지 물어봐야할꺼 아녀?
그러면 이제 장바구니 메소드를 새로 정의 해주고 거기로 넘어가서 물어봐보자고?

    private void addProductToCart(Product product) {
        System.out.println("\n" + product.getName() +" | ₩ " + product.getPrice() +" | " + product.getDescription());
        System.out.println("\"위 메뉴 장바구니에 담으시겠습니까?\"");
        System.out.println("1. 확인");
        System.out.println("2. 취소");
        System.out.print("선택: ");
        int choice = scanner.nextInt();
        scanner.nextLine();

이런식으로 해서 자세하게 설명해주고 확인을 해서 선택을 하게 해주면!!! 된다!!!
그렇게 하고 나서 1이확인이니까 1을 선택하면 장바구니에 담았다는 멘트와 함께 장바구니 리스트로 넘겨주면 되니까

        if (choice == 1) {
            cart.add(product);
            System.out.println(product.getName() +  "을(를) 장바구니에 담았습니다.");
        }
    }

이렇게 지정해주면 cart로 쏘옥쏙 들어가게 된다.

4. 주문화면!

이제 카트에 담아둔걸 표시하면서 이대로 결제를 할것인지 물어봐야하지 않겠는가?
우선 카트로 담으면 다시 메뉴로 나가지게는 해뒀으니까
카트에 담고 메뉴로 가서 카트에 있는 목록을 긁어와보도록 하자
그러기위해선 근원이 되는 order클래스가 필요하다
만들어보도록하자고

우선 리스트 타입을 이용할꺼니까

private List<Product> products;

선언해주고
product에서 받아와서 써야하니까 그걸 초기화하고 그 메뉴만 따올거니까 초기화 해줘야한다

public Order() {
    products = new ArrayList<>();
}

그리고 장바구니에 담기면 얼마가 드는지도 알아야하니까 총 가격의 합을 구해줄수있는 메서드를
생성해주도록 하자고

public double getTotalPrice() {
    double total = 0;
    for (Product product : products) {
        total += product.getPrice();
    }
    return total;
}

각 제품의 가격만 쏘옥쏙 받아서 합산을 해줄것이야 그럼 total로 반환을 해주겠지?
그럼 그게 숫자일꺼아냐 그치 그러니까 문자열로 반환을 해서 표시해줄 필요가 있으니까

@Override
public String toString() {
    StringBuilder builder = new StringBuilder();
    for (Product product : products) {
        builder.append(product).append("\n");
    }
    builder.append("Total Price: ").append(getTotalPrice());
    return builder.toString();
}

이리하여 오더의 클래스가 대강 완성이 됬으면
장바구니 부분도 만들어줘야겠지?
기본적으로 구동이 되는 키오스크 클래스로 돌아와서

    private void checkout() {
        if (cart.isEmpty()) {
            System.out.println("\n장바구니가 비어 있습니다.");
            return;
        }

우리 아무것도 안담고 장바구니 히히 하며 눌러볼 고객을 위해 비어있다고 표시도 해주도록하자

        System.out.println("\n주문목록");
        double total = 0;
        for (Product product : cart) {
            System.out.println("- " + product);
            total += product.getPrice();
        }
        System.out.println(" 결제 금액 : ₩ " + total );

장바구니에 무언갈 담은 사람들은 각 가격을 합해주는 for문을 사용해서 냅다 더해서 밑에 표시를 해주도록 해주고

        System.out.println("\n결제하시겠습니까?");
        System.out.println("1. 결제하기");
        System.out.println("2. 취소하기");
        System.out.print("선택: ");
        int choice = scanner.nextInt();
        scanner.nextLine();

드실껀지 여쭈어본뒤에 만약 1번이 선택이 되면 결제 후 바로 다시 메뉴로 나갈수있게끔 만들어두자고

        if (choice == 1) {
            System.out.println("결제가 완료되었습니다. 이용해주셔서 감사합니다!");
            cart.clear();

이렇게 이용해 주셔서 감사하다는 말과 함께 장바구니를 비우는것으로 모든 일이 끝나게끔 만들어 주었다.
그런데 여기서 문제
5번이 남았구나...주문을 완료하면 대기번호를 발급하고 3초뒤에 메뉴판으로 돌아가라고...?
젠장 해보자고!!!

5. 주문 완료 화면

저기 저 if부분만 조지면 되겠군!!!!!!!!!!!
자 우선 대기번호를 지정해줘야해 무조건 1번부터 시작이지 넌 대기를 해야하니까!!!!

private static int waitingNumber = 1; 

세상 간단하게 1번부터 시작을 지정해주고
결제가 완료되면 웨이팅 번호 지정해주고 ++로 인트수를 늘려주면 2번이 되겠지 ㅎㅎ

 System.out.println("당신의 대기 번호는 " + waitingNumber + "번입니다."); 
 waitingNumber++;

이러면 뭐 깔끔하게 되는것이지뭐~
그리고 문제의 3초 대기 후 메인화면으로 넘어가기
이건 배운게 있지
try-catchThread.sleep을 이용하면 된다는것을!!!

        try {
            Thread.sleep(3000); 
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

밀리세컨이기 때문에 3000이 3초이다!!!
그렇게 돌아가게 되서 테스트를 해봤는데...
젠장 아무 멘트 없이 그냥 바로 돌아가버렸다..
안된다 이럼 안되는것이다.....
멘트를 넣었는데 또 문제가 있다...
그냥 "3초뒤 돌아갑니다" 면서 아무런 안내없이 그냥 넘어가는것이 아니겠는가...?
그래서 고민한다
어찌해야 3초가 점점 줄어들게 보여줄수 있을까!!!!!!!!
그럼 차라리 하나씩 뽑아서 3->2->1으로 출력을 해주면 어떨까!!!
우린 그것을 배운적이 있다 하나씩 감소시켜서 출력해주는거 그것은 바로
for문을 이용하자!!!!!!!!!
3부터 감소를 해야하니까~

for (int i = 3; i > 0; i--) {

만들어주고 i를 출력하면서 "초 후 메인 메뉴로 돌아갑니다"가 표시되게 하고
위를 그대로 써주면!!!!
멍청이....각 1초가 아니라 3초를 대기를 하고 2초남았다고 하고 1초남았다고 하며 총 9초가 걸리게 만들어버렸다..
그래서 Thread.sleep(1000)으로 해주며 깔끔히 해결!!!
그래서

for (int i = 3; i > 0; i--) {
 System.out.println(i + "초 후 메인 메뉴로 돌아갑니다");
try {
 Thread.sleep(3000); 
 } catch (InterruptedException e) {
e.printStackTrace();
 }
}

로 해주면서 3초 대기까지 완벽하게 만들어 줬다 이제 마지막이 뭐더라,,....

6. 취소 화면!!!!!

현재 이 코드에서 6.나가기를 누르면 나는 그냥 프로세스가 종료되게끔 해뒀는데
진짜로 나갈지 물어봐야하는 코드를 쓰라고 하셨다...뭐 요구사항이 그러니 써보도록 하자고

case 6:
System.out.println("이용해주셔서 감사합니다!");
return;

원래는 이렇게 냉큼 보내버리는 코드였지만 이제는 확인 사살을 해줘야하니 새로운 매서드를 불러오는 식으로 바꿔보자
취소화면이니까 메서드는 exitMeun라고 해보자고

    private void exitMenu() {
        System.out.println("주문을 취소하시겠습니까?진짜로 그냥 가는거에요???");
        System.out.println("1. 당차게 종료하기");
        System.out.println("2. 미련뚝뚝 돌아가기");
        System.out.print("선택: ");
        int exitChoice = scanner.nextInt();
        scanner.nextLine();

        if (exitChoice == 1) {
            System.out.println("이용해주셔서 감사합니다!다음엔 맛난걸로 준비해둘게요...");
            System.exit(0);
        } else if (exitChoice == 2) {
            return;
        } else {
            System.out.println("잘못된 선택입니다. 다시 선택해주세요.");
        }
    }

이렇게 해서 원하는 기능을 실행하려고 했는데
테스트로 실행을 해보니 원래는 2번 미련뚝뚝을 선택하면 메인메뉴를 다시 보여줘야하는데 종료가 되는것이 아닌가...
뭐가 문제지 뭐가 문제일까 무엇이길래 이런 문제가 발생하는가....

정답...나는 똥멍청이

젤 위에 스위치 문에서 6을 누르면

case 6:
System.out.println("이용해주셔서 감사합니다!");
return;

이렇게 되어있었는데....멍청이 그냥 가운데 System.out.println("이용해주셔서 감사합니다!");이 부분만 exitMeun()메서드 호출로 바꿔버린것이다...멍청이
브레이크를 걸어줘야지...그래야 여기서 지정해준 return이 되지....
그렇게

case 6:
exitMenu();
break;

해주니 해결이 되었다고 한다....똥멍청이..

필수사항 완료?

필수 사항은 어느정도 완료된듯 보이는데 뭔가 아쉽다 여기서 요구하는것은 6번을 눌렀을떄 장바구니가 비워지며 프로그램을 종료가 아닌 장바구니만 비우는 기능인데 내가 원하는것은 그런게 아니기에 약간 개조를 해보려한다 장바구니 기능에서 차라리 비우기 기능을 만들면 되지 않겠는가?
그리고 주문을 더 보면 되는것이니까!
그럼 그렇게 진행해보도록하자!!!
이 기능은 정말 간단하다!!!!이미거의다 구성을 채워놨기떄문에!!!!
3.다시담기를 만들어주고 케이스에 3을 추가해주면 끝나는 엄청 간단한 일이다!!!!

case 3:
cart.clear(); 
System.out.println("장바구니를 비웠습니다. 원하시는 상품을 다시 담아주세요.");
break;

만들어줌으로서 어느정도 필수 사항은 완료를 했다고 보여진다...
이제 뭔가 더 추가할사항이 있을터이다... 추가 구성(선택요구사항)은 아주 조금 맛만 보자..

추가 요구 사항!!

주문 개수 기능 추가!!!

장바구니에 똑같은 상품이 담기면 주문 화면에서 상품 개수가 출력 되도록 합니다.
....중복으로 하면 갯수를 표기해라??오호라....그럼 하나씩만 뺴는것도 만들어야 하는거아냐??
라는 생각을 했지만 내실력을 믿지못한다...
이정도만 하다가 슬쩍 필요하다 싶으면 고민해보자고...
약간....카트부분을 갈아엎어야하겠다는 생각을 했다...
우선 MapHashMap 기능을 사용해야하니 인포트 해주고 시작하자고...
cartList<Product>에서 Map<Product, Integer>로 변경하여 제품을 키로, 수량을 값으로 저장해보자고..젤위에 있는 친구를 바꿔야겠구만

private Map<Product, Integer> cart = new HashMap<>();

이제 제품을 추가하면 동일한 제품을 늘려주는 걸 설계해보자

    if (choice == 1) {
       cart.put(product, cart.getOrDefault(product, 0) + 1);
        System.out.println(product.getName() + "을(를) 주문목록에 담았습니다.");
    }
}

갯수를 하나씩 늘려주는걸 하는거야!!장바구니에 담았잖아!!!!
그러면 그걸 어떻게 표기해줄까인데
원래는 설명까지 다 있는 상태로 표기를 해줬는데 너무 길어지기에 정신이 없어서 이름과 가격만 가지고 오는 상태로 표기를 해주기로 마음을 먹고 코드 수정에 들어갔다.

System.out.println("\n주문목록");
double total = 0;
for (Map.Entry<Product, Integer> entry : cart.entrySet()) {
Product product = entry.getKey();
int quantity = entry.getValue();
System.out.println(" | " + product.getName()+" | ₩ "+product.getPrice()+ " | " + quantity + " 개 |");
total += product.getPrice() * quantity;
        }

이런식으로 구상해줬다 하나하나 뜯어보자고...

for (Map.Entry<Product, Integer> entry : cart.entrySet()) {

이부분을 사용해서 몇개를 넣었는지를 알게 해주고

int quantity = entry.getValue();

중복되는게 있으면 이쪽으로 갯수를 올려주는 방식으로 한다...
그렇게해서 출력을 하면
냅다 가격이 이상해지기 떄문에

total += product.getPrice() * quantity;

각 가격에 같은게 있으면 곱해주는 식으로 반환해준다!!!!
그러면 이제 출력값이

이렇게 나오게 만들수 있다 이말이야!!!!!!!!!!!
아 머리야!!!!!!!!!!!!!!!

머리를 식힐겸 쓰는 README.md

후...너무 힘들어서 이제껏 한걸 깃에 늘 올리기전에 써보려한다..
마크다운 형식이니 지금 쓰고 있는 이 벨로그와 유사하지 않겠는가????
작성해보자고
우선....프로젝트이름 내가 만든 카페니까
내맘대로 이름 붙히고~
키오스크를 만드는거니 있어보이게 하고~
이미지들도 내 컴퓨터에 있으니 링크를 적당하게 걸어두고~

# `(YULL's CAFE)` Kiosk Project
## Introduction
<span style="font-size: 16px;">이 프로젝트는 카페 키오스크를 가상으로 구현한 자바 기반의 프로그램입니다.<br> 
사용자는 키오스크에서 메뉴를 확인하고, 원하는 상품을 장바구니에 선택해서 담아 결제할 수 있습니다.</span>

## Project Details 
 ### 개발 언어: Java!!!!!![Java.jpeg](src%2Fimg%2FJava.jpeg)

 ### 개발 환경:IntelliJ!!!!!!!!!! ![인텔리제이.png](src%2Fimg%2F%EC%9D%B8%ED%85%94%EB%A6%AC%EC%A0%9C%EC%9D%B4.png)
### 주요 클래스
#### Menu: 사용자에게 제공되는 다양한 카페 메뉴를 보여주려고 만들어둔 클래스이다!!!
#### Order: 사용자가 선택한 상품들의 주문 정보를 관리하며 가격합계도 여기서 뚱땅뚱땅 나온다.
#### Product: 카페의 각 상품에 대한 정보를 가지고 있는 클래스이다...
## Project Motivation
<span style="font-size: 16px;">이 프로젝트는 '내일 배움 캠프'의 자바 언어 주간 개인 과제로 시작하게 되었습니다. 
<br>실생활에서 자주 볼 수 있는 카페 키오스크의 기능을 가상으로 구현하여,
<br>실제 비즈니스 환경에서의 프로그래밍 경험을 얻자라는 당찬 포부와 함께 시작하여!!
<br>하얗게 산화되며 마무리를 헀습니다.</span>

## How to Run
<span style="font-size: 16px;">1.IntelliJ 를 실행합니다.<br>
2.위의 코드들을 복사하여 IntelliJ 프로젝트에 붙여넣기 합니다.<br>
3.Kiosk 클래스에서 main 메서드를 실행하여 프로그램을 시작합니다.<br>

![스크린샷 2023-10-19 오후 3.12.38.png](src%2Fimg%2F%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202023-10-19%20%EC%98%A4%ED%9B%84%203.12.38.png)<br>
<span style="font-size: 20px;"><br>그러면 위 이미지처럼 나올것입니다!!!<br><br>
4.콘솔 창에서 메뉴를 선택하여 입력!!!그 뒤 원하는 상품을 장바구니에 담고 결제합니다.<br></span>
## Conclusion
<span style="font-size: 16px;">이 프로젝트를 통해 실제 카페 키오스크의 주문 및 결제 시스템의 기본적인 동작들을 이해하고 구현하며 작동 원리를 이해했습니다.
<br> 더 많은 기능과 UI/UX 개선과 많은 피드백을 통해 사용자가 원하는 기능을 잘 구성하며 <br>
사용자에게 친화적인 키오스크를 만들 수 있을 것입니다.</span>

이런식으로 썻지만 언제든 수정할수있으니께~~~머리가 좀 식는다....
이제 내가 잘 모르는 부분을 해야할떄이다
바로!!!!!!!

.gitignore!!

내가 전혀 모르는분야인데 나의 사적인 욕망이 깃에 같이 올라가버리면 안되니까
무시할수있도록 세팅해주는것이다

여기서 나는 코드를 제외한 모든것들이 올라가서 보이는걸 원하지 않기 때문에!!
모조리 지워버릴것이다
의외로 간단했다
저 사진의 .gitignre에 들어가서 조금만 뚱땅뚱땅 수정해주니 완료가 되어버려 조금 허망하였다고 한다...허허
하지만 쉽게 가더라도 새로운걸 배운거잖아!!!
그래서 이제는 드디어 커밋 푸쉬를 하고 깃을 확인해 보려한다.
그래 뭐 안된거 같은데 어쩌겠어 다시 해봐야지...성공하고 말테다

....


처절한 흔적이 보이는가...?
문제는 이미 깃에서 추적을 하고있어서 올리기전에 작성을 해야만 하는 것이였던 것이였다..
이렇게 되면 깃에서 추적을 끊어줘야지만 가능한데
그방법또한 찾아봤다.(나날이 구글링실력만 늘어난다)
우선 깃파일 추적을 지우는 법은
git rm으로 시작한다
그런데 여기서 로컬파일은 남기고싶다면(나는 남겨야해!!)--cached옵션을 추가해야한다.
그렇게 내가 하고자 하는 바를 이루려면 과정은 이러하다
우선 1번 먼저 끊어주자
터미널을 열고

git rm --cached -r src/img //src폴더에 img	폴더를 끊어주는것이다
git commit -m "무조건 커밋을 써야만 하니까 일단 작성"
//이렇게 하면 일단은 끊어졌다!!!!
//그리곤 이제  .gitignore 파일에 src/img/를 추가해주고
git push 를 해주면 끝!!!!!!!

완료가 되었다 이말이야!!!!!

너무도 다행스럽고 만족스럽게 완료를 했다...
이제 발 뻣고 잘 수있겠다..
사실 이거 안했으면...추가요구사항 하나더 할수있었겠지?
만 그런건 중요한게 아니다
내가 해내야하겠단걸 했다는것이 중요하지 않겠는가!!!!!

회고

오늘도 한없이 코딩만 하다가 끝이 났다...누군가는 1시간이면 할 일을 나는 2일쨰 잡고있는게 좀 억울하기는 하지만 그래도 공부에 왕도가 어디있던가 언젠간 가다보면 도착하는 느린거북이라도 꾸준하게 묵묵하게 하루에 하나라도 배워 가는게 중요한것 아니겠는가?
내일은 추가 요구사항을 작성해보다가 머리가 아프고 터질듯하면 빠르게 알고리즘 문제로 도망가야겠다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글