1급 컬렉션(First-Class Collection)은 객체지향 프로그래밍에서 컬렉션을 감싸는 단 하나의 클래스로만 이루어진 설계 기법이다.
컬렉션(Collection)
자바 컬렉션 프레임워크는 자바 데이터 구조를 처리하기 위한 표준 방법이다.
주요 인터페이스로는 List, Set, Map....
public class Students {
private final List<Student> students;
public Students(List<Student> students) {
this.students = Collections.unmodifiableList(new ArrayList<>(students));
}
// 여기에 학생들에 대한 비즈니스 로직 추가
public double averageGrade() {
return students.stream()
.mapToDouble(Student::getGrade)
.average()
.orElse(0.0);
}
}
방어적 복사(Defensive Copying): 이것은 객체 내부의 필드가 외부 참조에 의해 간접적으로 변경되는 것을 방지합니다. 즉, 객체를 생성할 때 제공된 외부 리스트의 복사본을 만들어, 원본 리스트가 나중에 변경되어도 객체 내부의 상태에는 영향을 주지 않습니다. 그러나 이 방법만으로는 객체 내부의 리스트 자체가 직접 변경되는 것은 막을 수 없습니다.
불변 리스트(unmodifiableList): 이 메서드는 리스트를 불변으로 감싸, 리스트에 대한 모든 변경 시도가 예외를 발생시키도록 합니다. 이렇게 함으로써 객체의 메서드를 통해 내부 리스트에 접근하는 사용자가 리스트를 변경할 수 없게 됩니다. 그러나 이 방법만 사용할 경우, 객체 생성 시 제공된 외부 리스트가 변경되면 객체 내부의 리스트도 영향을 받을 수 있습니다.
public class School {
private final List<Student> students;
public School(List<Student> students) {
// 여기서는 불변 리스트로 만들지 않음으로써 외부에서 변경 가능
this.students = new ArrayList<>(students);
}
// 학생 추가
public void addStudent(Student student) {
students.add(student);
}
// 학생 제거
public void removeStudent(Student student) {
students.remove(student);
}
// 평균 성적 계산
public double averageGrade() {
return students.stream()
.mapToDouble(Student::getGrade)
.average()
.orElse(0.0);
}
}