TIL

TIL12. 키오스크 Lv4~5 진행

에그마요샌드위츼 2025. 3. 13. 20:06

https://fhtepgocprkswjfgka.tistory.com/23

 

TIL11. 키오스크 Lv2,3 진행

Lv2. 객체 지향 설계를 적용해 햄버거 메뉴를 클래스로 관리어려웠던 점 - 배열 출력  실수한 코드 & 오류 menuItems= new ArrayList(); menuItems.add(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토

fhtepgocprkswjfgka.tistory.com

 

 

Lv4. 객체 지향 설계를 적용해 음식 메뉴와 주문 내역을 클래스 기반으로 관리하기

1. Menu 클래스 생성

  • List<MenuItem>은 Kiosk가 관리하기 별로니 Menu 클래스가 관리
  • Menu 클래스에서 카테코리를 만들고 카테고리 내에 여러 MenuItem을 포함
public class Menu {
    List<MenuItem> menuItems;
    String category; 
    public Menu(String category) {
        this.category = category;
        this.menuItems = new ArrayList<>();
    }

    public void addItem(MenuItem item) {
        menuItems.add(item);
    }
}

 

2. Kiosk 클래스의 변경 사항

  • Kiosk 클래스에서 menuItem을 담당하지 않고, 각 Menu 객체에서 메뉴 항복을 가져온다.
  • Menu 클래스에서 getMenuItems()를 추가해 메뉴 항목을 가져올 수 있게 한다.
  • Main에서 객체 생성하고 메뉴 항목을 추가 
  • Main 함수에서 Kiosk 객체 생성 후 Category를 Menu에 전달

(1) 진행 중에 발생한 오류들과 수정 과정

  • Mainmenu에서 카테고리를 가져와야 하는데 저 부분을 수정하지 않아서 menuItem.get(i)를 categories.get(i)로 바꿨다.
  • NullPointerException이 발생하는 이유 > this.categories가 null이기 때문이다.
    • categories를 초기화하지 않아서 생긴 문제!!!

  • Kiosk 클래스 내에서 초기화 코드 추가
 public Kiosk() {
        this.categories = new ArrayList<>(); // 초기화 코드 추가
    }

(2) 두번째 오류 

발생 원인 

  • toString()메서드가 제대로 오버라이딩 되지 않아서 객체의 클래스 명이 출력 됨 
  • menu클래스에서 toString()을 오버라이딩 하면 될 듯

해결

 

 

Lv5. 캡슐화

  • MenuItem, Menu, Kiosk 클래스를 직접 접근 못하도록 수정
  • Getter와 Setter 사용

getter과 setter 사용하는 이유

객체지향에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다.

그 이유는 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨질 수 있기 때문

이러한 문제를 해결하기 위해 객체지향 프로그래밍에서는 메소드를 통해서 데이터를 변경하는 것을 선호한다.

데이터는 외부에서 접근할 수 없도록 막고 메소드는 공개해 외부에서 메소드를 통해 데이터에 접근하도록 한다

  • setter - 값을 받아 멤버변수에 저장하는 메서드
  • getter - 값을 뱉어오는(가져오는) 메소드

클래스를 선언할 때 가능하면 필드는 private로 선언해서 외부로부터 보호하고,
필드에 대한 setter와 getter 메소드를 작성해서 필드값을 안전하게 변경/사용 하는 것이 좋다.