-
[12회차-②] JAVA (컬렉션 List 인터페이스)JAVA 2021. 4. 8. 03:57
강의명 : 오픈프레임워크 활용 디지털융합 SW엔지니어 양성 과정
강의날짜 : 21.04.07
<컬렉션>
컬렉션은 자바에서 자료구조를 구현한 클래스이다.
Collection 인터페이스의 메소드
메소드 설명 boolean isEmpty()
boolean contains(Object obj)
boolean containsAll(Collection<?> c)공백 상태이면 true
obj 포함하고 있으면 trueboolean add(E element)
boolean addAll(Collection<? extends E> from)원소 추가 boolean remove(Object obj)
boolean removeAll(Collection<?> c)
boolean retainAll(Collection<?> c)
void clear()원소 삭제 Iterator<E> iterator()
Stream<E> stream()
Stream<E> parallelStream원소 방문 int size() 원소의 개수 반환 Object[] toArray()
<T> T[] toArray(T[] a)컬렉션을 배열로 전환 1. List인터페이스
순서를 가지는 요소들의 모임으로 중복된 요소를 가질 수 있다.
대표적으로 Vector, ArrayList, LinkedList 등이 있다.
2. List - Vector클래스
Vector클래스는 가변 크기의 배열을 구현하고 있다.
package april7th; import java.util.Vector; public class VectorTest { public static void main(String[] args) { Vector vc = new Vector(); vc.add("Hello World!"); vc.add(new Integer(10)); vc.add(20); System.out.println("vector size : "+vc.size()); //원소 개수 출력 for(int i=0;i<vc.size();i++) { //반복문으로 백터의 원소 출력 System.out.println("vector element "+i+" : "+vc.get(i)); //백터의 원소를 가져옴 } String s=(String)vc.get(0); //벡터의 첫 번째 원소를 문자열로 강제 형변환 후 s에 저장 System.out.println(s); //s 출력 } }
3. List - ArrayList 클래스
순차적인 가변 크기의 배열을 나타낸다.
package april7th; import java.util.ArrayList; public class ArrayListTest { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); //String형의 ArrayList 생성 list.add("MILK"); //MILK삽입 list.add("BREAD"); //BREAD 삽입 list.add("BUTTER"); //BUTTER 삽입 list.add(1,"APPLE"); //인덱스1에 APPLE 삽입. 원소들 하나씩 뒤로 밀림 list.set(2,"GRAPE"); //인덱스2가 된 BREAD를 GRAPE로 대체 list.remove(3); //인덱스3이 된 BUTTER 삭제 for(int i=0;i<list.size();i++) { System.out.println(list.get(i)); } for(String s : list) System.out.println(s); } }
4. ArrayList와 Vector의 차이
동기화 지원여부
동기화란 두 개 이상의 스레드가 동시에 Vector를 사용할 떄 오류가 나지 않도록 실행 순서를 보장하는 것이다.
동기화를 시키지 않고 멀티 프로그래밍이 되면 내가 사용할 데이터의 값이 바뀌어 있을 가능성도 있다.
동기화가 되면 내가 보존해 놓아야 할 데이터가 락이되어 보존이 된다.
만약 동기화가 필요한 경우에 ArrayList를 Vector로 바꾸지 않고 사용할 경우에는
Collections.synchronizedList(new ArrayList<Strnig>()); 를 사용
대신 Vector는 잠금과 해제가 반복되므로 속도가 다소 느리다.
*길이를 구하는 방법
array.length
ArrayList.size()
String.length()
Vector.size()
5. Iterator반복자
나중에 Set 인터페이스의 경우는 배열처럼 순서나 자리가 있는 것이 아니다.
그럴 경우 하나하나씩 출력하는 반복자에는 Iterator가 있다.
package april7th; import java.util.Iterator; import java.util.Vector; public class ArrayListTest { public static void main(String[] args) { Vector<String> list = new Vector<String>(); list.add("MILK"); list.add("BREAD"); list.add("BUTTER"); list.add(1,"APPLE"); list.set(2,"GRAPE"); list.remove(3); String s; Iterator e =list.iterator(); //Iterator 반복자 사용 while (e.hasNext()) { //만약 다음 요소가 있으면 true반환 s=(String)e.next(); //다음 원소를 반환하는 메소드 System.out.println(s); } } }
* ArrayList & Iterator 활용하기
package april7th_1; //패키지를 다르게 설정해준다! public class Member { private int memberID; //회원번호 private String memberName; //회원명 public Member(int memberID,String memberName) { //생성자 this.memberID=memberID; this.memberName=memberName; } public int getMemberID() { //회원번호 반환하는 메소드 return memberID; } public void setMemberID(int memberID) { //회원번호 설정하는 메소드 this.memberID=memberID; } public String getMemberName() { //회원명 반환하는 메소드 return memberName; } public void setMemberName(String memberName) { //회원명 설정하는 메소드 this.memberName=memberName; } public String toString() { return memberName+" 회원님의 아이디는 "+memberID+"입니다."; } }
package april7th; import april7th_1.Member; //다른 패키지에서 구현한 Member클래스를 import 해준다!! import java.util.ArrayList; import java.util.Iterator; public class MemberArrayList { private ArrayList<Member> arrayList; //Member형 ArrayList 생성 public MemberArrayList() { //생성자 arrayList=new ArrayList<Member>(); } public void addMember(Member member) { //배열에 Member형 member를 삽입 arrayList.add(member); } public boolean removeMember(int memberID) { //회원번호를 매개변수로 줌 Iterator<Member> ir=arrayList.iterator(); //Iterator반복자 생성 while(ir.hasNext()) { //다음의 원소가 있을동안 Member member =ir.next(); //다음 원소를 가져옴 int tempID=member.getMemberID(); //원소의 회원번호를 임시 변수에 저장 if(tempID==memberID) { //만약 원소의 회원번호가 매개변수의 회원번호와 같다면 arrayList.remove(member); //원소를 배열에서 삭제 return true; } } //return되지 못했을 경우 System.out.println(memberID+"가 존재하지 않습니다"); return false; } public void showAllMember() { //모든 배열의 원소를 뽑아내는 메소드 for(Member member : arrayList) { System.out.println(member); } System.out.println(); } }
package april7th; import april7th_1.Member; //Member클래스 import!! public class MemberArrayListTest { public static void main(String[] args) { MenberArrayList memberArrayList=new MenberArrayList(); Member memberLee=new Member(1001,"이지원"); Member memberSon=new Member(1002,"손민국"); Member memberPark=new Member(1003,"박서훤"); Member memberHong=new Member(1004,"홍길동"); memberArrayList.addMember(memberLee); memberArrayList.addMember(memberSon); memberArrayList.addMember(memberPark); memberArrayList.addMember(memberHong); memberArrayList.showAllMember(); memberArrayList.removeMember(memberHong.getMemberID()); memberArrayList.showAllMember(); } }
6. List - LinkedList 클래스 (자료구조 참조)
[자료구조]CH3. 순차 자료구조와 선형리스트(행렬~) - CH4. 연결 자료구조와 연결리스트(~연결 자료
참조 : C로 배우는 쉬운 자료구조(이지영 저) 공부 날짜 : 2021.01.24 2. 행렬의 선형 리스트 표현 행렬은 행과 열로 이루어진 자료구조이다. 행렬에서 행의 개수와 열의 개수가 같은 행렬을 정방행
crystal93.tistory.com
[자료구조]CH4. 연결 자료구조와 연결 리스트(단순 연결 리스트)
참조 : C로 배우는 쉬운 자료구조 (이지영 저) 공부날짜 : 2021.01.27 단순 연결 리스트 1. 단순 연결 리스트의 개념 단순 연결 리스트는 노드의 링크 필드가 하나이고, 링크 필드는 다음 노드와 연
crystal93.tistory.com
LinkedList 데이터 노드와 링크 노드로 이루어져있다.
링크 노드가 다음 원소의 가리켜주고 있다.
package april7th; import java.util.LinkedList; public class LinkedListT { public static void main(String[] args) { LinkedList<String> myList=new LinkedList<String>(); myList.add("A"); myList.add("B"); myList.add("C"); System.out.println(myList); myList.add(1,"D"); //1번 노드 자리에 삽입 System.out.println(myList); myList.addFirst("O"); //가장 첫 노드로 삽입 System.out.println(myList); System.out.println(myList.removeLast()); //마지막 원소 삭제 System.out.println(myList); } }
7. 스택 (Stack) (자료구조 참조)
[자료구조]CH5. 스택
참조 : C로 배우는 쉬운 자료구조(이지영 저) 공부날짜 : 2021.01.31 스택의 이해 1. 스택의 개념과 구조 스택은 데이터를 차곡차곡 쌓아올린 형태로 자료를 구성한다. 스택은 같은 구조와 같은 크
crystal93.tistory.com
선입선출 (LIFO) 구조이다.
자바에서는 Stack클래스로 제공되지만 ArrayList로 구현이 가능하다.
package april7th; import java.util.ArrayList; class MyStack{ private ArrayList<String> arrayStack = new ArrayList<String>(); //ArrayList사용 public void push(String data) { //삽입 메소드 arrayStack.add(data); } public String pop() { //마지막에 넣은 원소 삭제 반환 메소드 int len=arrayStack.size(); if(len==0) { System.out.println("스택이 비었습니다"); return null; } return (arrayStack.remove(len-1)); //배열의 마지막 원소를 반환 } } public class StackTest { public static void main(String[] args) { MyStack stack = new MyStack(); stack.push("A"); stack.push("B"); stack.push("C"); System.out.println(stack.pop()); System.out.println(stack.pop()); System.out.println(stack.pop()); } }
후입선출 8. 큐 (Queue) (자료구조 참조)
[자료구조]CH6. 큐
참조 : C로 배우는 쉬운 자료구조 (이지영 저) 공부날짜 : 2021.02.07 큐의 이해 1. 큐의 개념과 구조 큐는 삽입과 삭제가 위치와 방법이 제한된 유한 순서 리스트라는 점은 스택과 같지만, 리스트의
crystal93.tistory.com
선입선출(FIFO) 구조이다.
자바에서는 인터페이스로 제공되지만 ArrayList로 구현이 가능하다.
package april7th; import java.util.ArrayList; class MyQueue { private ArrayList<String> arrayQueue=new ArrayList<String>(); //ArrayList배열 사용 public void enQueue(String data) { //큐에 원소 삽입 arrayQueue.add(data); } public String deQueue() { //큐에서 원소 삭제 int len=arrayQueue.size(); if(len==0) { System.out.println("큐가 비었습니다"); return null; } return (arrayQueue.remove(0)); //가장 나중에 들어간 원소가 반환 } } public class QueueTest { public static void main(String[] args) { MyQueue queue=new MyQueue(); queue.enQueue("A"); queue.enQueue("B"); queue.enQueue("C"); System.out.println(queue.deQueue()); System.out.println(queue.deQueue()); System.out.println(queue.deQueue()); } }
선입선출 큐는 이미 자바에서 인터페이스로 제공이 되고 있으므로 인터페이스로도 구현이 가능하다.
package april7th; import java.util.LinkedList; import java.util.Queue; //import! public class QueueTest1 { public static void main(String[] args) throws InterruptedException{ //예외처리 int time = 10; //큐 인터페이스로 객체 생성하여 LinkedList를 참조 Queue<Integer> queue=new LinkedList<Integer>(); for(int i=time;i>=0;i--) { queue.add(i); //10부터 0까지 삽입 } while(!queue.isEmpty()) { //공백이 될 때까지 System.out.print(queue.remove()+" "); //큐에서 삭제 Thread.sleep(1000); //현재의 스레드를 1초간 재운다. 카운트 다운 } } }
1초에 하나씩 숫자가 나오는 것 확인 우선순위 큐 원소들이 무작위로 삽입되어도 정렬된 상태로 원소들을 추출한다.
즉 remove를 호출할때마다 가장 작은 원소부터 추출한다.
우선순위큐는 히프를 내부적으로 사용한다.
package april7th; import java.util.PriorityQueue; public class PriorityQueueTest { public static void main(String[] args) { PriorityQueue<Integer> pq=new PriorityQueue<Integer>(); //우선순위큐 pq.add(30); pq.add(80); pq.add(20); for(Integer o : pq) System.out.println(o); //출력 System.out.println("원소삭제"); while(!pq.isEmpty()) System.out.println(pq.remove()); //삭제,반환 } }
우선 순위 큐 'JAVA' 카테고리의 다른 글
[13회차] JAVA (컬렉션 메소드,스레드) (0) 2021.04.08 [12회차-③]JAVA (컬렉션 Set 인터페이스, Map 인터페이스) (0) 2021.04.08 [12회차-①] JAVA (제네릭-②) (0) 2021.04.08 [11회차-②] JAVA (제네릭-①) (0) 2021.04.06 [11회차-①] JAVA (스윙 컴포넌트) (0) 2021.04.06