# 2022.10.26

## 할일 및 한일&#x20;

* [x] 모바일 프로그래밍 실습&#x20;
* [x] 이것이 자바다 13장(제네릭) 공부 및 notion 정리(20%)&#x20;

## 경험 및 배움&#x20;

오늘은 오전에 수업을 들은 후 실습을 진행하고, 오후에는 이것이 자바다 13장(제네릭)부분을 공부하였다.

이번 단원은 제네릭인데, 생소하고 써본적이 한번도 없어서 어렵게 느껴지는 것 같다.

우선 제네릭을 쓰는 이유는 다음과 같다.

1. **컴파일 시 좀 더 강한 타입 체크를 위해.**
2. **타입 변환(Casting)을 제거하기 위해.**

Java 컴파일러는 제네릭을 사용하면 컴파일을 할 때 좀 더 강한 타입 체크를 하여, 에러를 사전에 방지할 수 있다고 한다. 또한 불필요한 타입 변환은 프로그램에 성능에 좋지 않은 영향을 끼친다.

따라서 굳이 필요하지 않은 타입 변환은 줄이는 것이 프로그램이 도움이 될 수 있는데, 예시는 다음과 같다.

```java
List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0)
```

위의 코드는 List에 문자열을 저장하여, 이것을 불러올 때는 `String` 으로 타입 변환을 해주어야 불러올 수 있다. 하지만 위의 코드를 제네릭을 사용하여 변경하면, List에 저장되는 요소를 `String` 으로 국한할 수 있기 때문에, 불필요한 타입 변환을 줄일 수 있다.

```java
List<String> list = new ArrayList<String>();
list.add("hello");
String str = list.get(0);
```

또한 제네릭 타입은 타입을 파라미터로 갖는 클래스와 인터페이스를 뜻한다.

```java
public class 클래스명<T> { ... }
public interface 인터페이스명<T> { ... }
```

하지만 타입 파라미터를 사용해야 하는 이유는 무엇일까?

타입 파라미터를 사용해야 하는 이유는 위와 같이 **타입 변환을 최소화하기** 위해서이다.

{% hint style="info" %}
***제네릭은 클래스를 짤 때 구체적인 타입을 명시하지 않고, 타입 파라미터로 대체 했다가 실제 클래스가 사용될 때 구체적인 타입을 지정함으로써 타입 변환을 최소화 시킬 수 있다.***
{% endhint %}

이것이 자바다 2권부터는 생소하지 않은, 써보지 않은 부분들만 남았으니 천천히 공부하며 꼭 이해하고 넘어가려 한다.

## 개선 및 목표&#x20;

* 내일은 제네릭의 남은 부분을 더 공부해보고, 스프링 강의를 들으며 개념을 잡는 것을 시작해보려 한다.&#x20;
