일급콜렉션(First Class Collection)

  • 객체 지향 프로그래밍에서 컬렉션을 감싸는 개념으로, 컬렉션을 다루는 로직을 해당 클래스 내에 캡슐화하여 관리하는 설계 방식
  • Collection을 Wrapping하면서 다른 멤버 변수가 없는 상태
  • 예시
//일반적인 Collection
Map<String, String> map = new HashMap<>();
map.put("1", "A");
map.put("2", "B");
map.put("3", "C");
//Wrapping을 통해 일급콜랙션으로 만듦
public class GameRanking {

    private Map<String, String> ranks;

    public GameRanking(Map<String, String> ranks) {
        this.ranks = ranks;
    }
}

특징

  1. 단일 멤버 변수만 가진 클래스: 일급 콜렉션은 컬렉션을 위한 클래스를 정의하되, 해당 클래스는 컬렉션 관련 멤버 변수(예: List, Set, Map 등)만을 가집니다.
  2. 로직의 캡슐화: 해당 컬렉션과 관련된 비즈니스 로직이나 연산은 일급 콜렉션 내부에 정의됩니다. 이를 통해 데이터와 로직이 한 곳에 모여 있게 되어 객체 지향적인 설계를 보다 잘 따르게 됩니다.
  3. 불변성: 가능하다면 일급 콜렉션은 불변(immutable)하게 설계하는 것이 좋습니다. 즉, 컬렉션 내부의 원소를 추가하거나 제거하는 대신, 새로운 일급 콜렉션 인스턴스를 반환하는 방식으로 설계합니다.
  4. 재사용성과 응집도 증가: 컬렉션과 관련된 로직이 일급 콜렉션 내부에 모여 있기 때문에, 해당 로직을 재사용하기가 쉬워지며, 코드의 응집도도 높아집니다.

이점

  1. 비지니스에 종속적인 자료구조
  2. Collection의 불변성을 보장
  3. 상태와 행위를 한 곳에서 관리
  4. 이름이 있는 컬렉션

참고: 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유

사용 예시

일급 콜렉션(First Class Collection)의 사용 예시를 설명하기 위해, 예를 들어 “학생들의 목록을 관리하는” 시나리오를 가정해 보겠습니다. 여기서는 Java를 사용하는 예시를 들겠습니다.

기본적인 학생 클래스(Student)와 일급 콜렉션을 사용하여 학생들의 목록을 관리하는 클래스(Students)를 정의하겠습니다.

  1. 학생 클래스 (Student) 정의:

    javaCopy codepublic class Student {
        private String name;
        private int age;
       
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
       
        // getters and setters...
    }
    
  2. 일급 콜렉션 클래스 (Students) 정의:

    일급 콜렉션 Students는 내부적으로 List<Student>를 가지며, 학생 목록에 대한 조작과 관련된 로직을 캡슐화합니다.

    javaCopy codeimport java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Collectors;
       
    public class Students {
        private final List<Student> students;
       
        public Students() {
            this.students = new ArrayList<>();
        }
       
        public void addStudent(Student student) {
            // 여기에 학생 추가에 대한 비즈니스 로직을 구현할 수 있습니다.
            this.students.add(student);
        }
       
        public List<Student> getStudentsByAge(int age) {
            // 특정 나이의 학생들을 반환하는 로직
            return students.stream()
                .filter(student -> student.getAge() == age)
                .collect(Collectors.toList());
        }
       
        // 추가적인 메서드...
    }
    
  3. 일급 콜렉션 사용:

    이제 Students 클래스를 사용하여 학생들의 목록을 관리할 수 있습니다.

    javaCopy codepublic class Main {
        public static void main(String[] args) {
            Students students = new Students();
            students.addStudent(new Student("Alice", 20));
            students.addStudent(new Student("Bob", 21));
       
            // 20세 학생들만 조회
            List<Student> studentsAge20 = students.getStudentsByAge(20);
            studentsAge20.forEach(student -> System.out.println(student.getName()));
        }
    }
    

이 예시에서 Students 클래스는 List<Student>를 캡슐화하고, 학생 목록에 대한 조작과 비즈니스 로직을 내부에 포함하고 있습니다. 이로 인해 학생 목록에 대한 모든 조작은 Students 클래스를 통해서만 이루어지며, 이는 코드의 안정성과 유지보수성을 향상시킵니다.

정리

  • 일급 콜렉션(First Class Collection)은 객체 지향 프로그래밍에서 컬렉션을 다루는 로직을 해당 클래스 내에 캡슐화하여 관리하는 설계 방식입니다. 이를 위해 컬렉션 관련 멤버 변수(예: List, Set, Map 등)만을 가지는 클래스를 정의하고, 해당 클래스 안에 컬렉션을 다루기 위한 로직을 구현합니다. 일급콜렉션을 활용하면 비지니스에 종속적이며 불변성이 보장되는 Collection을 만들 수 있습니다.

참고

보완/복습

  • 2023.10.10 보완
  • 2023.11.20 보완