목차
개요
개발자를 곤란하게 하는 null에 대해서 알아보고 그 null 값을 명시적으로 처리할 수 있는 Optional이 무엇인지 알아봅시다.
목차
1. null
- NullPointerException
- null 처리 방법
2. Optional
- Optional 구조
- Optional 특징
- Optional 클래스 주요 메서드 및 코드 예제
- Optional 사용 예제
null
객체가 존재하지 않음을 나타내는 키워드입니다.
NullPointerException
`null`을 참조하려 하면 발생하는 런타임 오류입니다.
- 런타임 오류는 언체크 예외로 컴파일러가 잡아주지 않습니다. (따라서 처리를 안해주면 큰일난다.)
발생하는 상황은 다음과 같습니다.
String name = person.getName(); // person이 null이면 NullPointException 발생 가능
- `null` 체크를 하지 않으면 예외가 발생한다.
null 처리 방법
`if (obj != null)` 과 같은 체크를 해야 합니다.
if (user != null) {
Address address = user.getAddress();
if (address != null) {
String city = address.getCity();
...
}
}
- 중첩된 if문이 많아짐 → 가독성이 떨어집니다
- 실수로 빠뜨리면 `NullPointerException` 발생합니다.
Optinal
Optional은 Java 8에서 도입된 클래스이며, null이 될 수 있는 객체를 감싸는 클래스입니다.
Optional 구조
Optional<String> name = Optional.of("Alice");
Optional<String> empty = Optional.empty(); // 값 없음
Optinal 특징
- `null` 값을 직접 사용하는 것보다 안전합니다..
- 값이 없을 수 있다는 의미를 명시적으로 표현할 수 있습니다.
- 반환값이 Optional인 메서드 호출 시 명시적으로 값의 유무를 처리하게 강제합니다. (안하면, 컴파일 오류)
- 조건문을 사용하는 것보다 가독성이 좋고 안정적입니다.
Optional 클래스 주요 메서드 및 코드 예제
// null이 될수 있는 값을 감쌈
Optional<String> name = Optional.ofNullable(user.getName());
// 값이 있으면 출력
name.ifPresent(System.out::println);
// 값이 없으면 기본값 사용
String finalName = name.orElse("Unknown");
// 값이 없으면 예외 던지기
String finalName2 = name.orElseThrow(() -> new IllegalArgumentException("No name"));
Optional 사용 예제
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
class User {
private String name;
private String email; // null일 수도 있음
public User(String name, String email) {
this.name = name;
this.email = email;
}
public Optional<String> getEmail() {
return Optional.ofNullable(email);
}
}
- getEmail() : email 값을 Optional로 감싸서 반환합니다.
class UserRepository {
private Map<String, User> users = new HashMap<>();
public UserRepository() {
users.put("alice", new User("Alice", "alice@example.com"));
users.put("bob", new User("Bob", null)); // 이메일 없음
}
public Optional<User> findByName(String name) {
return Optional.ofNullable(users.get(name));
}
}
- findByName() : 사용자 이름을 Optional로 감싸서 반환합니다.
public class Main {
public static void main(String[] args) {
UserRepository repository = new UserRepository();
String email = repository.findByName("bob") // bob은 있지만 email은 없음
.flatMap(User::getEmail)
.orElse("no-email@example.com");
System.out.println("이메일: " + email); // 출력: 이메일: no-email@example.com
}
}
- 찾는 유저("bob")의 이메일은 null이므로, "no-email@example.com"이 출력됩니다.
'JAVA' 카테고리의 다른 글
[Java] 자바 웹 기술의 역사 (0) | 2025.05.18 |
---|---|
[Java] Lombok 라이브러리 (0) | 2025.05.10 |
[Java] 동등성과 동일성 (0) | 2025.05.04 |
[Java] Enum (0) | 2025.05.04 |
[Java] Lv_4 도서관 프로젝트 (0) | 2025.05.02 |