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 메소드를 작성해서 필드값을 안전하게 변경/사용 하는 것이 좋다.