ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 포함하고 있으면 true
    boolean 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()); //삭제,반환
    	}
    }

    우선 순위 큐

Designed by Tistory.