📌Back-End/Java

Java 예외 처리, 컬렉션 프레임워크

구 일 2024. 4. 24. 23:17
728x90
반응형

 

 

예외 (Exception)

정상적이지 않은 Case

  • 0으로 나누기
  • 배열의 인덱스 초과
  • 없는 파일 열기
  • 등...

 

 

예외 처리 (Exception Handling)

정상적이지 않은 Case에 대한 적절한 처리 방법

try {

} catch (예외 case 1) {
    
} catch (예외 case 2) {

}
int a = 0;

try {
    a = 5 / 0;
} catch (ArithmeticException e) {
    System.out.println(e);
}

 

 

finally

예외 발생 여부와 관계없이 항상 실행되는 부분

try {
    예외가 발생할 수도 있는 부분;
} catch (예외 case 1) {
    예외 case1이 발생해야 실행되는 부분;
} finally {
    항상 실행되는 부분;
}

 

 

throw, throws

throw : 예외를 발생 시킴

throws : 예외를 전가 시킴

.... 함수이름 () {
    throw new Exception();
}


.... 함수이름() throws Exception {
    
}

 

 

컬렉션 프레임워크(Collection Framework)

여러 데이터를 편리하게 관리할 수 있게 만들어 놓은 것

- 자료 구조 및 알고리즘을 구조화

대표 인터페이스

- List 인터페이스, Set 인터페이스, Map 인터페이스

 

 

List 인터페이스

순서가 있는 데이터의 집합

데이터 중복 허용

대표 구현 클래스

  • ArrayList
  • LinkedList
  • Vector
ArrayList list1 = new ArrayList();
LinkedList list2 = new LinkedList();
Vector v = new Vector();

 

 

Set 인터페이스

순서가 없는 데이터의 집합

데이터의 중복 허용 하지 않음

대표 구현 클래스

  • HashSet
  • TreeSet
HashSet set1 = new HashSet();
TreeSet set2 = new TreeSet();

 

 

Map 인터페이스

키와 값의 쌍으로 이루어진 데이터 집합

순서를 유지 하지 않음

대표 구현 클래스

  • HashMap
  • TreeMap
HashMap map1 = new HashMap();
TreeMap map2 = new TreeMap();

 

 

import java.util.LinkedList;
import java.util.Scanner;

public class Main5 {
    public static void main(String[] args) {
        System.out.println("[===== 예외 처리, 컬렉션 프레임워크 =====]");
        // 콘솔에서 사용자로 부터 숫자를 입력받아 음식을 주문하는 프로그램

        order();
    }

    /**
     * 주문
     */
    public static void order() {
        int selectNum = 0; // 메뉴 선택
        int count = 0; // 수량
        boolean run = true; // 반복문 종료를 위한 변수

        LinkedList<MenuInfo> list = new LinkedList<>();
        Scanner sc = new Scanner(System.in);

        while (run) {

            try {
                System.out.println("[===== 주문 시작 =====]");
                System.out.println("햄버거를 선택해주세요.");
                System.out.println("1. 불고기버거 5000원, 2. 새우버거 4500원");
                selectNum = Integer.parseInt(sc.nextLine());
                System.out.println("수량을 입력해주세요.");
                count = Integer.parseInt(sc.nextLine());

                if (selectNum == 1) {
                    list.add(new MenuInfo("불고기버거", 5000, count));
                } else if (selectNum == 2) {
                    list.add(new MenuInfo("새우버거", 4500, count));
                } else {
                    System.out.println("번호를 다시 확인해주세요.");
                    order();
                }

                System.out.println("음료를 선택해주세요.");
                System.out.println("1. 콜라 2000원, 2. 사이다 2000원");
                selectNum = Integer.parseInt(sc.nextLine());
                System.out.println("수량을 입력해주세요.");
                count = Integer.parseInt(sc.nextLine());

                if (selectNum == 1) {
                    list.add(new MenuInfo("콜라", 2000, count));
                } else if (selectNum == 2) {
                    list.add(new MenuInfo("사이다", 2000, count));
                } else {
                    System.out.println("번호를 다시 확인해주세요.");
                    order();
                }

                System.out.println("디저트를 선택해주세요.");
                System.out.println("1. 아이스크림 1000원, 2. 선택안함");
                selectNum = Integer.parseInt(sc.nextLine());
                if (selectNum == 1) {
                    System.out.println("수량을 입력해주세요.");
                    count = Integer.parseInt(sc.nextLine());
                    list.add(new MenuInfo("아이스크림", 1000, count));
                }

                if (selectNum != 1 && selectNum != 2) {
                    System.out.println("번호를 다시 확인해주세요.");
                    order();
                }

                System.out.println("주문 종료 하시겠습니까?");
                System.out.println("1. 종료, 2. 다시 주문");
                selectNum = Integer.parseInt(sc.nextLine());

                if (selectNum == 1) {
                    run = false;
                } else {
                    order();
                }

            } catch (NumberFormatException e) {
                // 예외 발생 시 처리
                // 숫자가 아닌 다른 값 입력 시 처리
                System.out.println("[ERROR] 숫자만 입력해주세요.");
            } finally {
                // 예외가 발생하거나 예외가 발생하지 않아도 무조건 실행되는 코드
                System.out.println("[===== 주문 종료 =====]");
            }
        }

        sc.close();
        print(list);
    }

    /**
     * 계산 후 출력
     * @param list 주문리스트
     */
    public static void print(LinkedList<MenuInfo> list) {
        int total = 0; // 총액

        // 향상 for문 (foreach)
        for (MenuInfo menuInfo : list) {
            total += menuInfo.price * menuInfo.count;
            System.out.printf("[%s] %8d원\n", menuInfo.name, menuInfo.price * menuInfo.count);
        }

        System.out.println("----------------------");
        System.out.printf("총 %10d원입니다.", total);
    }

    /**
     * 음식 정보
     */
    static class MenuInfo {
        String name; // 이름
        int price; // 가격
        int count; // 수량

        public MenuInfo() {}
        public MenuInfo(String name, int price, int count) {
            this.name = name;
            this.price = price;
            this.count = count;
        }
    }
}
728x90
반응형