티스토리 뷰
List 인터페이스
자바에서 객체를 순서대로 저장하고 관리할 수 있도록 설계된 인터페이스
java.util 패키지에 속하며, 배열이나 연결 리스트 등의 순차적 자료 구조의 구현체를 위한 메서드를 정의한다.
List 인터페이스의 주요 특징
- 순서 유지: List 인터페이스를 구현하는 자료 구조는 원소들이 삽입된 순서를 유지한다. 이는 원소들이 리스트 내에서 특정 위치(index)를 가지며, 이 인텍스를 통해 접근할 수 있다는 것을 의미한다.
- 중복 허용: List 는 같은 값을 가진 원소의 중복 저장을 허용한다. 예) 같은 값을 여러 번 리스트에 추가할 수 있으며, 이는 리스트의 크기를 증가시키고 각각의 원소는 별도의 인덱스를 갖게 된다.
- 가변 크기 : List의 구현체들은 동적으로 크기가 조절된다. 즉, 원소를 추가하거나 제거함에 따라 리스트의 크기가 자동으로 조정된다.
주요 메서드 add(E elemnet): 리스트의 끝에 원소를 추가한다. get(int index): 지정된 위치의 원소를 반환한다. remove(int index): 지정된 위치의 원소를 제거하고 그 원소를 반환한다. indexOf(Object o): 지정된 객체가 처음으로 나타나는 위치의 인덱스를 반환한다. 객체가 리스트에 포함되어 있지 않은 경우 -1을 반환한다. size(): 리스트에 있는 원소의 수를 반환한다. |
Collection
|
└── List
├── ArrayList
├── LinkedList
└── Vector
collection: 모든 컬렉션 클래스의 최상위 인터페이스이다.
List : collection 인터페이스를 확장하는 순서가 있는 컬렉션을 위한 인터페이스이다. 리스트는 중복을 허용하며, 각 요소가 삽입된 순서에 따라 인덱스로 접근할 수 있다.
ArrayList : 내부적으로 배열을 사용하여 요소를 관리하는 List 구현체이다. 요소의 무작위 접근이 빠르다는 장점이 있다.
LinkedList : 내부적으로 연결 리스트를 사용하여 요소를 관리하는 List 구현체이다. 요소의 삽입과 삭제가 빠르다는 장점이 있다.
Vector : ArrayList 와 유사하지만, 모든 메서드가 동기화되어 있어 멀티 스레드 환경에서 안전하게 사용할 수 있다.
제네릭
- 제네릭 프로그래밍은 자바에서 타입을 일반화하여 재사용 가능한 코드를 작성하는 기법이다.
- 제네릭을 사용하면 클래스를 정의할 때 클래스 안에서 사용되는 자료형(타입) , 클래스, 인터페이스, 메서드 등에 대해 특정 타입을 지정하지 않고, T와 같은 기호로 적어놓아 다양한 타입에서 동작하도록 할 수 있다.
- 대표적으로 ArrayList 클래스의 ArrayList <T> 는 어떤 종류의 객체도 저장할 수 있는 배열이다.
- T는 배열에 저장되는 타입을 나타내는 매개변수이다.
제네릭 프로그래밍의 주요 이점
- 타입 안정성: 컴파일 시 타입을 검사하여 런타임 에러를 줄일 수 있습니다.
- 코드 재사용성: 다양한 타입을 처리할 수 있는 일반화된 코드를 작성할 수 있습니다.
- 유지보수성: 타입 캐스팅을 줄여 가독성과 유지보수성을 향상시킵니다.
객체를 생성할 때 T 자리에 구체적인 자료형을 적는다.
제네릭 클래스는 타입을 변수로 표시한다. 이것을 타입 매개 변수라고 한다.
타입 매개 변수의 값은 객체를 생성할 때 구체적으로 결정된다.
문자열을 저장하는 Box 클래스의 객체를 생성 시 T 대신에 String을 사용한다.
Box<String> b = new Box<String>();
정수를 저장하는 Box 클래스의 객체 생성 시 T 대신에 <Integer>를 사용한다.
Box<Integer> b = new Box<Integer>();
* int는 기초 자료형이고 클래스가 아니기 때문에 사용할 수 없다.
다이아몬드 < >
: java 7버전부터 제네릭 클래스의 생성자 호출 시 타입 인수를 구체적으로 주지 않아도 된다. (컴파일러는 문맥에서 타입을 추측하기 때문임)
Box<Integer> b = new Box<>();
코드 예시 1)


코드 예시 2)


코드 예시 3)



Vector
가변 크기의 배열을 구현한다.
(요소의 개수가 늘어나면 자동으로 배열의 크기가 늘어난다.)
- java.util 패키지에 있는 컬렉션의 일종이다.
- 제네릭 기법을 사용하므로 어떤 타입의 객체라도 저장할 수 있다.
- 기초형 데이터(정수 등)는 오토박싱 기능을 이용하여 객체로 변환되어 저장할 수 있다.
add() : 백터에 요소 추가
add(index, object) : 정해진 위치에 요소 삽입
get() : 값 추출
size() : 벡터 안에 있는 요소들의 개수를 반환
코드 예시1)


코드 예시 2)
제네릭 기능 사용


코드 예시 3)
몬스터를 나타내는 객체 Monster를 정의하고 Monster 객체를 몇 개 생성하여 벡터에 저장한다.
저장된 Monster 객체를 꺼내서 출력해보자.


Arraylist
가변 크기의 배열을 구현하는 클래스로 Vector와 유사하지만, Vector는 스레드 간의 동기화를 지원하는 반면에 ArrayList는 동기화하지 않으므로, 멀티 스레드 상황이면 Vector를 사용하는 것이 좋다.
타입 매개 변수를 가지는 제네릭 클래스로 제공된다. 따라서 ArrayList 를 생성하려면 타입 매개 변수를 지정해야 한다.
ArrayList<String> list = new ArrayList<String>();
이는 저장하려는 데이터의 타입이 문자열이며 객체를 생성한다.
코드 예시)

Arrays.asList() 메서드는 배열을 받아서 리스트 형태로 반환한다.



Linked List
각 원소를 링크로 연결하며, 각 원소들은 다음 원소를 가리키는 링크를 저장하고 있다.
삽입이나 삭제되는 위치의 바로 앞에 있는 원소의 링크값만을 변경하면 된다.
단점: 위치(인덱스)를 가지고 있는 원소를 접근하는 연산 시간이 ArrayList 보다 더 오래 걸린다.
특징
- 동일한 데이터 타입을 순서에 따라 관리하는 자료구조
- 자료를 저장하는 노드에는 자료와 다음 요소를 가리키는 링크(포인터)가 있다
- 자료가 추가될 때 노드 만큼의 메모리를 할당받고 이전 노드의 링크로 연결한다.(정해진 크기가 없음)
- jdk 클래스 : LinkedList

코드 예시)

멤버변수 및 기본 생성자 생성
Node 1개 추가하는 메서드 생성(맨 뒤에 생성됨)


지정 위치의 Node 1개 제거하는 메서드 생성



전체를 출력하는 메서드 생성

지정 위치의 Node 1개 출력

전체 삭제하는 메서드 생성 및 main 함수

'Java' 카테고리의 다른 글
Java(Map 인터페이스) (0) | 2024.05.19 |
---|---|
Java(Set 인터페이스) (0) | 2024.05.19 |
Java(Stack) (0) | 2024.05.19 |
Java(자료구조 및 Collections 클래스) (0) | 2024.05.06 |
Java(중첩 클래스) (0) | 2024.05.06 |