자바 - Optional 클래스: 초보자 가이드

안녕하세요, 미래의 자바 개발자 여러분! 오늘, 우리는 자바의 Optional 클래스의 세계로 흥미로운 여정을 떠날 거예요. 코드를 한 줄도 안 써봤다고 해도 걱정 마세요 – 저는 여러분의 친절한 가이드가 될 테니까요. 점진적으로 이어나가겠습니다. 이 튜토리얼을 끝내면, 여러분은 프로처럼 null 값들을 다룰 수 있을 거예요!

Java - Optional Class

Optional 클래스란 무엇인가요?

물러나기 전에, 작은 이야기를 시작해볼까요. 패키지를 기다리고 있는 상황을 상상해봅시다. 때로는 도착하고, 때로는 도착하지 않습니다. 자바의 세계에서는 우리의 데이터가 때로는 있고, 때로는 없는 상황을 자주 마주치게 됩니다. 이때 Optional 클래스가 우리를 구해줍니다!

자바 8에서 도입된 Optional 클래스는 비어 있을 수도 있는 non-null 값이 들어있을 수도 있는 특별한 컨테이너입니다. null 참조 대신 선택적인 값을 나타내는 방법입니다. 믿어주시면, 이 작은 클래스가 여러분의 코드에서 많은 두통과 잠재적인 오류를 방지해줄 거예요!

왜 Optional이 필요한가요?

"null을 사용할 수 없나요?"라고 궁금할 수 있습니다. 그러나 사랑하는 학생여러분, null은 매우 문제가 될 수 있습니다. 그것은 우려받는 NullPointerException을 유발할 수 있으며, 이는 어두운 밤에 LEGO 조각을 밟은 것과 같은 – 간혹 통계와 예상치 못한 아픔을 주는 것입니다!

Optional은 이러한 상황을 더 우아하게 처리하도록 도와줍니다. 그것은 우리가 공허한 값의 가능성을 고려하고, 그것들을 명확하게 처리하도록 강제합니다.

Optional을 생성하는 방법

첫 번째 Optional 객체를 생성해보겠습니다. 여러 가지 방법이 있습니다:

// 빈 Optional을 생성
Optional<String> empty = Optional.empty();

// non-null 값과 함께 Optional을 생성
String name = "Alice";
Optional<String> optionalName = Optional.of(name);

// null 값을 가질 수도 있는 Optional을 생성
String nullableName = null;
Optional<String> optionalNullable = Optional.ofNullable(nullableName);

이 예제에서는 세 가지 다른 Optional 객체를 생성했습니다. 첫 번째는 빈 것이고, 두 번째는 정확한 값이 있고, 세 번째는 값이 있을 수도 있고, 없을 수도 있습니다.

값이 존재하는지 확인하는 방법

이제 Optional 객체를 가지고 있으므로, 실제로 값이 들어있는지 확인해봅시다:

Optional<String> optionalName = Optional.of("Bob");

if (optionalName.isPresent()) {
System.out.println("Name is present: " + optionalName.get());
} else {
System.out.println("Name is not present");
}

여기서는 isPresent() 메서드를 사용하여 Optional이 값이 있는지 확인하고, get() 메서드를 사용하여 그 값을 꺼내고 있습니다. 하지만 주의하세요! 빈 Optional에서 get()을 사용하면 예외가 발생합니다. 이는 빈帽子에서 토끼를 뽑으려는 것과 같은 – 그럴리가 없습니다!

기본 값 사용하기

때로는 Optional이 비어 있을 때 기본 값을 사용하고 싶습니다. 자바는 이를 매우 쉽게 만듭니다:

String name = Optional.ofNullable(nullableName).orElse("Unknown");
System.out.println("Name: " + name);

이 예제에서는 nullableName이 null이면, name 변수가 "Unknown"으로 설정됩니다. 이는 백업 계획을 가지는 것과 같은 – 항상 좋은 생각입니다!

map()으로 값 변환

Optional 클래스는 map() 메서드를 사용하여 값을 변환할 수 있게 합니다. 이를 action으로 보아봅시다:

Optional<String> upperName = Optional.of("alice").map(String::toUpperCase);
System.out.println(upperName.orElse("No name found"));

이 코드는 "alice"라는 이름을 가져와서 대문자로 변환한 후, 새로운 Optional로 감싸줍니다. 원래 Optional이 비어 있었다면, 결과も 비어 있는 Optional이 됩니다.

Optional 연산 체인

Optional의 가장 멋진 점 중 하나는 우리가 연산을 체인으로 연결할 수 있습니다. 이는 LEGO 블록을 사용하여 만드는 것과 같은 – 각 조각이 연결하여 놀라운 것을 만들어냅니다:

Optional<String> name = Optional.of("Alice")
.filter(s -> s.length() > 5)
.map(String::toUpperCase);

System.out.println(name.orElse("Name not long enough"));

이 예제에서는 "Alice"를 시작으로, 5자리보다 길지 않으므로 결과는 비어 있는 Optional이 됩니다. 이름이 충분히 길었다면 대문자로 변환될 텐데요.

Optional로 예외 던지기

때로는 값이 없을 때 예외를 던고 싶습니다. Optional은 이것도 쉽게 만듭니다:

String result = Optional.ofNullable(nullableValue)
.orElseThrow(() -> new IllegalArgumentException("Value cannot be null"));

이 코드는 nullableValue가 null이면 커스텀 메시지와 함께 IllegalArgumentException을 던출합니다.

Optional 클래스 메서드

유용한 Optional 메서드를 손쉽게 정리한 표를 살펴보겠습니다:

메서드 설명
empty() 빈 Optional 인스턴스를 반환
of(T value) 지정된 non-null 값과 함께 Optional을 반환
ofNullable(T value) 주어진 값이 non-null이면 Optional을 반환, 그렇지 않으면 빈 Optional을 반환
isPresent() 값이 존재하면 true, 그렇지 않으면 false 반환
ifPresent(Consumer<? super T> action) 값이 존재하면 주어진 작업을 수행
get() 값이 존재하면 반환, 그렇지 않으면 NoSuchElementException 발생
orElse(T other) 값이 존재하면 반환, 그렇지 않으면 other 반환
orElseGet(Supplier<? extends T> supplier) 값이 존재하면 반환, 그렇지 않으면 supplier를 호출하여 결과 반환
orElseThrow(Supplier<? extends X> exceptionSupplier) 값이 존재하면 반환, 그렇지 않으면 예외 공급자가 생성한 예외를 던출
map(Function<? super T, ? extends U> mapper) 값이 존재하면 주어진 매핑 함수를 값에 적용한 결과를 Optional로 반환, 그렇지 않으면 빈 Optional 반환
flatMap(Function<? super T, ? extends Optional<? extends U>> mapper) map과 유사하지만, 매핑 함수는 Optional을 반환
filter(Predicate<? super T> predicate) 값이 존재하고 주어진 조건을 만족하면 Optional을 반환, 그렇지 않으면 빈 Optional 반환

결론

축하합니다! 여러분은 자바의 Optional 클래스에 대한 첫 걸음을 내딛었습니다. Optional은 단지 도구가 아니라, 생각하는 방식이라고 기억하세요. 그것은 여러분이 공허한 값의 가능성을 고려하고, 그것들을 우아하게 처리하도록 권장합니다.

자바 여정을 계속하면서, Optional은 여러 곳에서 등장할 거예요. 그것을 받아들이세요! 그것은 우리가 극혐스러운 null 상황을 다루는 데 항상 도움을 줄 신뢰할 수 있는 사이드킥과 같습니다.

계속 연습하고, 코드를 작성하며, 가장 중요한 것은 즐기세요! 자바는 넓고 흥미로운 세계이며, 여러분은 그 표면을 조금 만지작었습니다. 새로운 지식으로 무엇인가 놀라운 것을 만들 수 있을까요?

다음에 뵙겠습니다, 즐거운 코딩하세요!

Credits: Image by storyset