본문 바로가기
고급JAVA

고급자바 D1 List , Stack , Queue

by 현닝이 2022. 7. 20.

※Eclipse IDE for Enterprise Java Developers 202006 다운로드

eclips 켜서 - window - preference ->encoding 검색

1.workspace-> text encoding UTF-8 로 변경

2.CSS ,HTML JSP 도 UTF-8

자바 컬렉션 프레임워크

1.Java Collection Framework

Java 컬렉션 프레임워크는 자바의 컬렉션(모음)객체들을 다루기 위해 제공되는 재사용 가능한 클래스 또는 인터페이스를 통칭하는 표현임 . 프레임워크(Framework)라 말하지만, 사실 라이브러리 (Library)처럼 사용

 

<List 인터페이스 특징>

1) 순서(인덱스)가 존재하는 데이터의 집합이다.

2) 데이터가 중복되어도 저장이 가능하다(순서만 다르면 중복저장 가능함)

 

<List 인터페이스를 구현하고 있는 클래스>

Stack, Vector, LinkedList, ArrayList

 

package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.List;

public class T01ArrayListTest {
	public static void main(String[] args) {
		// ArrayList 는 기본적인 사용법이 Vector 와 같다.
		// DEFAULT_CAPACITY = 10;
		List list1 = new ArrayList();

		// add()메서드를 사용해서 데이터를 추가한다.
		list1.add("aaa");
		list1.add("bbb");
		list1.add(111); // list1.add(new Integer(111)); 한것과 같다
		list1.add('k'); // character
		list1.add(true); // boolean
		list1.add(12.34);
		// 객체화 되었다 -> rapper class (Integer,character ...)

		// size() ==> 데이터의 갯수
		System.out.println("size  =>" + list1.size());
		System.out.println("list1 =>" + list1);

		// get 으로 데이터 꺼내오기
		System.out.println("1번째 자료 :" + list1.get(0));

		// add 데이터를 끼워 넣기도 같다.
		list1.add(0, "zzz"); // 인덱스로 위치 지정하여 넣음
		System.out.println("list1 => " + list1);

		// 데이터 변경하기(set메서드)
		String temp = (String) list1.set(0, "YYY"); // 바꿀것 인덱스, 바꿀 값
		System.out.println("temp => " + temp);
		System.out.println("list1 =>" + list1);

		// remove 삭제하기도 같다.
		list1.remove(0);
		System.out.println("삭제후:  " + list1);

		list1.remove("bbb");
		System.out.println("bbb 삭제 후 :" + list1);
		// list1.remove(111); 111번째 인덱스를 지우는 것이라고 인식함
		list1.remove(new Integer(111));
		System.out.println("111 삭제 후 " + list1);
		System.out.println("----------------------------------------------------");

		// 제너릭을 지정하여 선언할 수 있다. //String타입만 담겠다고 선언한 것
		List<String> list2 = new ArrayList<String>();
		list2.add("AAA");
		list2.add("BBB");
		list2.add("CCC");
		list2.add("DDD");
		list2.add("EEE");

		for (int i = 0; i < list2.size(); i++) {
			System.out.println(i + ":" + list2.get(i));
		}
		System.out.println("----------------------------------------------------");

		// 향상된 for문 (foreach 문)
		for (String s : list2) {
			System.out.println(s);
		}
		System.out.println("----------------------------------------------------");
		// contains(비교객체); =>리스트에 '비교객체'를 찾아 '비교객체'가 있으면 true, 없으면 false 리턴함
		System.out.println(list2.contains("DDD"));
		System.out.println(list2.contains("ZZZ"));
		System.out.println("----------------------------------------------------");

		// indexOf(비교객체); => 리스트에서 '비교객체'를 찾아 '비교 객체'가 있는 index값을 반환한다
		// 없으면 -1을 반환
		System.out.println("DDD의 index값: " + list2.indexOf("DDD"));
		System.out.println("ZZZ의 index값: " + list2.indexOf("ZZZ"));
		System.out.println("----------------------------------------------------");

		// toArray() => 리스트 안의 데이터들을 배열로 변환하여 반환한다.
		//			       기본적으로 object형 배열로 반환한다.
		Object[] strArr = list2.toArray();
		System.out.println("배열의 개수: " + strArr.length);

		// 리스트의 제너릭 타입에 맞는 자료형의 배열로 변환하는 방법
		// 제너릭타입의 0개짜리 배열을 생성해서 배열변수로 넣어준다.
		// 형식)toArrray(new 제너릭타입[0])
		String[] strArr2 = list2.toArray(new String[0]);
		System.out.println("strArr2의 개수 : " + strArr2.length);

		// 리스트 삭제처리
		//ArrayList는 앞에것이 삭제되면 앞으로 계속 댕겨짐
		//따라서 다지우고 싶다면 뒤에서 부터 지워야함
		for (int i = 0; i < list2.size(); i++) {
			list2.remove(list2.get(i));
		}
		System.out.println(list2.size());
	}
}

<List 정렬>

1.List 정렬에 대해

 - 정렬과 관련된  interface 는 Comparable 과 Comparator 두가지가 있다.

 - 보통 객체 자체에 정렬 기능을 넣기 위해서는 Comparable 을 구현하고

   위의 예제처럼 정렬기준을 별도로 구현하고 싶을떄는 Comparator 를 구현하여 사용하면 된다

 - Comparable 에서는 compareTo() 메서드를 구현해야 하고,

   Comparator 에서는 compare() 메서드를 구현해야 한다.

-정렬은 Collections.sort() 메서드를 이용하여 정렬한다.

package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class T03ListSortTest {
	/*
	 * 정렬과 관련된 interface 는 Comparable과 Comparator 두가지가 있다.
	 * -보통 객체 자체에 정렬 기능을 넣기 위해서는 Comparable을 구현하고 
	 * -정렬 기준을 별도로 구현하고 싶은 경우에는 Comparator를 구현하여 사용한다.
	 */
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("일지매");
		list.add("홍길동");
		list.add("성춘향");
		list.add("변학도");
		list.add("이순신");
		System.out.println("정렬 전 :" + list);

		/*
		 * 정렬은 Collections.sort()메서드를 이용하여 정렬한다. 
		 * 정렬은 기본적으로 '오름차순정렬'을 수행한다.
		 * 정렬방식을 변경하려면 정렬방식을 결정하는 객체를 만들어서
		 * Collections.sort() 메서드의 인수로 넘겨주면 된다.
		 */
		Collections.sort(list);//SORT정렬 기능 //collection은 인터페이스 
		System.out.println("정렬 후 :" + list);
		
		Collections.shuffle(list); //섞기
		System.out.println("섞기 후:" + list);
		
		Collections.sort(list,new Desc());
		System.out.println("외부정렬자로 정렬 후:" + list);
	}
}
/*
 *   정렬방식을 결정하는  class는 Comparator 라는 인터페이스를 구현해야 한다.
 *   이 comparator인터페이스의 compare()라는 메서드를 재정의 하여 구현하면 된다.
 */
class Desc implements Comparator<String>{
/*
 * compare()메서드의 반환값을 결정하는 방법
 *  => 이 메서드가 양수를 반환하면 두값의 순서가 바뀐다.(오름차순이 기본임)
 *  
 *  -오름차순 정렬일 경우..
 *  =>앞의 값이 크면 양수, 같으면 0 앞의 값이 작으면 음수를 반환하도록 한다.
 *  
 *  -String 객체에는 정렬을 위해서  compareTo()메서드가 구성되어 있는데
 *  이 메서드의 반환값은 오름차순에 맞게 반환되도록 구현되어 있다.
 *  (Wrapper 클래스와 Date,File 클래스에도 구현되어 있다)
 *  
 */
	@Override
	public int compare(String str1, String str2) {

		return str1.compareTo(str2) * -1;
	}
	
}
package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class T04ListSortTest {
	public static void main(String[] args) {
		
		List<Member> memList = new ArrayList<Member>();
		memList.add(new Member(1,"홍길동","010-1111-1111"));
		memList.add(new Member(5,"변학도","010-1111-1111"));
		memList.add(new Member(9,"성춘향","010-1111-1111"));
		memList.add(new Member(3,"이순신","010-1111-1111"));
		memList.add(new Member(6,"강감찬","010-1111-1111"));
		memList.add(new Member(2,"일지매","010-1111-1111"));
		
		System.out.println("정렬 전:");
		for(Member mem:memList) {
			System.out.println(mem);
		}
		System.out.println("-------------------------------------------");
		Collections.sort(memList);//정렬하기
		System.out.println("이름의 오름차순으로 정렬 후:");
		for(Member mem:memList) {
			System.out.println(mem);
		}
		System.out.println("-------------------------------------------");
		
		Collections.sort(memList, new SortNumDesc());
		System.out.println("번호의 내림차순 정렬 후:");
		for(Member mem:memList) {
			System.out.println(mem);
		}
		System.out.println("================================================");
		
		
	}
}
/*
 * 정렬 기준의 외부 선언을 위해서는 Comparator 인터페이스를 구현하면 된다.
 * Member 의 번호 (num)의 내림차순으로 정렬하기
 */

class SortNumDesc implements Comparator<Member>{

	@Override
	public int compare(Member mem1, Member mem2) {
		
//		if(mem1.getNum() > mem2.getNum()) {
//			return -1; //내림차순위해서 음수를 리턴
//		}else if (mem1.getNum()== mem2.getNum()) {
//			return 0;
//		}else {
//			return 1;
//		}
		
//		Wrapper 클래스에서 제공하는 메서드를 이용하는 방법  
		return  new Integer (mem1.getNum()).compareTo(mem2.getNum())*-1;
	
	}
	
}



class Member implements Comparable<Member>{

	private int num;      //번호 
	private String name;  //이름
	private String tel;   //전화번호

	public Member(int num, String name, String tel) {
		super();
		this.num = num;
		this.name = name;
		this.tel = tel;
	}



	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}



	@Override
	public String toString() {
		return "Member [num=" + num + ", name=" + name + ", tel=" + tel + "]";
	}

/*
 *  회원이름을 기준으로 오름차순 정렬이 될 수 있도록 작성하기
 */

	@Override
	public int compareTo(Member mem) {
		// TODO Auto-generated method stub
		return this.getName().compareTo(mem.getName());
	}
	
}

<Stack & Queue>

Stack => First in Last out   

               후입선출(LIFO)구조        ex)(웹브라우저 (뒤로가기), eclips 에러 보고)

 <stack 명령 >
 1) 자료 입력 : push(저장할 값)
 2) 자료 출력 : pop() => 자료를 꺼내온 후 꺼내온 자료를 stack에서 삭제한다.

 

Queue => First in First out

                선입선출(FIFO)구조

<Queue의 명령>
 1) 자료입력 : offer(저장할 값) 
 2) 자료출력 : poll() => 자료를 Queue에서 꺼내온 후 꺼내온 자료를 Queue에서 삭제한다.

package kr.or.ddit.basic;

import java.util.LinkedList;

public class T02StackQueueTest {
	public static void main(String[] args) {
		// Stack => 후입선출(LIFO)구조
		// Queue => 선입선출(FIFO)구조

		// Stack 과 Queue는 LinkedList를 이용하여 사용할 수 있다.
		LinkedList<String> stack = new LinkedList<String>();
		//List list = new LinkedList(); 도 가능

		/*
		 * stack 명령 
		 * 1) 자료 입력 : push(저장할 값)
		 * 2) 자료 출력 : pop() => 자료를 꺼내온 후 꺼내온 자료를 stack에서 삭제한다.
		 */
		stack.push("홍길동");
		stack.push("일지매");
		stack.push("변학도");
		stack.push("강감찬");
		System.out.println("현재 stack값들: " + stack);

		String data = stack.pop();
		System.out.println("꺼내온 자료: " + data); //마지막에 넣은 것이 나옴 
		System.out.println("꺼내온 자료: " + stack.pop());
		System.out.println("현재 stack값들 :" + stack);

		stack.push("성춘향");
		System.out.println("현재 stack값들: " + stack);
		System.out.println("꺼내온 자료: " + stack.pop()); //마지막에 넣은 것이 나옴
		System.out.println("============================================");
		System.out.println();

		LinkedList<String> queue = new LinkedList<String>();
		/*
		 * Queue의 명령 
		 * 1) 자료입력 : offer(저장할 값) 
		 * 2) 자료출력 : poll() => 자료를 Queue에서 꺼내온 후 꺼내온 자료를 Queue에서 삭제한다.
		 */
		queue.offer("홍길동");
		queue.offer("일지매");
		queue.offer("변학도");
		queue.offer("강감찬");

		System.out.println("현재 queue의 값: " + queue);

		String temp = queue.poll();
		System.out.println("꺼내온 자료: " + temp); //가장 먼저 넣은 것
		System.out.println("꺼내온 자료: " + queue.poll()); //2번째로 넣은 것
		System.out.println("현재 queue의 값 : " + queue); //2개를 꺼내 2개 남음

		if (queue.offer("성춘향")) {
			System.out.println("신규 등록 자료: 성춘향");
		}
		System.out.println("현재 queue의 값 :" + queue);  
		System.out.println("꺼내온 자료 : " + queue.poll()); //가장 먼저 넣은것
	}
}

*LinkedList도 list 타입의 컬렉션

'고급JAVA' 카테고리의 다른 글

Hashset  (0) 2022.07.23
Comparable / Comparator  (0) 2022.07.23
Stack & Queue  (0) 2022.07.23
ArrayList  (0) 2022.07.23
고급자바 D2  (0) 2022.07.22