Notice
Recent Posts
Recent Comments
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Spring & Java

Optional - null을 다루는 법 본문

JAVA 개념 확장

Optional - null을 다루는 법

dev.hyuck 2025. 12. 12. 15:17

예외 ( Exception )과 예외처리 (try-catch)

 

예외 ( Exception )과 예외처리 (try-catch)

● 예외 ( Exception )과 예외처리 (try-catch) 예외 ( Exception )과 예외처리 (try-catch) 학습 키워드 점검예외 ( Exception ) - 프로그램 실행 중 예상하지 못한 상황예외처리 ( try-catch) - 예외 발생 시 프로그램

devtest1.tistory.com

● Optional - null을 다루는 법

 

Optional - null을 다루는 법

 

학습 키워드 점검

Optional - null을 안전하게 처리하기 위해서 활용되는 객체

 

Optional 이란?

Optional이 무엇인지 학습해 봅시다.

● Optional 객체는 null을 안전하게 다루게 해주는 객체 입니다.


 

null 이란?

●  null은 프로그래밍에서 값이 없음 또는 참조하지 않음을 나타내는 키워드

● Optional 이 왜 필요한가 ? - 예시를 통해 null이 무엇인지 실습해보세요.


●  null을 직접 다루는 대신 Optional을 사용하면 NullPointerException을 방지할 수 있습니다.

 

Optional이 왜 필요한가?

Optional이 왜 필요한지 Student와 Camp 예시를 통해 학습해 봅시다.

● camp.getStudent () 는 null을 반환할 수 있는 메서드 입니다.

● 학생이 없는 경우 null을 반환하면 NPE (NullPointerException) 가발생합니다.

● null인 객체에서 student.getName() 을 호출하는 것은 존재하지 않는 객체의 메서드를 실행하려는 것입니다.


NullPointerException을 방지해야 하는 이유

● NPE 예외는 런타임 예외이고 컴파일러가 잡아주지 못합니다.

● 예외가 발생했을 때 처리해 주지 않으면 프로그램이 종료됩니다.


public class Student {

    // 속성
    private String name;
    
    // 생성자
    
    // 기능
    public String getName() {
        return this.name;
    }
}

public class Camp {

    // 속성
    private Student student;

    // 생성자
    
    // 기능: ⚠️ null 을 반환할 수 있는 메서드
    public Student getStudent() {
        return student;
    }
    
    public void setStudent(Student student) {
		    this.student = student;    
    }
}

public class Main {

    public static void main(String[] args) {

        Camp camp = new Camp();
        Student student = camp.getStudent(); // ⚠️ student 에는 null 이 담김
        // ⚠️ 아래 코드에서 NPE 발생! 컴파일러가 잡아주지 않음
        String studentName = student.getName(); // 🔥 NPE 발생 -> 프로그램 종료
        System.out.println("studentName = " + studentName);
    }
}

 

NULL을 직접 처리의 한계

NULL을 직접 처리할 때의 한계에 대해 학습해 봅시다.

● if 문을 활용해서 null 처리를 할 수 있지만 모든 코드에서 null이 발생할 가능성을 미리 예측하고 처리하는 것은 현실적으로 어렵습니다.

public class Main {
    public static void main(String[] args) {
        Camp camp = new Camp();
        Student student = camp.getStudent();

        String studentName;
        if (student != null) { // ⚠️ 가능은하지만 현실적으로 어려움
            studentName = student.getName();
        } else {
            studentName = "등록된 학생 없음"; // 기본값 제공
        }

        System.out.println("studentName = " + studentName);
    }
}

 

Optional 활용하기

Optional 활용하는 방법을 학습해 봅시다.

● Optional 객체는 값이 있을 수도 있고 없을 수도 있는 컨테이너라고 생각하시면 됩니다.

● Optional 객체를 메서드 반환 자료형에 선언해서 해당 메서드가 null 이 반환될 가능성을 명확하게 전달할 수 있습니다.

● Optional.ofNullable() 을 사용하여  null이 반환될 수 있는 객체를 감쌉니다.

● 활용할 때는 isPresent() 와 같은 Optional API를 통해 안전하게 NULL 처리를 할 수 있습니다.

 

 [ 1 ] isPersent() 활용 방법

● Optional 내부의 값이 존재할 경우에 true 반환합니다.

● 내부 값이 null 일 경우 false 를 반환합니다.

import java.util.Optional;

public class Camp {

    // 속성
    private Student student;

    // 생성자

    // 기능
    // ✅ null 이 반환될 수 있음을 명확하게 표시
    public Optional<Student> getStudent() {
        return Optional.ofNullable(student);
    }
    
    public void setStudent(Student student) {
		    this.student = student;    
    }
}

public class Main {

    public static void main(String[] args) {

        Camp camp = new Camp();
        
        // isPresent() 활용시 true 를 반환하고 싶을때 활용
        // Student newStudent = new Student();
        // camp.setStudent(newStudent);

        //  Optional 객체 반환받음
        Optional<Student> studentOptional = camp.getStudent();

        // Optional 객체의 기능 활용
        boolean flag = studentOptional.isPresent(); // false 반환
        if (flag) {
            // 존재할 경우
            Student student = studentOptional.get(); // ✅ 안전하게 Student 객체 가져오기
            String studentName = student.getName();
            System.out.println("studentName = " + studentName);

        } else {
            // null 일 경우
            System.out.println("학생이 없습니다.");
        }
    }
}

 

[ 2 ] orElseGet() 활용 방법

● orElseGet() 은 값이 없을 때만 기본값을 제공하는 로직을 생성하는 메서드입니다.

● orElseGet() 을 제대로 활용하려면 람다 표현식을 이해해야 합니다.

● 하지만 이 부분은 이후 수업에서 다룰 예정이므로 지금은 메서드를 매개변수로 전달한다 정도로 이해하셔도 충분합니다.

import java.util.Optional;

public class Camp {

    // 속성
    private Student student;

    // 생성자

    // 기능
    // ✅ null 이 반환될 수 있음을 명확하게 표시
    public Optional<Student> getStudent() {
        return Optional.ofNullable(student);
    }
}

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        Camp camp = new Camp();

        // ✅ Optional 객체의 기능 활용 (orElseGet 사용)
        Student student = camp.getStudent()
                              .orElseGet(() -> new Student("미등록 학생"));

        System.out.println("studentName = " + student.getName());
    }
}

 

Q1. 수강생의 이름을 입력받고 해당 이름이 캠프에 등록되어 있는지 확인하는 프로그램을 만드세요.

 

Student , CampService , Main 클래스를 활용하세요.
캠프에는 3 명의 학생이 존재합니다. Spartan, Steve, John
Java

복사
    private static Student[] students = {
            new Student("Spartan"),
            new Student("Steve"),
            new Student("John")
    };
Optional.ofNullable() 로 Optional 객체를 만드세요.
isPresent() 로 Optional 에 값이 있는지 확인하세요.
get() 으로 안전하게 데이터를 꺼내오세요.


public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        CampService campService = new CampService();

        System.out.print("캠프에서 찾고 싶은 수강생의 이름을 입력하세요: ");
        String name = scanner.nextLine();

        // 캠프에서 수강생 찾기
        Optional<Student> studentOptional = campService.findStudentByName(name);
        if (studentOptional.isPresent()) {
            Student student = studentOptional.get();
            System.out.println("캠프에 " + student.getName() + "수강생이 존재합니다.");
        } else  {
            System.out.println("해당 수강생은 캠프에 존재하지 않습니다.");
        }
    }
}

public class Student {

    // 속성
    private String name;

    // 생성자
    public Student(String name) {
        this.name = name;
    }

    // 기능
    public String getName() {
        return this.name;
    }
}

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.ofNullable(student);
            }
        }
        return Optional.ofNullable(null);
    }
}

'JAVA 개념 확장' 카테고리의 다른 글

스트림 ( Stream )  (0) 2025.12.18
람다 (Lambda)  (0) 2025.12.17
제네릭 ( Generic )  (0) 2025.12.15
컬렉션 ( Collection )  (0) 2025.12.15
예외 ( Exception )과 예외처리 (try-catch)  (0) 2025.12.12