일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 개발자
- 배열
- try-catch
- 백엔드
- FileInputStream
- 자료형
- 바이트 단위 스트림
- node.js
- 인터페이스
- 졸리다
- 보조 스트림
- 상속
- 예외 처리
- SSR
- 새벽공부
- 변수
- exception
- MPA
- 인스턴스
- 메서드
- 자바
- throws
- 파이팅
- ArrayList
- 코딩
- 다형성
- 초보개발자
- Java
- 문자 단위 스트림
- 코린이
- Today
- Total
SHUSTORY
12-3 List 인터페이스 본문
* 간단한 회원 관리 프로그램을 만들면서 컬렉션 프레임워크에서 제공하는 각 클래스를 실습해보자.
다음 Member 클래스는 앞으로 실습할 때 계속 사용할 것이다.
List 인터페이스
List 인터페이스에는 객체를 순서에 따라 저장하고 유지하는 데 필요한 메서드가 선언되어 있다.
대표적인 순차 자료 구조에는 배열이 있으며, 자바에서 배열을 구현한 대표 클래스로는 ArrayList, Vector가 있으며
배열과 구현 방식은 다르지만 순차 자료 구조를 구현한 LinkedList가 있다.
ArrayList 클래스
객체 순서를 기반으로 순차적으로 자료를 관리하는 프로그램을 구현할 때 사용한다.
ArrayList를 활용한 회원 관리 프로그램 구현하기
ArrayList를 활용한 MemberArrayList 클래스에 다음 3개의 메서드를 제공한다.
- 회원을 추가하는 addMember( )
- 회원을 삭제하는 removeMember( )
- 전체 회원을 출력하는 showAllMember( )
각 메서드의 코드에는 Collection 인터페이스에서 선언하고 ArrayList에서 구현한 add( ), get( ) 등의 메서드를 사용한다.
ArrayList를 사용하여 회원을 추가, 삭제 및 정보를 출력해보자.
get( ) 메서드로 회원을 순차적으로 가져온 후 회원 아이디가 매개변수와 일치하면 해당 회원을 삭제하고,
반복문이 끝날 때까지 해당 아이디를 찾지 못한 경우 해당 문장을 출력하고 메서드의 반환형이 boolean이기 때문에 false값을 return해준다. ( 성공적으로 회원을 삭제한 경우는 true 값 반환 )
showAllMember( ) 메서드에서는 향상된 for문을 사용하여 배열에 있는 회원을 하나씩 가져와 출력하면 Member 클래스에서 재정의한 toString( )이 호출되면서 회원 정보가 출력된다.
다음은 예제02_MemberArrayList 클래스를 직접 회원을 추가, 삭제하며 프로그램이 잘 구현되었는지 확인한 클래스이다.
ArrayList와 Vector 클래스
ArrayList와 Vector의 가장 큰 차이는 동기화 지원 여부이다.
동기화란 두 개 이상의 스레드가 동시에 Vector를 사용할 때 오류가 나지 않도록 실행 순서를 보장하는 것이다.
스레드와 멀티스레드 프로그래밍
스레드란 간단히 말하면 작업 단위로, 프로그램이 메모리에서 수행되려면 스레드 작업이 생성되어야 한다.
이때 하나의 스레드만 수행되면 단일 스레드라고 하고, 두 개 이상의 스레드가 동시에 실행되는 경우 멀티스레드라고 한다.
두 개 이상의 스레드가 동시에 실행되면 같은 메모리 공간에 접근하기 때문에 변수 값이나 메모리 상태에 오류가 발생할 수 있는데, 이때 메모리에 동시에 접근하지 못하도록 순서를 맞추는 것이 동기화이다.
동기화를 구현하기 위해서는 동시에 작업이 이루어지는 자원에 대해 잠금( lock )을 수행한다.
Vector에서는 이 과정이 발생하여 ArrayList보다 수행 속도가 느리므로, 멀티스레드 환경이 아닐 경우 ArrayList를 사용
하도록 권장한다. ArrayList를 사용해서 구현했는데 나중에 프로그램에서 동기화가 필요하다면 Vector로 바꾸지 않고
다음과 같이 ArrayList 생성 코드를 쓰면 된다.
LinkedList 클래스
배열은 처음 배열 생성 시 정적 크기로 선언하고, 물리적 순서와 논리적 순서가 동일하다.
중간에 자료의 삽입 및 삭제 시 나머지 자료를 이동시켜 빈 공간을 만들지 않고 연속된 자료 구조를 구현하며,
처음 선언한 배열 크기 이상으로 요소가 추가되는 경우 크기가 더 큰 배열을 새로 생성하여 각 요소를 복사해야 한다.
이러한 번거로움을 개선한 자료 구조를 LinkedList라고 한다.
링크드 리스크의 각 요소는 해당 요소의 자료와 다음 요소를 가리키는 주소 값을 가진다.
따라서 물리적인 메모리는 떨어져 있어도 논리적으로 앞뒤 순서가 있다.
같은 List 인터페이스를 구현한 ArrayList에 비해 중간에 자료를 삽입하거나 삭제하는 데 시간이 적게 걸리며,
크기를 동적으로 증가시킬 수 있다는 장점이 있다.
* 만약 다음을 가리키는 요소가 없을 경우 널 값이나 0을 저장한다.
* 링크드 리스트의 중간에 요소를 추가할 경우 서로 가리키고 있는 주소 값만 변경해주면 된다.
* 링크드 리스트의 요소를 제거할 경우 주소 값만 변경해주면 되고, 제거된 메모리는 이후 가비지 컬렉터에 의해 수거된다.
배열과 링크드 리스트의 다른 점
배열은 생성할 때 용량을 지정하고, 용량보다 더 많은 요소가 추가된 경우에 용량을 늘려 가며 수행하는 반면
그러나 링크드 리스트는 요소가 추가할 때마다 동적으로 요소의 메모리를 생성한다.
또한 링크드 리스트는 자료를 중간에 추가하거나 삭제할 때 자료의 이동이 배열보다 적다.
하지만 배열의 경우 어떤 요소의 위치를 찾을 때 편리하며, 링크드 리스트보다 구현이 쉽다.
즉 사용하는 자료의 변동이 많은 경우 링크드 리스트를, 자료 변동이 거의 없는 경우 배열을 사용하는 것이 효율적이다.
LinkedList 클래스 사용하기
LinkedList 클래스에는 링크드 리스트의 맨 앞 또는 맨 뒤 요소를 추가, 삭제하는
addFirst( ), addLast( ), removeFirst( ), removeLast( ) 등의 메서드가 있다.
ArrayList로 스택과 큐 구현하기
스택은 LIFO( Last In First Out ) 방식이다.
큐는 FIFO( First In First Out ) 방식이다.
ArrayList로 스택 구현하기
스택은 가장 최근에 추가된 자료부터 반환해 준다.
스택에 자료를 추가하는 것을 push( )라고 하고, 자료를 꺼내는 것을 pop( )이라고 한다.
그리고 스택에 가장 최근에 추가된 자료의 위치를 top이라고 한다.
push( )에서는 add( ) 메서드를 사용하여 ArrayList 맨 뒤에 요소를 추가한다.
그리고 pop( ) 메서드의 17행을 통해 가장 최근에 추가된 마지막 요소를 ArrayList에서 제거하고 반환해준다.
ArrayList로 큐 구현하기
enQueue( )에서는 add( ) 메서드를 사용하여 ArrayList 맨 뒤의 요소를 추가한다.
Collection 요소를 순회하는 Iterator
순서가 없는 Set 인터페이스를 구현할 경우 get(i) 메서드를 사용할 수 없는데, 이 때 사용하는 것이 Iterator이다.
Iterator는 Collection 인터페이스를 구현한 객체에서 미리 정의되어 있는 iterator( ) 메서드를 호출하여 참조한다.
예를 들어 Collection을 구현한 ArrayList에 iterator( ) 메서드를 호출하면 Iterator 클래스가 반환되므로
다음과 같이 Iterator형 변수에 대입해 사용한다.
Iterator를 사용하여 요소를 순회할 때 사용하는 메서드
Iterator를 사용하여 모든 요소를 순회할 때 다음 두 가지 메서드를 사용한다.
메서드 | 설명 |
boolean hashNext( ) | 이후에 요소가 더 있는지를 체크하는 메서드이며, 요소가 있다면 true를 반환한다. |
E next( ) | 다음에 있는 요소를 반환한다. |
다음은 MemberArrayList 클래스의 removeMember( ) 메서드를 수정하기 전과 이다.
'프로그래밍 > JAVA' 카테고리의 다른 글
12-5 Map 인터페이스 (0) | 2023.03.08 |
---|---|
12-4 Set 인터페이스 (0) | 2023.03.08 |
12-2 컬렉션 프레임워크 (0) | 2023.03.08 |
12-1 제네릭 (0) | 2023.03.07 |
11-3 Wrapper 클래스 (0) | 2023.03.06 |