여러 데이터의 묶음. 추상체.
ArrayList
LinkedList
List<Integer> list = new linkedLsist<>();
여러 데이터의 묶음을 풀어서 하나씩 처리할 수 잇는 수단 제공
Iterator<String> iter = list.iterator();
iter.next();
System.out.println(iter.next());
// 하나만 출력됨
next
통해 다음 데이터 조회 가능, 역으로는 불가.
if(iter.hasNext()) iter.next(); //다음이 있다면 다음으로 넘어간다.
while(iter.hasNext()) {
System.out.println(iter.next());
}
//데이터 순회 방법에서 주로 사용된다.
사용
데이터의 연속. iterator와 비슷. System.in
과System.out
이 이에 해당한다.
filter
, map
, forEach
같은 고차함수(함수를 인자로 받는 함수)가 제공된다.
//주사위를 100번 던져서 6이 나올 확률
Random r = new Random();
var count = Stream.generate(() -> r.nextInt(6) + 1)
.limit(100)
.filter(n -> n == 6)
.count();
System.out.println(count);
() -> r.nextInt(6) + 1
로 매개변수 없이 리턴값만 정해준다. 리턴값은 1 ~ 6 값이 나오도록 조정한다. 100번 제한을 두고, n == 6
일 때만 걸러서 count
하는 코드를 작성한다.
Stream.generate
와 Stream.iterate
로 Stream
생성 가능.
연속된 데이터에 대해서 풍부한 고차함수들을 사용하여 강력한 기능을 간결하게 표현할 수 있다.
NPE : Null Poionter Exception - 가장 많이 발생하는 에러 중 하나
자바에서는 거의 모든 것이 레퍼런스 → 거의 모든 것이 null
이 될 수 있다. 따라 이를 확인할 필요가 있다.
요즘은 null
을 쓰지 않는 방법을 사용하는 추세.
EMPTY
)를 생성public class User {
public static final User EMPTY = new User(0, "");
private int age;
private String name;
public User(int age, String name) {
this.age = age;
this.name = name;
}
}
User
객체를 생성하고 싶을 때, null
대신 빈 값을 가진 객체를 생성하여 활용한다.
User user = User.EMPTY;
User user2 = getUser();
// if (user2 == null) {}
if (user2 == User.EMPTY) {}
후에 이런 식으로 null
대신 EMPTY
객체를 활용하여 NPE를 막을 수 있다.
Optional 사용
코드가 없다면 EMPTY
가 있는지 알 수 없다. 따라 값이 없을 때 null
리턴 대신 null
이 담긴 Optional
을 리턴하여 해결한다.
Optional<User> optionalUser = Optional.empty();
//null 데이터
optionalUser = Optional.of(new User(1, "2"));
//데이터 넣어줌
optionalUser.isEmpty(); //없으면 true
optionalUser.isPresent(); //있으면 true
데이터가 없을 때, 있을 때 전부 처리 가능하다는 장점이 있다.