10월 23일

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

내일 배움 캠프

오늘은 프로젝트의 마지막 날이다..
아직 해결하지 못한 일이 있는데 어떻게든!!!어찌되었든간에!!!해결해보는게 목표이지만
너무 많은 스트레스를 받을듯하면 잠시잠시 딴짓도 하며 해결하는것이 오늘의 목표이다!

날 괴롭히는 2번 추가 요청사항(옵션추가하기)

자 다시 시작을 해볼건데...하...
막막하네
제출 잘할수있을까 8시까지...?
안된다...
해본방법
옵션을 표현하는 Option 클래스 생성
Product 클래스에 옵션 목록 추가
사용자에게 제품 선택 후 옵션을 선택할 수 있는 메뉴 추가
선택한 옵션을 제품에 추가하고 가격을 업데이트
카트에 제품 추가 시 옵션 정보 포함하여 추가
순서는 완벽했다고 생각했는데
나는 능력부족인가보다..
진짜 도저히 안된다...
왜지...
뭐가 하나가되면 하나가안되서 욕심을 부리다보니 전혀 안되는 방향으로 가고있다..
진짜 언제부터 어떻게 설계가 잘못된걸까????

처참한 패배의 흔적이다..
가능할까?
이제는 내 생각이 틀린게 아닐까라는 의문이 들고 스스로가 낮아지는 중이다
어찌해야할까 짜증이 난다..
이번에도 실패다
점점 코드가 꼬여간다
자 오류라도 보고는 해보자
어떤식의 오류가 나는가
1.일단은 옵션 클래스를 새로 지정을 해주었다.
2.옵션을 지정해준것에 있어 프로덕트 클래스에도 항목을 추가해줬다
3.프로덕트클래스에서 카트로 넘기고 카트에서 추가할건지 질문하는 메서드를 작성해주었다.
4.....옵션보기가 뜨면....추가된가격이 안뜨고
추가된 가격이 뜨면 이름이 안뜨고
5...추가를 어찌저찌해서 보면 오더 항목에는 안뜨고 가격이 불안정하게 합쳐지고 그러는 중이다
6.옵션이 중복으로 표기가 되어버린다...

젠장...해결했다고.....드디어!!!!!!!!!!!

나의 오만하고 방자함의 결과가 실패의 연속이였음을 알게되었다....
이유가 뭐냐고?너무 간결하게 쓰려고 헀으니 더 꼬이고 있었던거엮ㅆ어...
마지막으로 포기하는 심정으로 좀 길게 중복문도 쓰고 하면서 어려운 문법도 좀 쓰고 해보자!!하면서 하던것들때문에 망하고있었던 거였다...
우선 여러분의 시간은 소중하니 해결한것만 보여보도록하자...
앞서 말했듯이 일단 필수적인 요쇼로 Option클래스의 생성이였다.

1. Option클래스 생성.

package Kiosk;

public class Option {
    private String name;
    private double price;

    public Option(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    @Override
    public String toString() {
        return name + " (₩" + price + ")";
    }
}

옵션의 이름과 가격을 받을수있게 만들어주고 생성자를 통해서 객체생성과 이름,가격을 초기화 할수있게 해준다.
그리곤 뭐 반환하는것들 써주고 이름에 가격포함해주는거 써주면 사실상 옵션에서 손댈껀 없어진다.

2. Product클래스 수정

여기서 부터 문제가 많았다...

   private Option selectedOption;
    private String originalName;
    private double originalPrice;

우선 가장먼저 받아올꺼야!!!라고 말을해주고 저장할수있게끔 해주는것이 중요하다...
그렇게 추가를 해준뒤에 메서드를 작성한다.

        this.originalName = name;
        this.originalPrice = price;
    }

    public Option getSelectedOption() {
        return this.selectedOption;
    }

    public void setSelectedOption(Option option) {
        this.selectedOption = option;
    }

    public Product withOption(Option option) {
        Product newProduct = new Product(this.originalName + "(" + option.getName() + ")",
                this.getDescription(),
                this.originalPrice + option.getPrice(),
                this.category);
        newProduct.setSelectedOption(option);
        return newProduct;
    }

원래 있던 코드는 생략을 하겠다...너무 화가났었으니까 기억도 잘 안나기도 한다.
특정 제품의 옵션을 선택하면 setSelectedOption 메서드를 호출하여 해당 제품에 옵션을 설정하게 하는데 withOption을 통해서 현재 제품의 복사본을 생성하고 그 복사본에 주어진 옵션을 적용한 후, 그 복사본을 반환한다...이렇게 해야지만 이제 원래 제품에 가격이나 정보를 엎어버리는게 아닌 그저 복사한내용에 새로운 친구를 형성할수 있게 되었다.
예를 들어, "아메리카노" 제품에 "아이스" 옵션을 추가하면, "아메리카노(아이스)"라는 새로운 제품이 반환하게 하는것이다...
후....자 이제 이까지 했으니 마지막 단계로 넘어가보자고...
가장 짜증나고 가장 잘 안되었던 인터페이스 부분

3. 본격적인 옵션 추가...

가장 먼저 한것은 옵션을 어떻게 추가할것인가였다.
거기서 계속된 실수를 반복하게 되었고 그것들을 불러오면서 계산 오류과 이상한게 발생을 많이 하고 내가 원하는대로 구성이 되지않았기에 그냥 단순하고 확실한 방법으로 가기로 했다.

    private Option coffeeOption1 = new Option("아이스", 0.5);
    private Option coffeeOption2 = new Option("시럽추가", 0.3);
    private Option teaOption = new Option("아이스", 0.5);
    private Option toastOption = new Option("커피 세트", 3.0);
    private Option dessertOption = new Option("커피 세트", 3.0);

이 얼마나 직관적이고 무식한 방법이지 않는가? 커피옵션 티옵션 등등 그냥 냅다 추가해버린것이다...뭐!!!이런들 어떠하고 저런들 어떠하리...그냥 되기만하면 되야지 일단 내 멘탈을 지켜야하니까...

    private void addProductToCart(Product product) {
        System.out.println("\n" + product.getName() + " | ₩ " + product.getPrice() + " | " + product.getDescription());
        System.out.println("1. 옵션보기");
        System.out.println("2. 그냥담기");
        System.out.print("선택: ");
        int choice = scanner.nextInt();
        scanner.nextLine();

그리곤 카트부분에 원래는 바로 담을건지 물어보는 문구가 출력됬었지만 옵션보기의 항목을 새로편성해 주었다..
그리고 1번 옵션보기를 선택할시에는

        if (choice == 1) {
            if (product.getCategory().equals("Coffee")) {
                showOptions(product, coffeeOption1, coffeeOption2);
            } else if (product.getCategory().equals("Tea")) {
                showOptions(product, teaOption);
            }
        } else if (product.getCategory().equals("Toast")) {
            showOptions(product, toastOption);
        } else if (product.getCategory().equals("Dessert")) {
            showOptions(product, dessertOption);
        } else if (choice == 2) {
            cart.addItem(product);
            System.out.println(product.getName() + "을(를) 주문목록에 담았습니다.");
        } else {
            System.out.println("잘못된 선택입니다. 다시 선택해주세요.");
        }
    }

정말 단순하고 확실한 방법인 if문을 사용해줬다..
원래는 switch문을 사용해서 각 카테고리별로 불러오기했었는데
그게 오류가 너어어어어무 많아서 내가 확실하게 아는 if문을 사용해버렸다 ㅎㅎ
후에 관리도 편하지 않는가!!!옵션을 어이!추가 하고 싶으면 그냥 냅다 저 위에다가 기존옵션에번호 달고 새로운 옵션에 번호 달면 되니까!!!!!
잘한거야!!!!!!!!!!!!
그리고는 이제

    private void showOptions(Product product, Option... options) {
        System.out.println("\n[옵션 메뉴]");
        int i = 1;
        for (Option option : options) {
            System.out.println(i + ". " + option);
            i++;
        }
        System.out.println(i + ". 취소하기");
        System.out.print("선택: ");
        int choice = scanner.nextInt();
        scanner.nextLine();

        if (choice > 0 && choice <= options.length) {
            Product newProduct = product.withOption(options[choice - 1]);
            cart.addItem(newProduct);
            System.out.println(newProduct.getName() + "을(를) 주문목록에 담았습니다.");
        }
    }

옵션을 보여주는 항목을 만들어야하니까 옵션 표를 만들어 줬다.
가변인자를 활용해서 막 변할수있는 옵션들을 받아주도록 해서 배열처럼 사용해주고
모든 옵션을 출력해주기위해서 for문을 이용하여서 순서대로 나올수 있게끔해주었다.

그리곤 옵션을 안담고 취소하려는 사람을 위해 취소하기를 배치해두고
마지막 옵션을 선택했을시에는 여지껏 빌드업 해왔던 것처럼 새로운 객채를 만들고 새로운 객채를 주문목록에 담는것으로 끝이 난다...
여기서 해줘야할거 같은거는 옵션보기와 그냥담기 그리고 아예 돌아갈 사람을 위해 메인메뉴로 다시금 돌아가는 버튼을 만들어주면 될것같다

이로서 어찌 출력되는지 자랑을 좀 하겠다!!!

출력 자랑




크히히히히힣 했으니까 망정이지 안그랬으면 너무 화가 났겠지...?
하지만 했지않는가?

무의미한 도전은 없다고 느끼는 것이였다...(아래에는 확장된 개소리)

이 성취감 어쩔꺼야...옵션 좀더 추가하고는 이제 저장해야징
이런것들을 하다보니 하루가 정말 빠르게 흐르는구나 싶었다...
하지만 아직 남은 시간 확실하게 달려보자고!!!!
그렇게 하면서 니체씨를 떠올리게 됬다

허무주의에 대해서...(헛소리와 생각의 흐름...)

니체는 삶의 고통과 도전 앞에서 "고통이 너를 죽이지 않는다면, 너를 더 강하게 만든다"는 유명한 말을 남겼다. 이 말이 갑자기 코드를 작성하는 나에게 반영된다는게 느껴졌다...진짜 너무 뜬금없지 않는가? 처음에는 "괴물을 상대할떄는 괴물이 되지않게 조심해야한다" 라는 말이 떠올랐을뿐인데 생각을 하다보니 너무 맞아 떨어지는 느낌이였다. 코드 작성의 과정은 복잡하고 힘들게 느껴지기도 한다. 초기 설계의 문제, 예상치 못한 버그, 그리고 기능의 추가나 삭제로 인한 코드의 전체적인 재작성은 때로는 허무주의적인 생각을 가져옴을 느끼게 됬다...허허허허. "왜 이렇게 많은 시간과 노력을 투자하는데, 결과가 나타나지 않는 것일까?"라는 의문이 든다(사실 능력부족일꺼야).

하지만, 이런 도전과 실패는 프로그래밍의 필수적인 부분이라고 생각한다면 조금은 마음이 편하다. 그것들을 극복하고 나면, 그 과정 자체가 개발자로서의 성장을 가져온다. 우리는 매번의 도전 속에서 새로운 해결 방법을 배우고, 더 나은 코드 작성 방법을 익힌다. 또한, 이런 과정을 통해 우리는 끈기와 인내의 중요성을 깨닫게 된다.

프로그래밍은 능동적 허무주의의 완벽한 반영이라고 보여진다. 이번에 프로젝트에서 뿐아니라 모든 프로젝트에서는 실패와 재시도가 성공으로 이어지며, 이 과정은 단순히 작업의 반복이 아닌, 능동적으로 자신의 한계를 극복하고 성장하는 과정이다. 반면, 완전한 허무주의에서는 모든 것이 의미 없다고 여겨지지만,성취감은 그 허무를 극복하고 새로운 의미와 가치를 창출한다.결국, 모든 도전과 실패를 극복함으로써, 우리는 삶의 깊은 의미와 가치를 재발견하게 되며 허무주의를 극복하는 것이 아닌 능동적 허무주의로 우리의 가치는 우리가 만들어가는것임을 그 성취감으로 일어서서 나아가는 것임을 알아갈수있게 되니까 이 프로젝트 과정중에 나는 더욱 많은것을 느끼고 알게 된것 아닐까???

알고리즘

1. 대소문자 바꿔서 출력하기

대소문자 바꿔서 출력하기
문제 설명
영어 알파벳으로 이루어진 문자열 str이 주어집니다. 각 알파벳을 대문자는 소문자로 소문자는 대문자로 변환해서 출력하는 코드를 작성해 보세요.

제한사항
1 ≤ str의 길이 ≤ 20
str은 알파벳으로 이루어진 문자열입니다.
이라는 문제를 풀어보자...
비록 Lv.0이기는 해도 풀어보자구

import java.util.Scanner;

public class SwapCase {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        System.out.println(input.chars()
                               .map(c -> Character.isLowerCase(c) ? Character.toUpperCase(c) : Character.toLowerCase(c))
                               .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
                               .toString());
    }
}

1.스캐너를 이용할것이라고 제시되어있기에 스캐너를 쓰도록 하자
2.변수를 받아서 저장을 하면 이제 일해야겠지 코드야?
3.Character.isLowerCase(c) ? Character.toUpperCase(c) : Character.toLowerCase(c)을 통해서 소문자면 대문자로 대문자면 소문자로 변경을 하도록 해보자구...
4.결과값을 담을 객채를 생성해주고 마지막에 문자열로 반환하여 출력하면 끝

하...힐링이였다...
이상하게 많은것보다 간단하게 하는 힐링이였다..

회고

오늘 하루는 여러 면에서 도전적인 날이었다. 많은 것을 배우고 경험하면서도 때론 좌절감에 휩싸였다.그러나 완성이라는 내 목표를 잊지 않고 한 발짝씩 나아갔고, 결국엔 목적지에 도달했다는 사실에 큰 의미를 둔다.
물론, 모든 것이 완벽하게 진행된 것은 아니었지만, 그 과정에서 얻은 깨달음과 경험은 더 큰 가치를 가진다고 생각한다.비록 오늘은 체력적, 정신적으로 많이 힘들었지만, 그래도 나의 끈기와 의지로 모든 일정을 마무리 지었다는 것에 성취감을 느낀다. 내일을 위해서 또 에너지를 챙겨야 할것이다!!!!

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

0개의 댓글