👍 무엇을 새롭게 알았는지
예외(Exception) 와 예외처리(throw)
- 예외(Exception) : 프로그램 실행 중 예상하지못한 상황이 발생하는 것을 의미
- try-catch 예외처리를 통해 프로그램이 안정적으로 실행되게 할 수 있음
- 예외처리(throw)
- 특정 상황에서 에외를 명확하게 정의하고 제어할 수 있음
- 예외 구조와 종류
- RuntimeException - UncheckedException
- RuntimeException을 상속받는 모든 예외를 UncheckedException 이라고 함
- 예외처리를 컴파일러가 확인하지 않음
- 컴파일 오류(빨간 줄)가 발생하지 않음
- Exception - CheckedException
- Exception 클래스를 직접 상속받는 모든 예외를 CheckedException이라고 함
- 단, RuntimeException 과 상속관계에 있는 예외는 제외
- 클래스에 throws Exception을
- 예외처리를 컴파일러가 확인해 줌
- Exception 클래스를 직접 상속받는 모든 예외를 CheckedException이라고 함
- RuntimeException - UncheckedException

- 예외 전파
- 예외 전파는 메서드에서 발생한 예외가 해당 메서드에서 처리되지 않았을 때 호출한상위 메서드로 전달되는 과정을 의미
- 예외가 프로그램 시작지점까지 전파되고 처리되지 않으면 프로그램이 비정상 종료됨
- try-catch문을 어디에 두고 예외처리를 진행할 것인지에 따라 예외처리 메서드에서 실행되게 하거나, 시작지점에서 예외처리를 시작하게 코드를 구성할 수 있음
- 예외 전파는 메서드에서 발생한 예외가 해당 메서드에서 처리되지 않았을 때 호출한상위 메서드로 전달되는 과정을 의미
- 예시 코드 (Login)
- Login 클래스에서 예외처리 발생 시의 책임 전가를 Main 메서드로 전가함
- loginException 메서드는 입력받은 입력값(id, password) 에 대해서 검증만 진행하는 메서드
- Login 클래스에서 예외처리 발생 시의 책임 전가를 Main 메서드로 전가함
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Login login = new Login();
while (true){
try {
System.out.print("아이디 입력: ");
String id = sc.nextLine().trim();
System.out.print("비밀번호 입력: ");
String password = sc.nextLine().trim();
login.loginException(id, password);
System.out.println("로그인 성공");
break;
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}
public class Login {
public void loginException(String id,String password) throws Exception{
if (!id.equals("admin") || !password.equals("1234")) {
throw new Exception("로그인 실패! 아이디 또는 비밀번호가 잘못 입력되었습니다.");
}
}
}
Optional
- null 을 안전하게 처리하기 위해서 활용되는 객체
- null 이란 값이 없음 또는 참조하지 않음을 나타내는 키워드
- Optional 객체를 메서드 반환 자료형에 선언하여 해당 메서드가 null 이 반환될 가능성을 명확하게 전달할 수 있음
- NullPointerException 예외는 런타임 예외이고 컴파일러가 잡아주지 못함
- 예외가 발생했을 때 처리해주지 않으면 프로그램이 종료되기 때문에 위의 기능을 반드시 사용해야 함!
- 예시 코드(캠프 수강생 찾기)를 통한 Optional 개념 실습 진행
- 코드의 흐름은 아래와 같음
- 서비스 객체 생성 → 사용자 입력 받기 → 입력값 변수에 저장 → CampService에서 배열 탐색 & Optional 반환 →
Optional로 값 존재 여부 확인 후 처리
- 서비스 객체 생성 → 사용자 입력 받기 → 입력값 변수에 저장 → CampService에서 배열 탐색 & Optional 반환 →
- 코드의 흐름은 아래와 같음
// Main.java
import java.util.Optional;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
CampService campService = new CampService();
Scanner sc = new Scanner(System.in);
System.out.println("캠프에서 찾고 싶은 수강생의 이름을 입력하세요: ");
String name = sc.next();
// 캠프에서 수강생 찾기
Optional<Student> studentOptional = campService.findStudentByName(name);
if(studentOptional.isPresent()){
Student student = studentOptional.get();
System.out.println("캠프에 " + student.getName() + " 수강생이 존재합니다.");
} else {
System.out.println("해당 수강생은 캠프에 존재하지 않습니다.");
}
}
}
// CampService.java
import java.util.Optional;
public class CampService {
// 속성
private static Student[] students = {
new Student("Spartan"),
new Student("Steve"),
new Student("John"),
};
// 생성자
// 기능
public Optional<Student> findStudentByName(String name){
for(Student student : students){
String studentName = student.getName();
if(studentName.equals(name)){
return Optional.of(student);
}
}
return Optional.ofNullable(null);
}
}
// Student.java
public class Student {
// 속성
String name;
// 생성자
public Student(String name){
this.name=name;
}
// 기능
public String getName(){
return name;
}
}
Colletion
- 다양한 자료구조들을 쉽게 사용할 수 있도록 인터페이스와 구현체(ArrayList, HashSet, HashMap)를 제공하는 집합
- 배열과 다르게 컬렉션은 길이를 동적으로 변경할 수 있음
- 배열은 크기가 고정되어 있어 한번 설정하면 길이를 변경할 수 없음
배열의 길이 초과 시 에러가 발생하게 됨
- 배열은 크기가 고정되어 있어 한번 설정하면 길이를 변경할 수 없음
- 선언 방법
컬렉션객체<자료형> 변수이름 = new 컬렉션객체<자료형>();
// 객체<다룰 데이터: 정수> 변수이름 = new 컬렉션객체생성자<정수>();
ArrayList<Integer> arrayList = new ArrayList<Integer>();
- 자주 사용하는 컬렉션 종류와 특징
| 인터페이스 | 특징 | 구현체 |
| List | 순서 유지, 중복 허용 | ArrayList |
| Set | 순서 없음, 중복 불가 | HashSet |
| Map | 키-값 구조, 중복 불가 | HashMap |
- 예시 코드(ArrayList 사용한 장바구니 예제)
- 기능 선택을 통한 작동형태가 아닌 모든 기능이 작동되는 상황의 흐름을 나타내는 파일 예제를 구현
// Main.java -> 기능 동작 및 메서드 적용이 올바르게 되는지 확인하는 파일
public class Main {
public static void main(String[] args) {
Cart cart = new Cart();
Product onion = new Product("양파", 3000);
Product apple = new Product("사과", 10000);
Product fish = new Product("생선", 12000);
Product tofu = new Product("두부", 2000);
// 장바구니에 상품 추가
System.out.println("장바구니에 상품 추가: ");
cart.addProduct(onion);
cart.addProduct(apple);
cart.addProduct(fish);
cart.addProduct(tofu);
System.out.println();
// 장바구니 상품 조회
System.out.println("장바구니 상품 조회: ");
cart.printCart();
System.out.println();
// 장바구니 총 금액 조회
System.out.println("장바구니 총 금액 조회: ");
cart.calculateTotalPrice();
System.out.println();
// 장바구니 상품 제거(사과)
System.out.println("장바구니에서 사과 제거: ");
cart.removeProduct("사과");
System.out.println();
// 장바구니 상품 조회
System.out.println("장바구니 상품 조회: ");
cart.printCart();
System.out.println();
// 장바구니 총 금액 조회
System.out.println("장바구니 총 금액 조회: ");
cart.calculateTotalPrice();
System.out.println();
}
}
// Product.java -> 상품의 기본적인 변수 선언 및 호출자 선언 (DTO 역할 수행)
public class Product {
// 속성
private String name;
private int price;
// 생성자
public Product(String name, int price) {
this.name = name;
this.price = price;
}
// 기능
public String getName() {
return this.name;
}
public int getPrice() {
return this.price;
}
}
// Cart.java -> 전반적인 장바구니 상품 추가,삭제,조회,총 금액 조회기능을 구현하는 파일
import java.util.ArrayList;
import java.util.List;
public class Cart {
// 속성
private List<Product> cart = new ArrayList<>();
// 생성자
// 기능
public void addProduct(Product product){
cart.add(product);
System.out.println(product.getName() + "가 장바구니에 추가되었습니다.");
}
public void removeProduct(String removeProductName){
boolean removed = false;
for (Product product : cart){
String foundProductName = product.getName();
if (foundProductName.equals(removeProductName)){
cart.remove(product);
removed = true;
System.out.println(product.getName() + "가 장바구니에서 삭제되었습니다.");
break;
}
}
if (!removed){
System.out.println("장바구니에 해당 상품이 없습니다.");
}
}
public void printCart(){
if (cart.isEmpty()){
System.out.println("장바구니가 비었습니다.");
} else {
for (Product product : cart){
System.out.println(product.getName() + ": " + product.getPrice());
}
}
}
public void calculateTotalPrice(){
int total = 0;
for (Product product : cart){
total += product.getPrice();
}
System.out.println("총 금액은: " + total);
}
}'JAVA' 카테고리의 다른 글
| [JAVA] Enum이란? (0) | 2025.09.18 |
|---|---|
| [JAVA] 자바 개념 확장 - Generic, Lambda, Stream, Thread (0) | 2025.09.17 |
| JAVA 객체지향 개념 정리 (1) | 2025.09.16 |
| JAVA 문법 규칙 및 GitHub 커밋 컨벤션 학습 (0) | 2025.09.15 |
| JSP/Servlet 기초 (1) | 2025.09.05 |
