
✅ List를 map으로 변환하는 이유
db나 API에서 데이터 받아와서 검색할 때 속도나 효율성 측면에서 map이 빠름
즉, 대규모 데이터 처리나, 빠른 검색을 위해서 필요함.
이것이 가능한 이유는 map은 해시 기반으로 작동하며 키,값 쌍 형식을 가지기 때문.
JSON이랑 비슷한 형식이지만 자바의 map은 키값 타입을 제네릭으로 지정해 주어야 하고
Map<String, Integer>처럼 명확한 타입을 지정해 주어야 함.
[JSON]
{
"name": "Alice",
"age": 30,
"isEmployee": true
}
[JAVA map]
Map<String, Object> person = new HashMap<>();
person.put("name", "Alice");
person.put("age", 30);
person.put("isEmployee", true);

예를 들어, 직원 리스트가 List<Employee> 형태로 있다고 할 때, Employee 객체에 employeeId가 있다면, employeeID를 키값으로 Map<Integer, Employee>로 변환할 수 있음.
이렇게 하면 직원 ID를 통해 해당 직원 객체에 빠르게 접근할 수 있어 조회 효율이 향상됨.
만약 List에서 특정 직원 ID로 직원 데이터를 찾으려면 모든 요소를 순차적으로 탐색해야 하는 반면,
Map에서는 해시 기반 접근이 가능하므로 O(1) 시간 복잡도로 원하는 데이터에 접근할 수 있음.
✅ 요약
1. 검색 효율이 좋다
학생 리스트 List<Student>와 과목 리스트 List<Subject>를 학생 객체와 과목 객체가 각각 학생 ID 또는 과목 ID로 참조 가능해야 한다면, Map<Integer, Student> 또는 Map<Integer, Subject>형태로 변환하여 관리하는 것이 좋음. 이렇게 하면 ID 기반으로 학생과 과목을 쉽게 조회 가능.
2. 중복키 값 관리
db에 동일한 employeeId를 가진 직원 객체가 여러개 일때 toMap을 쓰면 Collectors.toMap이 어떤 값을 유지할 지 정의 가능.
3. Stream API
자바8부터 추가된 기능으로 Stream API를 쓰면 for문을 돌리지 않고도 List에서 Map으로 쉽게 변환할 수 있어서 코드가 더 간결하고 가독성이 높아짐.
✅ for문 써서 list를 map 형식으로 변환
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Example {
public static void main(String[] args) {
List<Employee> employees = List.of(
new Employee(1, "Alice", "Engineering"),
new Employee(2, "Bob", "Marketing"),
new Employee(3, "Charlie", "Sales")
);
// List<Employee> -> Map<Integer, Employee> 변환 (Stream 없이)
Map<Integer, Employee> employeeMap = new HashMap<>();
for (Employee employee : employees) {
employeeMap.put(employee.getEmployeeId(), employee);
}
// 특정 ID로 직원 객체에 접근
Employee employee = employeeMap.get(1); // employeeId가 1인 직원
System.out.println(employee);
}
}
class Employee {
private int employeeId;
private String name;
private String department;
public Employee(int employeeId, String name, String department) {
this.employeeId = employeeId;
this.name = name;
this.department = department;
}
public int getEmployeeId() {
return employeeId;
}
@Override
public String toString() {
return "Employee{id=" + employeeId + ", name='" + name + "',
department='" + department + "'}";
}
}
✅ 자바8 Stream API, list -> map 변환
- Stream 생성: employees.stream()을 통해 리스트에서 스트림 생성
- collect() 메서드: Collectors.toMap()을 사용하여 스트림의 요소를 맵으로 수집
- 키와 값 설정
- 키 설정: Employee::getEmployeeId 메서드 참조, 각 Employee 객체의 employeeId 필드를 맵의 키로 설정
- 값 설정: 람다 표현식 employee -> employee 으로 Employee 객체 자체를 값으로 설정
- ID로 데이터 조회: 생성된 Map<Integer, Employee> 객체를 사용해 특정 employeeId로 직원 객체를 조회
- employeeMap.get(1)을 호출하면, employeeId가 1인 직원 데이터를 빠르게 가져옴
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Example {
public static void main(String[] args) {
List<Employee> employees = List.of(
new Employee(1, "Alice", "Engineering"),
new Employee(2, "Bob", "Marketing"),
new Employee(3, "Charlie", "Sales")
);
// List<Employee> -> Map<Integer, Employee> 변환
Map<Integer, Employee> employeeMap = employees.stream()
.collect(Collectors.toMap(Employee::getEmployeeId,
employee -> employee));
// 특정 ID로 직원 객체에 접근
Employee employee = employeeMap.get(1); // employeeId가 1인 직원
System.out.println(employee);
}
}
class Employee {
private int employeeId;
private String name;
private String department;
public Employee(int employeeId, String name, String department) {
this.employeeId = employeeId;
this.name = name;
this.department = department;
}
public int getEmployeeId() {
return employeeId;
}
@Override
public String toString() {
return "Employee{id=" + employeeId + ", name='" +
name + "', department='" + department + "'}";
}
}
'Java' 카테고리의 다른 글
StringBuffer 사용법, 예시, String 과 차이, StringBuilder (5) | 2024.11.03 |
---|---|
[Java] BufferedReader / BufferedWriter (입출력 함수), StringTokenizer, split, BufferedWriter, StringBuilder (4) | 2024.10.27 |
찾아보다가 답답해서 내가 작성한 아주 쉽게 이해하는 서블릿의 개념과 작동원리! (+그림 포함) (0) | 2024.04.24 |
(자바) 접근제한자, 필드와 메서드 (0) | 2024.04.21 |
(자바) 메서드 오버라이딩 (0) | 2024.04.21 |

✅ List를 map으로 변환하는 이유
db나 API에서 데이터 받아와서 검색할 때 속도나 효율성 측면에서 map이 빠름
즉, 대규모 데이터 처리나, 빠른 검색을 위해서 필요함.
이것이 가능한 이유는 map은 해시 기반으로 작동하며 키,값 쌍 형식을 가지기 때문.
JSON이랑 비슷한 형식이지만 자바의 map은 키값 타입을 제네릭으로 지정해 주어야 하고
Map<String, Integer>처럼 명확한 타입을 지정해 주어야 함.
[JSON]
{ "name": "Alice", "age": 30, "isEmployee": true }
[JAVA map]
Map<String, Object> person = new HashMap<>(); person.put("name", "Alice"); person.put("age", 30); person.put("isEmployee", true);

예를 들어, 직원 리스트가 List<Employee> 형태로 있다고 할 때, Employee 객체에 employeeId가 있다면, employeeID를 키값으로 Map<Integer, Employee>로 변환할 수 있음.
이렇게 하면 직원 ID를 통해 해당 직원 객체에 빠르게 접근할 수 있어 조회 효율이 향상됨.
만약 List에서 특정 직원 ID로 직원 데이터를 찾으려면 모든 요소를 순차적으로 탐색해야 하는 반면,
Map에서는 해시 기반 접근이 가능하므로 O(1) 시간 복잡도로 원하는 데이터에 접근할 수 있음.
✅ 요약
1. 검색 효율이 좋다
학생 리스트 List<Student>와 과목 리스트 List<Subject>를 학생 객체와 과목 객체가 각각 학생 ID 또는 과목 ID로 참조 가능해야 한다면, Map<Integer, Student> 또는 Map<Integer, Subject>형태로 변환하여 관리하는 것이 좋음. 이렇게 하면 ID 기반으로 학생과 과목을 쉽게 조회 가능.
2. 중복키 값 관리
db에 동일한 employeeId를 가진 직원 객체가 여러개 일때 toMap을 쓰면 Collectors.toMap이 어떤 값을 유지할 지 정의 가능.
3. Stream API
자바8부터 추가된 기능으로 Stream API를 쓰면 for문을 돌리지 않고도 List에서 Map으로 쉽게 변환할 수 있어서 코드가 더 간결하고 가독성이 높아짐.
✅ for문 써서 list를 map 형식으로 변환
import java.util.HashMap; import java.util.List; import java.util.Map; public class Example { public static void main(String[] args) { List<Employee> employees = List.of( new Employee(1, "Alice", "Engineering"), new Employee(2, "Bob", "Marketing"), new Employee(3, "Charlie", "Sales") ); // List<Employee> -> Map<Integer, Employee> 변환 (Stream 없이) Map<Integer, Employee> employeeMap = new HashMap<>(); for (Employee employee : employees) { employeeMap.put(employee.getEmployeeId(), employee); } // 특정 ID로 직원 객체에 접근 Employee employee = employeeMap.get(1); // employeeId가 1인 직원 System.out.println(employee); } } class Employee { private int employeeId; private String name; private String department; public Employee(int employeeId, String name, String department) { this.employeeId = employeeId; this.name = name; this.department = department; } public int getEmployeeId() { return employeeId; } @Override public String toString() { return "Employee{id=" + employeeId + ", name='" + name + "', department='" + department + "'}"; } }
✅ 자바8 Stream API, list -> map 변환
- Stream 생성: employees.stream()을 통해 리스트에서 스트림 생성
- collect() 메서드: Collectors.toMap()을 사용하여 스트림의 요소를 맵으로 수집
- 키와 값 설정
- 키 설정: Employee::getEmployeeId 메서드 참조, 각 Employee 객체의 employeeId 필드를 맵의 키로 설정
- 값 설정: 람다 표현식 employee -> employee 으로 Employee 객체 자체를 값으로 설정
- ID로 데이터 조회: 생성된 Map<Integer, Employee> 객체를 사용해 특정 employeeId로 직원 객체를 조회
- employeeMap.get(1)을 호출하면, employeeId가 1인 직원 데이터를 빠르게 가져옴
import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Example { public static void main(String[] args) { List<Employee> employees = List.of( new Employee(1, "Alice", "Engineering"), new Employee(2, "Bob", "Marketing"), new Employee(3, "Charlie", "Sales") ); // List<Employee> -> Map<Integer, Employee> 변환 Map<Integer, Employee> employeeMap = employees.stream() .collect(Collectors.toMap(Employee::getEmployeeId, employee -> employee)); // 특정 ID로 직원 객체에 접근 Employee employee = employeeMap.get(1); // employeeId가 1인 직원 System.out.println(employee); } } class Employee { private int employeeId; private String name; private String department; public Employee(int employeeId, String name, String department) { this.employeeId = employeeId; this.name = name; this.department = department; } public int getEmployeeId() { return employeeId; } @Override public String toString() { return "Employee{id=" + employeeId + ", name='" + name + "', department='" + department + "'}"; } }
'Java' 카테고리의 다른 글
StringBuffer 사용법, 예시, String 과 차이, StringBuilder (5) | 2024.11.03 |
---|---|
[Java] BufferedReader / BufferedWriter (입출력 함수), StringTokenizer, split, BufferedWriter, StringBuilder (4) | 2024.10.27 |
찾아보다가 답답해서 내가 작성한 아주 쉽게 이해하는 서블릿의 개념과 작동원리! (+그림 포함) (0) | 2024.04.24 |
(자바) 접근제한자, 필드와 메서드 (0) | 2024.04.21 |
(자바) 메서드 오버라이딩 (0) | 2024.04.21 |