Skip to content

Commit

Permalink
Merge pull request #47 from m020202/main
Browse files Browse the repository at this point in the history
[3주차/제이] 워크북 제출합니다.
  • Loading branch information
m020202 authored Oct 11, 2024
2 parents a9cda45 + a355bf9 commit 29682d9
Show file tree
Hide file tree
Showing 2 changed files with 305 additions and 0 deletions.
157 changes: 157 additions & 0 deletions mission/chapter03/java_mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
## ✅ 제네릭 (Generics)

---

> 제네릭은 클래스, 인터페이스 또는 메서드에 **타입 매개변수 <T>**를 도입하는 기능이다.
>
- 즉, 타입이 클래스 내부에서 지정되는 것이 아닌 **외부에서 사용자에 의해 지정된다.**
- 이를 통해, **데이터 타입을 일반화**하여 **코드의 재사용성을 높이고**, **컴파일 타임에 타입 체크를 통해 타입 안전성을 제공**한다.

### ✔️ 예시 코드

---

> 만약, 리스트를 사용할 때 `Integer` 하나만 받을 수 있는 리스트와 `String`만 받을 수 있는 리스트를 따로 만들지 않고, 다음과 같이 제네릭을 사용하여 하나의 리스트로 다양한 타입을 처리할 수 있다.
>
```java
import java.util.ArrayList;
import java.util.List;

public class GenericExample<T> {
private List<T> list = new ArrayList<>();

public void add(T element) {
list.add(element);
}

public T get(int index) {
return list.get(index);
}
}
```

- list 변수는 속성 타입이 아직 가지지 않고, **실제 컴파일 시점에 add() 되는 값에 따라서 정해진다.**

## ✅ 래퍼 클래스

---

> 자바의 **기본형(primitive type)을 객체로 다루기 위해** 제공되는 클래스.
>
- 자바의 기본형은 값만 저장하지만, 객체로 다루어야 하는 경우(컬렉션, 제네릭 등)에 래퍼 클래스를 활용하여 해당 기본형을 객체로 감쌀 수 있다.

### ✔️ 자바에서 제공하는 주요 기본형과 래퍼 클래스

---

| 기본형 (Primitive Type) | 래퍼 클래스 (Wrapper Class) |
| --- | --- |
| `byte` | `Byte` |
| `short` | `Short` |
| `int` | `Integer` |
| `long` | `Long` |
| `float` | `Float` |
| `double` | `Double` |
| `char` | `Character` |
| `boolean` | `Boolean` |

### ✔️ 래퍼 클래스를 사용하는 주요 이유

---

1. **컬렉션 (Collection) 사용**
- 자바의 컬렉션 (List, Set, Map 등)은 객체만 다룰 수 있기 떄문에, 기본형을 객체로 변환해야 한다.

```java
List<Integer> list = new ArrayList<>();
list.add(1);
```

→ 위에처럼 래퍼 클래스 대신 기본형 값만 넣어도, **자동으로 변환해준다(오토 박싱)**

2. **유틸리티 메서드 제공**
- 래퍼 클래스는 기본형을 다룰 때 추가적인 기능을 제공한다.
- `Integer.parseInt(String s)`

: 문자열을 기본형 `int`로 변환해주는 메서드.

- `Boolean.valueOf(String s)`

: 문자열을 `Boolean`으로 변환해주는 메서드.


### ✔️ 오토 박싱과 언박싱

---

**오토 박싱이란❓**

: **기본형을 래퍼 클래스의 객체로 자동 변환**하는 과정이다.

- 개발자가 명시적으로 객체 변환을 하지 않아도 기본형을 래퍼 클래스로 자동 감싸서 객체로 변환한다.

```java
int num = 10;
Integer wrapperNum = num; <- 기본형 intInteger 객체로 자동 변환
```

**오토 언박싱이란❓**

: **래퍼 클래스의 객체를 다시 기본형으로 자동 변환**하는 과정이다.

```java
Integer wrapperNum = Integer.valueOf(1);
int num = wrapperNum; <- Integer 객체가 기본형 int로 자동 변환
```

## ✅ Optional

---

> Optional은 **null 값으로 인해 발생할 수 있는 문제를 방지**하기 위해 사용되는 클래스이다.
>
- 주로 값이 있을 수도, 없을 수도 있는 상황에서 이를 안전하게 처리할 수 있도록 도와준다.

### ✔️ 주요 메서드

---

**1️⃣ Optional.of(T value)**

: null이 아닌 값을 가진 Optional 객체를 생성한다. (값이 null이면 `NullPointerException` 던진다)

```java
Optional<String> optional = Optional.of("Hello");
```

**2️⃣ Optional.orElse(T other)**

: 값이 있으면 그 값을 반환하고, 값이 없으면 **다른 대체 값을 반환**한다.

```java
String result = optional.orElse("Default Value");
```

**3️⃣ Optional.orElseThrow(Supplier<? extends X> exceptionSupplier)**

: 값이 없을 때 예외를 던진다. (다양한 의미있는 예외 가능)

```java
String result = optional.orElseThrow(() -> new IllegalArgumentException("값이 없음"));
```

### ✔️ Optional 사용 이유

---

1. **NullPointerException 예방**

: 자바에서 null은 매우 흔한 원인으로 예기치 않은 예외를 발생시킬 수 있다.

- Optional을 사용하면, null 값을 명시적으로 다루게 되어서 더욱 안전하다.
2. **명확한 의미 전달**

: 메서드의 반환 값이 null 일 수도 있음을 명시적으로 나타낼 수 있다.

- 예를 들어, DB 조회 시 값이 없을 수 있음을 Optional로 반환하여, 이 상황을 명확히 처리하도록 유도할 수 있다.
148 changes: 148 additions & 0 deletions mission/chapter03/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
## ☑️ 홈 화면

---

### ✅ **API Endpoint**

<aside>
🔑

**GET /api/home**

</aside>

### **✅ Request Body**

- **없음**

### **✅ Request Header**

```yaml
Authorization: Bearer <access_token> // 인증 토큰 값
Accept: application/json // 서버가 클라이언트에게 응답할 데이터 형식
User-Agent: PostmanRuntime/7.41.1 // 요청을 보내는 클라이언트 정보
```
### **✅ Query String**
- **없음**
## ☑️ 마이페이지 리뷰 작성
---
### ✅ **API Endpoint**
<aside>
🔑
**POST /api/users/review**
</aside>
### **✅ Request Body**
```json
{
"body" : "너무 맛있어요!",
"score" : "4.5"
}
```

### **✅ Request Header**

```yaml
Authorization: Bearer <access_token> // 인증 토큰 값
Content-Type: application/json // 요청의 본문 데이터 형식
Accept: application/json // 서버가 클라이언트에게 응답할 데이터 형식
User-Agent: PostmanRuntime/7.41.1 // 요청을 보내는 클라이언트 정보
```
### **✅ Query String**
- **없음**
## ☑️ 미션 목록 조회
---
### ✅ **API Endpoint**
<aside>
🔑
**GET /api/users/missions**
</aside>
### **✅ Request Body**
- **없음**
### **✅ Request Header**
```yaml
Authorization: Bearer <access_token> // 인증 토큰 값
Accept: application/json // 서버가 클라이언트에게 응답할 데이터 형식
User-Agent: PostmanRuntime/7.41.1 // 요청을 보내는 클라이언트 정보
```
### **✅ Query String**
---
⏩ **진행 중인 미션 조회**
<aside>
🔑
**?status = IN_PROGRESS**
</aside>
⏩ **진행 완료한 미션 조회**
<aside>
🔑
**?status = DONE**
</aside>
## ☑️ 회원 가입
---
### ✅ **API Endpoint**
<aside>
🔑
**POST /api/users**
</aside>
### **✅ Request Body**
```json
{
"name" : "J",
"gender" : "MALE",
"age" : 24,
"address" : "미추홀구 용현동",
"spec_address" : "177-12번지 3층",
"email" : "[email protected]"
}
```

### **✅ Request Header**

```yaml
Content-Type: application/json // 요청의 본문 데이터 형식
Accept: application/json // 서버가 클라이언트에게 응답할 데이터 형식
User-Agent: PostmanRuntime/7.41.1 // 요청을 보내는 클라이언트 정보
```
### **✅ Query String**
- **없음**

0 comments on commit 29682d9

Please sign in to comment.