일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 스프링공부
- 프로그래머스
- 플러터 개발
- 플러터 공부
- 스프링 공부
- querydsl
- 코테공부
- JPA
- DDD
- 기술공부
- 자바공부
- Kafka
- JPA공부
- 알고리즘공부
- nestjs공부
- JPA예제
- 스프링부트공부
- 스프링
- 코테준비
- 카프카
- JPA스터디
- K8S
- 스프링부트
- 기술면접공부
- 자료구조공부
- Flutter
- Axon framework
- nestjs스터디
- JPA 공부
- nestjs
- Today
- Total
DevBoi
[Java] 제네릭의 이해 본문
제네릭은 일반적인 이라는 이름, 뭐이름은 중요하지 않고
클래스 내부에서 지정하는 것이 아닌 , 외부에서 사용자에 의해 지정되는 것을 의미한다.
한마디로, 특정 타입을 미리 지정해주는 것이 아니라 필요에 의해 지정할수 있도록 하는 일반 제네릭 타입이라는 것이다.
제네릭의 장점
- 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할수 있다.
- 클래스 외부에서 타입을 지정해주기 때문에 타입을 체크하고 변환해줄 필요없이 관리가 편하다.
- 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.
제네릭을 실제로 구현하고있는 것을 예시로 한번 생각해보자
우리가 많이 쓰는 ArrayList가 있다. 이걸 만들고있는 라이브러리를 보면, 제네릭으로 구현이 되어있다.
우리는 ArrayList<String>, ArrayList<Integer> 등등 클래스도 넣고 맘대로 쓴다.
그게 가능한 이유는 해당 구현체가 제네릭으로 되어있어서 이다.
쉽게 예시를 들어서
ArrayList<Student> list = new ArrayList<>();
list.add(new Student("1"));
list.get(0);
이런식으로, 생성, 추가, 조회를 한다고 가정해보자
1) 생성
ArrayList의 생성자이다.
해당 생성자는 단순히, 자신의 elementData를 빈 상수로 선언해준다.
그러면 elementData는?
ArrayList내부에서 가지고있는 transient 변수 명 Object 배열이다.
transient타입은 무엇일까? 해당 타입은, 그냥 Serialize대상에서 제외한다는 것이다.
2) 추가
많이 쓰는 add함수 또한 제네릭으로 구현이 되어있다.
우선 add를 하면, 내부 사이즈를 1로 증가시키고,
위에서 가지고있던 Object 배열 마지막에 제네릭 클래스값으로 추가해준다.
결국 배열 마지막 원소에 붙여주는 작업을 제네릭으로 해주는 것이다.
3)조회
조회를 하는 것 또한 똑같다.
특정 index의 값이 들어오면, 해당 인덱스를 체크하고, 아래 메서드를 탄다.
반환 타입은, 기존에 ArrayList의 제네릭 타입과 동일하게 맞춰준다.
이제 HashMap을 살펴보자
HashMap은 아래와 같이 생성한다.
해당 해쉬맵은 키와 밸류로 이루어져있고, 키를 가지고 밸류값을 조회하는데 쓰인다.
put과 get함수를 보자
1) put
put을 사용하면, putVal이라는 함수에, key에 대한 Hash와 키, 밸류를 넣게 된다.
해당 해쉬 맵에 대한 포스팅이 아니기때문에,
무튼 hash를 가지고 Node 변수에 값을 체크해서 있다면, 해당 값을 업데이트 치고, 없다면, new로 신규 생성을 해준다.
get도 원리는 비슷하다.
무튼 어떤 유틸이나, 타입을 가지고 제네릭으로 만들고 싶다면, 유사하게 사용하면 된다.
다만 주의 할점이 있다.
- 인터페이스만 적용되기 때문에 기본타입은 사용할수 없다.
ArrayList에서, int같은걸 사용할수 없다는 것이다.
- 제네릭 타입을 사용해, 객체 생성은 불가능하다.
T e = new T(); 이런식으로 신규 생성은 불가하다.
'Language > [Java]' 카테고리의 다른 글
[Java] JVM 동작 과정 (0) | 2022.02.18 |
---|---|
[JAVA] 스택 & 힙 & Garbage Collector (0) | 2022.02.18 |
Java 리플렉션 이란? (0) | 2021.12.06 |
JAVA stream _ 심화 (0) | 2021.09.05 |
JAVA stream 사용 예제_1 (0) | 2021.09.02 |