Spring & Java
Optional - null을 다루는 법 본문
●예외 ( Exception )과 예외처리 (try-catch)
예외 ( Exception )과 예외처리 (try-catch)
● 예외 ( Exception )과 예외처리 (try-catch) 예외 ( Exception )과 예외처리 (try-catch) 학습 키워드 점검예외 ( Exception ) - 프로그램 실행 중 예상하지 못한 상황예외처리 ( try-catch) - 예외 발생 시 프로그램
devtest1.tistory.com
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 |