Java/문법

Optional - Null을 안전하게 다뤄보자

JuNo_12 2025. 4. 18. 14:10

Null 이란?

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

이 때, Optional을 활용하여 에러를 방지해주는데

 

Optional 이란?

Optional 객체는 값이 있을 수도 있고 없을 수도 있는 컨테이너라고 생각을 하자.

  • Optional 객체를 메서드 반환 자료형에 선언해서 해당 메서드가 null 이 반환될 가능성을 명확하게 전달할 수 있다.
  • Optional.ofNullable() 을 사용하여 null 이 반환될 수 있는 객체를 감싼다.
  • 활용할 때는 isPresent() 와 같은 Optional API 를 통해 안전하게 null 처리를 할 수 있다.

isPresent() 활용 : Optional 내부의 값이 존재할 경우에 true를 반환

import java.util.Optional;

public class Camp {

    private Student student; // 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("학생이 없습니다.");
        }
    }
}

 

 

orElseGet() 활용

: orElseGet() 은 값이 없을 때만 기본값을 제공하는 로직을 실행하는 메서드

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());
    }
}

느낀점

내가 아직 게터와 세터를 활용하는 방법과 속성 / 생성자 / 기능 에 대한 지식이 제대로 잡혀있지 않은 것 같다.

이전에 배웠던 내용들을 복습해보면서 심화개념들을 익혀보는 것이 좋을 듯하다.