Java/자바 정리

180. groupingBy()를 사용한 스트림 분류 – 성별로 그룹화하기

코딩하는냥이 2025. 5. 26. 15:10
반응형

스트림에서 Collectors.groupingBy()를 사용하면
공통된 속성을 기준으로 데이터를 그룹화하여 Map으로 수집할 수 있습니다.
이번 예제에서는 학생 리스트를 성별(남/여) 로 분류하여
각 그룹의 학생 이름을 출력해보겠습니다.


📦 Student.java

package ch17.sec12;

public class Student {
	private String name, sex;
	private int score;

	public Student(String name, String sex, int score) {
		this.name = name;
		this.sex = sex;
		this.score = score;
	}

	public String getName() {
		return name;
	}

	public String getSex() {
		return sex;
	}

	public int getScore() {
		return score;
	}
}

📌 예제 코드

package ch17.sec12;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class CollectExample {
	public static void main(String[] args) {
		List<Student> list = new ArrayList<Student>();
		list.add(new Student("홍길동", "남", 92));
		list.add(new Student("김수영", "여", 87));
		list.add(new Student("감자바", "남", 95));
		list.add(new Student("파이썬", "여", 93));

		// 성별로 그룹화
		Map<String, List<Student>> map = list.stream()
			.collect(Collectors.groupingBy(Student::getSex));

		// 남학생 그룹 출력
		List<Student> maleList = map.get("남");
		maleList.stream()
			.forEach(s -> System.out.println(s.getName()));

		System.out.println();

		// 여학생 그룹 출력
		List<Student> femaleList = map.get("여");
		femaleList.stream()
			.forEach(s -> System.out.println(s.getName()));
	}
}

💻 실행 결과

홍길동
감자바

김수영
파이썬

💬 코드 설명

  • Collectors.groupingBy(Student::getSex)
    → getSex() 값(남/여)을 기준으로 학생들을 Map<String, List<Student>> 구조로 분류합니다.
  • map.get("남"), map.get("여")
    → 각각 남학생과 여학생 그룹을 꺼냅니다.
  • 각 그룹은 List<Student> 형태이며, 이후 다시 stream()을 사용해 이름을 출력합니다.

💡 포인트 정리

  • groupingBy()는 스트림을 기준 값으로 Map 형식의 그룹으로 수집할 때 사용됩니다.
  • 리턴 결과는 기본적으로 Map<기준값, List<요소>>입니다.
  • 분류 기준으로는 성별, 부서, 연령대 등 다양한 필드를 사용할 수 있습니다.
  • 그룹별 처리가 필요할 때는 groupingBy()를 사용하면 코드가 깔끔해집니다.

📌정리하자면, 이번 예제에서는 Collectors.groupingBy()를 사용하여 학생 데이터를 성별로 그룹화하고,
각 그룹의 학생 이름을 출력해보았습니다.
이 방식은 데이터를 카테고리별로 나누고자 할 때 매우 유용하며,
데이터 분석, 리포트, 통계 처리 등 다양한 상황에서 활용할 수 있습니다.