-
-
Notifications
You must be signed in to change notification settings - Fork 22
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #20 from stoneHee99/patch-1
Create 2024-01-16-firstClassCollection.md
- Loading branch information
Showing
1 changed file
with
205 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,205 @@ | ||
--- | ||
layout: post | ||
title: μΌκΈ 컬λ μ μ΄λ? | ||
author: λ°μν¬ | ||
categories: κΈ°μ μΈλ―Έλ | ||
banner: | ||
image: https://raw.githubusercontent.com/Kernel360/blog-image/main/2024/0116/thumb_first_class.png | ||
background: "#000" | ||
height: "100vh" | ||
min_height: "38vh" | ||
heading_style: "font-size: 4.25em; font-weight: bold; text-decoration: underline" | ||
tags: [java, μΌκΈ 컬λ μ , κ°μ²΄μ§ν₯, κΈ°μ μΈλ―Έλ] | ||
--- | ||
μλ νμΈμ, μ§λλ² [μλ°μ κ°λΉμ§ 컬λ μ ](https://stonehee99.vercel.app/java-gc) λ°νμ μ΄μ΄μ λ λ€μ κΈ°μ μΈλ―Έλλ₯Ό 맑μ μμνκ² λμμ΅λλ€. | ||
|
||
νΉλ³ν μ§λλ² κ°λΉμ§ 컬λ μ λ°νμ μ΄μ΄μ λ λ€λ₯Έ 컬λ μ μ λν΄ λ°νλ₯Ό ν΄λ³΄λ©΄ μ΄λ¨κΉ? νλ μκ°μ (λλ΄μ λλ€) | ||
|
||
κ°μ²΄μ§ν₯μμ ν¬λ£¨λΆλ€μ΄ μ΄λ €μνλ κ°λ μ€ νλμΈ `μΌκΈ 컬λ μ ` μ λν΄ λ°νλ₯Ό μ§ννκΈ°λ‘ νμλ΅λλ€. | ||
|
||
## 1. μΌκΈ 컬λ μ (first-class-collection)μ΄λ? | ||
![Untitled](https://raw.githubusercontent.com/Kernel360/blog-image/main/2024/0116/Untitled.png) | ||
`μΌκΈ 컬λ μ ` μ λν κ°λ μ `λ§ν΄ νμΈλ¬` μ μ± `μνΈμμ€ μ€μλ¬μ§` μμ μ²μμΌλ‘ μ μλμμ΅λλ€. | ||
|
||
### κ·μΉ 8: μΌκΈ μ½λ μ μ¬μ© | ||
|
||
> μ΄ κ·μΉμ μ μ©μ κ°λ¨νλ€. μ½λ μ μ ν¬ν¨ν ν΄λμ€λ λ°λμ λ€λ₯Έ λ©€λ² λ³μκ° μμ΄μΌ νλ€. κ° μ½λ μ μ κ·Έ μμ²΄λ‘ ν¬μ₯μ΄ λμ΄μμΌλ―λ‘ μ΄μ μ½λ μ κ³Ό κ΄λ ¨λ λμμ κ·Όκ±°μ§κ° λ§λ ¨λ μ μ΄λ€. νν°κ° μ΄ μ ν΄λμ€μ μΌλΆκ° λ¨μ μ μ μλ€. νν°λ λν μ€μ€λ‘ ν¨μ μ€λΈμ νΈκ° λ μ μλ€. λν μ ν΄λμ€λ λ κ·Έλ£Ήμ κ°μ΄ λ¬Άλλ€λ κ° κ·Έλ£Ήμ κ° μμμ κ·μΉμ μ μ©νλ λ±μ λμμ μ²λ¦¬ν μ μλ€. μ΄λ μΈμ€ν΄μ€ λ³μμ λν κ·μΉμ νμ€ν νμ₯μ΄μ§λ§ κ·Έ μ체λ₯Ό μν΄μλ μ€μνλ€. μ½λ μ μ μ€λ‘ λ§€μ° μ μ©ν μμ νμ μ΄λ€. λ§μ λμμ΄ μμ§λ§ νμ νλ‘κ·Έλλ¨Έλ μ μ§λ³΄μ λ΄λΉμμκ² μλ―Έμ μλλ λ¨μ΄λ κ±°μ μλ€. | ||
μ λ΄μ©μ μ 리ν΄λ³΄μλ©΄, `μΌκΈ 컬λ μ ` μ΄λ. | ||
|
||
- 컬λ μ λ§μ λ©€λ² λ³μλ‘ κ°λ ν΄λμ€ | ||
- 컬λ μ κ³Ό κ΄λ ¨λ λ‘μ§μ ν΄λμ€ λ΄μ μΊ‘μν | ||
|
||
λ₯Ό λ»νλ€κ³ ν μ μκ² μ΅λλ€. | ||
|
||
μμλ₯Ό λ€μ΄λ³΄κ² μ΅λλ€. | ||
|
||
```java | ||
class Product { | ||
private String name; | ||
private String category; | ||
// μμ±μ, getter, setter.. | ||
} | ||
``` | ||
μ΄λ¬ν μν κ°μ²΄κ° μκ³ | ||
```java | ||
List<Product> products = new ArrayList<>(); | ||
products.add(new Product("potato", "vegetables")); | ||
products.add(new Product("robot", "toy")); | ||
``` | ||
μ΄λ¬ν μνμ 리μ€νΈ 컬λ μ μ΄ μλ€κ³ κ°μ μ ν΄λ΄ μλ€. | ||
|
||
μ΄λ₯Ό μλμ κ°μ΄ κ°μΈλ κ²μ `μΌκΈ 컬λ μ ` μΌλ‘ λ§λ€μλ€κ³ ν©λλ€. | ||
|
||
```java | ||
public class ProductCollection { | ||
private final List<Product> products; | ||
|
||
public ProductCollection(List<Product> products) { | ||
this.products = new ArrayList<>(products); | ||
} | ||
} | ||
``` | ||
μ΄λ κ² `μΌκΈ 컬λ μ `μ μμ보μλλ°, μ΄ `μΌκΈ 컬λ μ `μ μ¬μ©νλ©΄ μ΄λ ν μ΄μ μ΄ μλκ±ΈκΉμ? | ||
|
||
μ `μΌκΈ 컬λ μ `μ μ¬μ©ν΄μΌ νλ€κ³ ν κΉμ? | ||
|
||
## 2. μ μΌκΈ 컬λ μ μΈκ°? | ||
|
||
### 2-1. μΊ‘μνμ κ΄μ¬μ¬μ λΆλ¦¬ | ||
|
||
```java | ||
public class ProductCollection { | ||
private final List<Product> products; | ||
|
||
public ProductCollection(List<Product> products) { | ||
this.products = new ArrayList<>(products); | ||
} | ||
|
||
public ProductCollection filterByCategory(String category) { | ||
return new ProductCollection( | ||
products.stream() | ||
.filter(product -> product.getCategory().equals(category)) | ||
.collect(Collectors.toList()) | ||
); | ||
} | ||
} | ||
``` | ||
|
||
`μΌκΈ 컬λ μ `μ μ¬μ©νλ©΄ 컬λ μ μ λν λͺ¨λ μ‘°μκ³Ό λ‘μ§μ ν΄λΉ 컬λ μ ν΄λμ€ λ΄λΆμ ꡬνν μ μμ΅λλ€. | ||
|
||
μ΄λ‘μ¨ λ‘μ§μ΄ λΆμ°λλ κ²μ λ°©μ§νκ³ , κ΄λ ¨ λ‘μ§μ ν κ³³μμ κ΄λ¦¬ν μ μμ΅λλ€. | ||
|
||
λ ν΄λμ€κ° λ¨ νλμ μ± μλ§μ κ°μ§κ² λ©λλ€. μ΄ ν΄λμ€μμλ `products` 컬λ μ μ κ΄λ¦¬νλ μ± μλ§μ κ°μ§μΌλ‘μ¨ μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ΄ ν₯μλ©λλ€. | ||
|
||
### 2-2. μΌκΈ 컬λ μ μ λΆλ³μ± 보μ₯ | ||
|
||
|
||
```java | ||
public class TeamMembers { | ||
private final List<Member> members; | ||
|
||
public TeamMembers(List<Member> members) { | ||
this.members = new ArrayList<>(members); | ||
} | ||
|
||
public void addMember(Member member) { | ||
members.add(member); | ||
} | ||
|
||
public void removeMember(Member member) { | ||
members.remove(member); | ||
} | ||
|
||
public List<member> getMembers() { | ||
return Collections.unmodifiableList(Members); | ||
} | ||
} | ||
``` | ||
|
||
`μΌκΈ 컬λ μ `μ μ¬μ©νλ©΄ λΆλ³μ± 보μ₯μ λμ± μ©μ΄νκ² ν μ μμ΄ μΈλΆμμμ 컬λ μ μν λ³κ²½μ λ°©μ§ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λ°μ΄ν°μ μμ μ±κ³Ό μμΈ‘ κ°λ₯μ±μ΄ μ¦κ°ν©λλ€. λν λΆλ³μ±μ΄ 보μ₯λλ©΄ μ¬μ΄λ μ΄ννΈμ κ°λ₯μ±μ΄ μ€μ΄λ€λ©°, λ©ν° μ€λ λ νκ²½μμμ μμ μ±μ΄ ν₯μλ©λλ€. | ||
|
||
μ΄ μ½λμμ `TeamMembers` ν΄λμ€λ μ΄λ ν νμ λ©€λ²λ€μ 리μ€νΈλ₯Ό κ΄λ¦¬ν©λλ€. μ¬κΈ°μ λ©€λ²λ₯Ό μΆκ°νκ±°λ μ κ±°νλ λ©μλκ° ν΄λμ€ λ΄λΆμ ꡬνλμ΄ μκ³ , μΌλ°μ μΈ `List.add()` μ κ°μ λ©μλλ₯Ό ν΅ν΄ μνλ³κ²½μ΄ λΆκ°λ₯ν©λλ€. | ||
|
||
μ¦ μ΄ ν΄λμ€μ λ©μλλ₯Ό ν΅ν΄μλ§ μνλ³κ²½μ΄ μ΄λ£¨μ΄μ§ μ μμ΅λλ€. | ||
|
||
`getMemebers()` λ©μλλ λΆλ³ 리μ€νΈλ₯Ό λ°ννμ¬ μΈλΆμμ 컬λ μ μ λ³κ²½νλ κ²μ λ°©μ§ν©λλ€. | ||
|
||
μ΄μ²λΌ `μΌκΈ 컬λ μ `μ μ¬μ©νλ©΄ 컬λ μ μ λΆλ³μ±μ λ΄λΆ λ‘μ§μ ν΅ν΄ λμ± κ°λ ₯νκ² κ΄λ¦¬ν μ μμ΅λλ€. | ||
|
||
### 2-3. λΉμ¦λμ€ κ·μΉκ³Ό κ²μ¦ λ‘μ§μ μ€μν | ||
|
||
```java | ||
public class StudentCollection { | ||
private final List<Student> students; | ||
|
||
public StudentCollection(List<Student> students) { | ||
this.students = new ArrayList<>(); | ||
for (Student student : students) { | ||
addStudent(student); | ||
} | ||
} | ||
|
||
public void addStudent(Student student) { | ||
validateStudent(student); | ||
students.add(student); | ||
} | ||
|
||
private void validateStudent(Student student) { | ||
if (student.getAge() < 18) { | ||
throw new IllegalArguemntException("νμ μ€ 18μΈ μ΄μλ§ νμ λ€μ΄μ¬ μ μμ΅λλ€"); | ||
} | ||
} | ||
} | ||
``` | ||
|
||
`μΌκΈ 컬λ μ `μ ν΅ν΄μ 컬λ μ μ μ μ©λμ΄μΌ ν λΉμ¦λμ€ κ·μΉμ ν΄λμ€ λ΄λΆμ μ μν¨μΌλ‘μ¨ μΌκ΄λ κ·μΉ μ μ©μ΄ κ°λ₯ν©λλ€. | ||
|
||
컬λ μ μ μΆκ°λκ±°λ λ³κ²½λλ μμλ€μ λν κ²μ¦ λ‘μ§μ `μΌκΈ 컬λ μ ` λ΄λΆμ ꡬνν¨μΌλ‘μ¨, λ°μ΄ν°μ μ ν©μ±μ λ³΄λ€ μ²΄κ³μ μΌλ‘ κ΄λ¦¬ν μ μμ΅λλ€. | ||
|
||
`addStudent` λ©μλμμ `validateStudent` λ₯Ό νΈμΆνμ¬ νμμ λμ΄κ° 18μΈ μ΄μμΈμ§ κ²μ¦ν©λλ€. μ΄λ κ² νλ©΄ λͺ¨λ νμ κ°μ²΄κ° μΌκ΄λ κ·μΉμ λ°λ₯Ό μ μκ² μ£ ?! | ||
|
||
## 3. μΌκΈ 컬λ μ μ μ¬μ©ν λμ μ£Όμμ¬ν | ||
|
||
### μ€λ²μμ§λμ΄λ§μ μν | ||
|
||
`μΌκΈ 컬λ μ ` μ μ¬μ©ν λ μ£Όμν΄μΌ ν μ€μν μ μ€ νλλ μ€λ²μμ§λμ΄λ§μ μν μ λλ€. λͺ¨λ 컬λ μ μ μΌκΈ 컬λ μ μΌλ‘ λ§λλκ²μ΄ νμ μ’μ κ²μ μλλλ€. | ||
|
||
μμλ₯Ό λ€μ΄λ³΄κ² μ΅λλ€. | ||
|
||
```java | ||
public class SimpleDataCollection { | ||
private final List<Data> dataList; | ||
|
||
public SimpleDataCollection(List<Data> dataList) { | ||
this.dataList = dataList; | ||
} | ||
} | ||
``` | ||
|
||
μ΄ μμμμ `SimpleDataCollection` μ 볡μ‘ν λ‘μ§ μμ΄ λ°μ΄ν°λ§μ μ μ₯ν©λλ€. μ΄λ° κ²½μ° `μΌκΈ 컬λ μ `μ μ¬μ©νλ κ²μ μ€λ²μμ§λμ΄λ§μ΄ λ μ μμ΅λλ€. | ||
|
||
μ΄μ²λΌ `μΌκΈ 컬λ μ ` μ 컬λ μ μ 볡μ‘ν λΉμ¦λμ€ λ‘μ§μ΄λ κ·μΉμ΄ μ μ©λ λ κ°μ₯ μ μ©ν©λλ€. λ¨μν λ°μ΄ν°λ₯Ό μ μ₯νλ μ©λλΌλ©΄ κ΅³μ΄ `μΌκΈ 컬λ μ ` μ μ¬μ©ν νμλ μκ² μ£ . | ||
|
||
λ°λΌμ `μΌκΈ 컬λ μ ` μ λμ νκΈ° μ μ ν΄λΉ 컬λ μ μ μ΄λ€ λ‘μ§μ΄λ κ·μΉμ΄ νμνμ§ κ³ λ €ν΄μΌ ν©λλ€. 컬λ μ μ 볡μ‘μ±κ³Ό μ μ§λ³΄μμ νΈμμ±μ κ· νμκ² κ³ λ €νλ κ²μ΄ μ€μν©λλ€. | ||
|
||
## 4. κ²°λ‘ | ||
|
||
![Untitled](https://raw.githubusercontent.com/Kernel360/blog-image/main/2024/0116/frog.gif) | ||
|
||
`μΌκΈ 컬λ μ ` μ μ€λμ ν¨κ» μμ보μλλ°μ, μ°λ¦¬λ μΌκΈ 컬λ μ μ΄ λ¨μν λ°μ΄ν°μ λͺ¨μ μ΄μμ κ°μΉλ₯Ό μ§λλ€λ κ²μ λ°°μ μ΅λλ€. | ||
|
||
μ΄λ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ κ·Όλ³Έμ μΈ μμΉμΈ μΊ‘μνμ μμ§λλ₯Ό κ°ννλλ° ν° λμμ μ€λλ€. | ||
|
||
λΉμ¦λμ€ λ‘μ§μ ν κ³³μ μ§μ€ν¨μΌλ‘μ¨, μ°λ¦¬μ μ½λλ λμ± λͺ ννκ³ , μ μ§λ³΄μνκΈ° μ¬μ°λ©°, μ€λ₯ λ°μκ°λ₯μ±μ μ€μΌ μ μμ΅λλ€. | ||
|
||
νμ§λ§ λͺ¨λ μν©μμ `μΌκΈ 컬λ μ ` μ΄ ν΄λ΅μ μλλλ€. μ°λ¦¬λ μ€λ²μμ§λμ΄λ§μ μνμ±μ νμ μΌλνκ³ μΌκΈ 컬λ μ μ΄ κΌ νμν μν©μΈμ§λ₯Ό νμ κ³ λ €ν΄μΌ ν©λλ€. | ||
|
||
μ€λ 곡μ ν λ΄μ©μ΄ μ€μ νλ‘μ νΈμμ μ¬λ¬λΆμ΄ λ§μ£ΌμΉ λ¬Έμ λ₯Ό ν΄κ²°νλλ° λμμ΄ λκΈΈ λ°λλλ€. | ||
|
||
## 5. μ°Έκ³ λ¬Έν | ||
|
||
[https://jojoldu.tistory.com/412](https://jojoldu.tistory.com/412) | ||
|
||
[https://edu.nextstep.camp/c/9WPRB0ys](https://edu.nextstep.camp/c/9WPRB0ys) | ||
|