Back-End/Java 기초정리

Java ■ 제네릭과 컬렉션

SIKIDA 2024. 4. 27. 19:00
728x90

 

 

 

◈ 제네릭(Generic)

데이터 타입을 외부에서 지정함

 

미리 데이터 타입을 지정해두지 않고 외부에서 사용할 때 지정하는 데이터 타입으로 유동적으로 변경하여 지정해줌

 

• 사용 방법

1. 클래스에 와 같이 제네릭을 설정한 후, 필드의 데이터 타입을 T로 지정

2. 객체를 생성할 때 클래스명<데이터타입>을 지정

3. 설정한 데이터 타입으로 사용이 가능한지 확인

 

* 즉, 외부에서 어떠한 데이터 타입으로 만들어 사용할 지 모르는 필드 또는 매개변수 등에 주로 사용됨

 

 

• int 대신 Integer를 사용하는 이유

Person 위치에 있는 데이터 타입은 참조형만 올 수 있음

 

기본형 타입은 올 수 없기 때문에 int의 wrapper class인 Integer를 사용해야 함

* 제네릭은 참조형 변수, 즉 객체를 필요로 하며 기본형 변수는 객체가 아니기 때문에 사용할 수 없음

* wrapper class : 기본형 타입을 객체로 만들어서 사용할 수 있도록 해주는 클래스

 

 

• 복수 제네릭

제네릭에 여러 개의 데이터 타입을 넣어서 유동적으로 사용하고 싶을 경우 아래와 같이 사용 가능

* 전달받은 순서에 따라 T는 String, S는 Integer가 되어 필드 및 매개변수 등에 사용 가능

 

 

◈ 컬렉션 프레임워크

 

• 컬렉션(Collection)

동일한 데이터 타입을 묶어서 관리하는 자료 구조이며, 저장 공간의 크기를 동적으로 관리할 수 있음

 

• 컬렉션 프레임워크(Collection Framework)

리스트, 스택, 큐, 트리 등의 자료구조에 특정 알고리즘을 구조화 해 놓은 프레임워크

 

• 컬렉션의 구성 요소

1. 인터페이스  각각의 컬렉션을 나타내는 인터페이스(List, Set, Map 등)가 있으며

이를 구현하는 방식 으로 작성할 수 있음

2. 클래스

-> 같은 List 컬렉션을 사용하더라도 상세 구현이 달라질 수 있음 (ArrayList, LinkedList 등)

3. 알고리즘

-> 연산, 검색, 정렬 등에 대한 알고리즘을 컬렉션에서 제공함

 

• 컬렉션 프레임워크의 인터페이스

1. List : 순서가 있으며, 중복을 허용함

2. Set : 순서가 없으며, 중복을 허용하지 않음

3. Map : 키(key)와 값(value)로 구성되며 순서가 있음.

               단, 키는 중복을 허용하지 않으며 값만 중복을 허용함

 

 

• 컬렉션 프레임워크 계층도

 

 

• ArrayList

가장 많이 사용되는 클래스로써 동적으로 배열의 길이를 조절해주며 List Interface의 구현체 ArrayList 내부적으로 배열의 길이를 가변적으로 조절해주는 리사이징 코드가 작성됨

* ArrayList의 리사이징 공식 : (현재 배열의 길이 * 3) / 2 + 1

* 위의 리사이징 공식을 활용하여 나온 값을 capacit라고 하며, new ArrayList()으로 작성할 경우 기본값 10으로 설정됨

* 결국 가변적인 크기를 가질 수 있는 배열이므로, 같은 데이터 타입만을 넣을 수 있음

 

-참고

ArrayList는 배열과 동일한 구조를 가지고 있기 때문에 ArrayList의 길이가 늘어날 경우 똑같은 배열을 하나 만들고, 추가된 데이터를 넣기 때문에 추가/삭제 작업이 많을 경우 속도가 느리지만 데이터 조회는 인덱스로 바로 접근이 가능하기 때문에 빠름

 

 

• ArrayList 사용하기 (1)

기본형 변수는 사용하지 못하며, 참조형 변수 타입으로 사용이 가능

* 참조형 변수 타입으로만 가능한 이유는, 제네릭을 사용하기 때문

 

• ArrayList 사용하기 (2)

기본형 변수는 사용하지 못하며, 참조형 변수 타입으로 사용이 가능

 

 

 

• 그 외 메소드들

 

 

• LinkedList

각각의 노드가 데이터와 포인터를 가지고 한 줄로 연결된, 링크된 형식을 가지고 있는 자료구조로써 ArrayList와는 다르게 데이터 추가 또는 삭제가 되더라도 전체 인덱스가 한칸씩 밀리는 현상이 없기에 추가/삭제가 용이함

 

* 단, 그러하기에 탐색 속도가 떨어지므로 데이터 조회보다는 추가/삭제가 많은 경우 LinkedList를 사용하면 좀 더 좋은 성능의 코드를 작성할 수 있음

 

-참고

LinkedList는 아래와 같이 독특한 구조를 가지고 있음

 

 

• LinkedList 사용하기

사용하는 메소드들은 ArrayList와 큰 차이가 없음

* 둘 다 List 인터페이스를 기반으로 된 구현체이기 때문

 

 

 

• HashSet

이전 컬렉션들과는 다르게 Set 인터페이스의 구현체이며 순서가 보장되지 않고, 중복을 허용 하지 않는것이 특징

 

-참고

순서가 보장되지 않는다는 것은, 순서대로 나오다가도 어느 순간 틀어질 수 있음을 말함

JDK 버전, 테스트 환경 등 여러 요소에 따라 갑자기 순서가 바뀔 수 있음

 

* 순서를 보장 받으려면 HashSet 대신 LinkedHashSet을 사용하면 됨

* https://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html

 

 

 

• HashMap

Map 인터페이스를 구현한 대표적인 컬렉션중의 하나로써 Key – Value 형태를 가지고 있음. Key는 중복이 안되며 Value만 중복을 허용함

만약, 기존에 저장되어 있던 Key를 저장하면 기존 값이 삭제되고 새로운 값이 대체되어 생성 됨

* 순서 보장 안됨, 순서 보장은 LinkedHashMap

 

 

제네릭과 컬렌션에 관해 정리를 진행하였다! 오늘도 고생했고 그럼 20000!!!

 

 

 

'Back-End > Java 기초정리' 카테고리의 다른 글

Java ■ 예외  (0) 2024.04.26
Java ■ 추상화  (0) 2024.04.25
Java ■ 다형성(Polymorphism)  (0) 2024.04.24
Java ■ 접근제어자와 캡슐화, 예약어  (0) 2024.04.23
Java ■ 상속  (2) 2024.04.21