[JAVA] 자바 개념 확장 - Exception, Optional, Colletion

2025. 9. 17. 14:48·JAVA

👍 무엇을 새롭게 알았는지

 

 

예외(Exception) 와 예외처리(throw)

  • 예외(Exception) : 프로그램 실행 중 예상하지못한 상황이 발생하는 것을 의미
    • try-catch 예외처리를 통해 프로그램이 안정적으로 실행되게 할 수 있음
  • 예외처리(throw)
    • 특정 상황에서 에외를 명확하게 정의하고 제어할 수 있음

 

  • 예외 구조와 종류
    • RuntimeException - UncheckedException
      • RuntimeException을 상속받는 모든 예외를 UncheckedException 이라고 함
      • 예외처리를 컴파일러가 확인하지 않음
        • 컴파일 오류(빨간 줄)가 발생하지 않음
    • Exception - CheckedException
      • Exception 클래스를 직접 상속받는 모든 예외를 CheckedException이라고 함
        • 단, RuntimeException 과 상속관계에 있는 예외는 제외
        • 클래스에 throws Exception을 
      • 예외처리를 컴파일러가 확인해 줌

 

  • 예외 전파
    • 예외 전파는 메서드에서 발생한 예외가 해당 메서드에서 처리되지 않았을 때 호출한상위 메서드로 전달되는 과정을 의미
      • 예외가 프로그램 시작지점까지 전파되고 처리되지 않으면 프로그램이 비정상 종료됨
      • try-catch문을 어디에 두고 예외처리를 진행할 것인지에 따라 예외처리 메서드에서 실행되게 하거나, 시작지점에서 예외처리를 시작하게 코드를 구성할 수 있음
  • 예시 코드 (Login)
    • Login 클래스에서 예외처리 발생 시의 책임 전가를 Main 메서드로 전가함
      • loginException 메서드는 입력받은 입력값(id, password) 에 대해서 검증만 진행하는 메서드
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로 값 존재 여부 확인 후 처리 
// 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
'JAVA' 카테고리의 다른 글
  • [JAVA] Enum이란?
  • [JAVA] 자바 개념 확장 - Generic, Lambda, Stream, Thread
  • JAVA 객체지향 개념 정리
  • JAVA 문법 규칙 및 GitHub 커밋 컨벤션 학습
stark77
stark77
하마의 IT 자기개발 이모저모, 백엔드 개발자로 거듭나기
  • stark77
    하마의 개발자 성장일기
    stark77
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 컴퓨터구조와 운영체제
        • 컴퓨터구조
        • 운영체제
      • SQL 기초
      • Spring
        • 백엔드 기초
        • Spring 실습
      • JAVA
        • Java 실습
      • HTML&CSS
        • HTML&CSS 실습
      • Git&GitHub
        • Git&GitHub 실습
      • 내배캠 끄적끄적
        • Today I Learned
      • 유용한 툴 및 사이트 정리
      • 취미
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SpringSecurity
    String.format
    git
    네트워크 기초
    java
    Stomp
    실시간 데이터 처리
    WebSocket
    algorithm
    백엔드 기초
    객체지향프로그래밍
    MVC
    Github
    백엔드 기초다지기
    Java 문법기초
    객체지향
    경합조건과 교착상태
    Til
    JPA
    다형성
    웹소켓
    HTML&CSS
    RestTemplate
    thymleaf
    for문
    Spring
    jsp
    프로세스와 쓰레드
    BEAN
    Spriingboot
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
stark77
[JAVA] 자바 개념 확장 - Exception, Optional, Colletion
상단으로

티스토리툴바