일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 함바그
- optional
- Java
- Spring
- 프레임워크
- 캡슐화
- 내일배움캠프
- 스파르타사전캠프
- 깃헙
- springboot
- 메모리구조
- 깃
- 스파르타코딩클럽 #사전캠프
- 스터디카페
- Til
- Interface
- 피드백
- 자바
- static
- til #데이터베이스 #sql
- 스프링부트
- 요시
- 사전캠프
- jvm
- Framework
- validation
- 스파르타코딩클럽
- 스파르타코딩클럽 #개발자 #백엔드
- 레퍼클래스
- 키오스크
- Today
- Total
John's Code Journey
[TIL] 키오스크 과제 본문
필수 과제 level5 까지 구현했다
https://github.com/johnb9823/KioskProject
GitHub - johnb9823/KioskProject
Contribute to johnb9823/KioskProject development by creating an account on GitHub.
github.com
레벨 1은 수월하게 구현했던 거 같은데 레벨2 에서 컬랙션프레임워크를 사용할 때 부터 조금 어려웠던 것 같다. 강의로만 듣다가 직접 만들어 보니 내가 어떤 점이 부족했는지 알게되었다.
List<MenuItem> menuItems = new ArrayList<>();
ArrayList<MenuItem> menuItems = new ArrayList<>();
레벨2에서 처음에 List를 선언 할 때는 ArrayList<MenuItem> menuItems = new ArrayList<>(); 라고 선언을 했는데 문득 궁금해져서 컬렉션 프레임워크 상속계층도를 찾아보니 List가 ArrayList의 상위 클래스라는 것을 알게 되었고,
List<MenuItem> menuItems = new ArrayList<>(); 라고 선언할 때의 이점을 알게 되었다. List로 선언하면 ArrayList 뿐만 아니라 다른 List 구현체도 사용할 수 있어 코드가 유연해지고, List 인터페이스를 사용하면, 내부 구현이 바뀌더라도 외부에서 사용하는 코드에 영햐을 미치지 않는다. 예를 들어 ArrayList에서 LinkedList로 바꾸더라도 List 타입으로 선언했기 때문에 코드를 수정할 필요가 없다. 유지보수성에서도 이점이 있다. 다양한 List 구현체 중에서 상황에 맞는 구현체를 선택해서 사용할 수 있기 때문에 나중에 성능이나 기능을 고려하여 구현체를 교체할 수 있다.
System.out.println("[ SHAKESHACK MENU ]");
menuItems.add(new MenuItem("1. ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
menuItems.add(new MenuItem("2. SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
menuItems.add(new MenuItem("3. Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
menuItems.add(new MenuItem("4. Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));
List<MenuItem> menuItems = new ArrayList<>(); 라고 선언 후 add() 함수로 버거의 이름, 가격, 설명을 추가할 때 처음에는 그냥 menuItem.add("ShackBurger") 라고 넣어주려고 했는데 오류가 발생해서 검색을 해보니
menuItem.add(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거")) 라고 했어야 했다.
이렇게 작성해야 되는 이유는 자바의 객체 생성과 메서드 호출 방식에 관련된 특징 때문이다.
자바에서는 객체를 생성할 때 new 키워드를 사용한다. 예를 들어, new MyClass("example")는 MyClass라는 클래스의 새로운 객체를 생성하면서 생성자의 매개변수로 "example" 값을 전달함. 이 객체는 생성과 동시에 초기화 된다. add() 메서드는 객체를 인자로 받습니다.
예를 들어, add(new MyClass("example"))에서 new MyClass("example")는 그 자리에서 즉시 객체를 생성하여 add() 메서드에 전달하는 방식이다. new MyClass("example")는 객체가 생성되는 순간 그 객체를 바로 메서드의 인자로 넘겨주는 것이다.
이 방식이 가능한 이유는, 자바는 객체 생성식(즉, new MyClass(...))을 표현식(expression)으로 취급하기 때문입니다.
자바에서 표현식은 값으로 평가될 수 있기 때문에, 객체를 생성하는 표현식을 메서드 호출의 인자로 넘기는 것이 가능합니다.
간단히 말해, 자바에서 객체 생성은 표현식으로 취급되며, 이 표현식을 메서드의 인자 자리에 넣을 수 있기 때문에, 객체를 새로 생성한 후 그 객체를 메서드에 넘기는 것이 가능합니다.
Scanner sc = new Scanner(System.in);
boolean flag = false;
while (flag == false) {
// 숫자를 입력 받기
System.out.print("원하시는 버거의 번호를 입력하세요(0을 입력시 종료 됩니다.): ");
int choice = sc.nextInt();
// 입력된 숫자에 따른 처리
switch (choice) {
case 1:
menuItems.get(0).printSelectedMenu();
break;
case 2:
menuItems.get(1).printSelectedMenu();
break;
case 3:
menuItems.get(2).printSelectedMenu();
break;
case 4:
menuItems.get(3).printSelectedMenu();
break;
case 0:
System.out.println("프로그램을 종료합니다.");
flag = true;
break;
}
}
위 코드에서 선택된 메뉴를 불러오는 부분에서 실수가 있었다.
처음에는 menuItem.printSelectedMenu()로 접근 하려고 했는데 오류나 나서 List인터페이스에 기본으로 제공되는 get(Index number)를 이용해서 menuItems.get(0) 으로 시도하니 아래 사진 처럼 같이 계속 원하는 번호를 입력하라고 했음.
그래서 마지막으로 menuItems.get(0).printSelectedMenu(); 로 수정하고 실행을 하니 원하는 대로 출력이 되었다.
레벨4까지 객체지향적으로 코드를 짜는게 힘들었다. 많이 부족하다 중간에 gpt에서 모르는 부분을 물어보면서 코드를 완성할 수 있었다.
레벨5의 조건은 캡슐화 적용하기 였다. 나는 처음부터 필드들을 private으로 만들었기에 그냥 getter, setter만 추가해줬다.
캡슐화를 어디서부터 어떻게 해야될지 감이 안 잡혀서 그냥 냅다 private로 선언하고 getter, setter들을 만들었던거 같다 ...
'Today I Learned > 스파르타 내일배움캠프' 카테고리의 다른 글
[TIL] 네트워크 (0) | 2025.03.18 |
---|---|
[TIL] 계산기 과제 수정 (1) | 2025.03.11 |
[TIL] JAVA 컬렉션 프레임워크 (1) | 2025.03.10 |
[TIL] 250305 계산기 과제 리뷰 (1) | 2025.03.05 |
[TIL] 예외처리(Exception) (0) | 2025.02.26 |