Skip to content

Commit

Permalink
Merge pull request #20 from stoneHee99/patch-1
Browse files Browse the repository at this point in the history
Create 2024-01-16-firstClassCollection.md
  • Loading branch information
anso33 authored Jan 16, 2024
2 parents 0118955 + 6d5e2da commit 36ff7f2
Showing 1 changed file with 205 additions and 0 deletions.
205 changes: 205 additions & 0 deletions _posts/2024-01-16-firstClassCollection.md
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)

0 comments on commit 36ff7f2

Please sign in to comment.