이 글은 프로그래머스 - 실무 자바 개발을 위한 OOP와 핵심 디자인 패턴 강의를 정리한 내용입니다.
Stream API는 자바에서 제공하는 강력한 문법으로, Optional
과 함께 사용하면 코드의 가독성을 매우 크게 높여줍니다.
실무에서 웹 애플리케이션을 개발하다보면 굉장히 자주 발생하는 패턴이있습니다.
바로 위와 같이 DB에서 특정 데이터를 검색하는 경우입니다.
예제를 간략화하기 위해 위와 같이 1 ~ 10의 정수를 포함하고 있는 List
에서 특정 값을 조회하고, 결과에 따라 작업을 처리하는 예시를 들어 코드를 작성해보겠습니다.
if & for문을 활용해서 작성한 코드
int[] integerArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<Integer> integerList = Arrays.
stream(integerArray)
.boxed()
.toList();
Integer findNumber = null;
for (int i = 0; i < integerList.size(); i++) {
if (integerList.get(i).equals(1234)) {
findNumber = integerList.get(i);
break;
}
}
if (findNumber == null)
throw new RuntimeException();
System.out.println("findNumber = " + findNumber);
위 코드는 if & for문을 사용해서 작성한 예시입니다. 이제 위 코드를 Stream API와 Optional을 활용해서 개선해보겠습니다.
Stream API & Optional을 활용해서 작성한 코드
int[] integerArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<Integer> integerList = Arrays.
stream(integerArray)
.boxed()
.toList();
Integer findNumber = integerList
.stream()
.filter(integer -> {
if (integer.equals(1234))
return true;
return false;
})
.findAny()
.orElseThrow();
System.out.println("findNumber = " + findNumber);
if & for문 대신 Stream API의 filter()
메서드를 활용해서 요소를 반복하다 조건에 맞는 요소를 찾으면, findAny()
메서드로 즉시 반환합니다. 만약 조건에 맞는 요소가 없다면 비어있는 Optional 객체를 반환합니다.
if & for문을 활용한 예제보다 Stream API와 Optional을 활용한 예제가 훨씬 가독성이 높은 걸 확인할 수 있습니다.
이번에는 좀 더 실전적인 케이스를 예시로 살펴보겠습니다.
웹 서비스에서 흔히 볼 수 있는 회원가입 화면입니다. 가입할 아이디를 입력할 때 이미 사용중인 아이디를 입력한다면 예외 메세지를 사용자에게 전달하는 아이디 중복 검사 기능을 구현한다고 예시를 들어보겠습니다.
User Class
public class User {
private String id;
private String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
public boolean sameId(String idToFind) {
return this.id.equals(idToFind);
}
}
사용자를 표현하는 User
클래스입니다. 필드로 id
와 name
을 가지고 있고, 입력받은 id 값에 대해 자신의 id와 일치하는지 여부를 조회하는 sameId
메서드를 포함합니다.
사용자 ID 중복 검사 코드
String idToFind = "edgar1";
List<User> list = new ArrayList<>();
list.add(new User("edgar1", "양성욱"));
list.add(new User("edgar2", "음성욱"));
list.add(new User("edgar3", "중성욱"));
list.stream()
.filter(user -> user.sameId(idToFind))
.findAny()
.ifPresentOrElse(user -> {
throw new RuntimeException(idToFind + "는 이미 존재하는 아이디입니다.");
}, () -> {
System.out.println(idToFind + "는 사용할 수 있는 아이디입니다.");
});
User
클래스를 활용해서 주어진 id에 대한 중복 검사를 실시하는 로직입니다. 만약 중복되는 id가 존재하면 예외를 발생시킵니다.
이처럼 Stream API와 Optional을 잘 활용하면 가독성 높은 코드를 작성할 수 있습니다.