본문 바로가기

Programming Language/JAVA

[JAVA] 컬렉션프레임워크 list & set(Arraylist,Stack,Linkedlist,Hashset,Treeset)

 

 

 컬렉션 프레임웍 (Collection Framework)
: 데이터 군을 저장하는 클래스들을 표준화한 설계이다.

 Collection
- 다수의 데이터 & 데이터 그룹
- 무한한 데이터의 집합 

 

프레임 웤
- 디자인 패턴
- 표준화된 프로그래밍 방식

컬렉션 프레임웍의 핵심 인터페이스
- List
- Set
- Map

 

 

 

 

 

 

 


 

 

 

 

 

 List
- 순서가 있는 데이터의 집합
- 데이터의 중복을 허용한다.

 구현 클래스
1. ArrayList
2. LinkedList
3. Stack

 

 

 

package test;

import java.util.ArrayList;

public class Test {
	public static void main(String[] args) {
		ArrayList arr = new ArrayList();
		arr.add("123");
		arr.add("456");
                arr.add("789");
		System.out.println(arr.get(0));
		System.out.println(arr.get(1));
                System.out.println(arr.get(2));
                System.out.println(arr.remove("789"));
                System.out.println("개수: "+arr.size());
                arr.clear();
                System.out.println(arr.contains("123"));
	}
}

* Arraylist 설명 

 

arraylist라는 클래스타입을 사용하기위해 import를 우선적으로 해줍니다! ( 단축키 : shift + ctrl +o )
arr 객체에 담고, 객체안에있는 add메소드로 순서대로 String타입으로 ""안에 적어줍니다.
그렇게되면 배열과 같이 0인자부터 쭉 순서대로 데이터를 담아냅니다.
담아낸 데이터를 출력하기위해서는 get메소드를 사용해줍니다.
remove는 arr로 담아낸 데이터중 789가 들어있는 데이터를 지워주는 메소드입니다.
size메소드는 몇번의 인자까지 담아냈는지 알아낼수있습니다.
(현재 789가 담겨있는 데이터는 삭제했으므로, 2개가 출력됩니다.)
clear메소드는 담아낸 데이터를 모두 지워주는 메소드입니다.
contains메소드는 ""안에 들어있는 데이터가 있는지 확인여부를 boolean타입으로 출력해줍니다.
현재 "123"을 add를 통해 추가했지만, clear메소드를 통해 지웠기때문에 콘솔창에는 false가 뜹니다.

 

 

 

 

import java.util.ArrayList;
import java.util.Scanner;

public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		ArrayList arr = new ArrayList();
		int num;
		String addNum,printNum;
		System.out.print("만들 공간의 개수 입력 : ");
		num = sc.nextInt();
		for(int i=0;i<num;i++) {
			System.out.print("추가할 수 입력 : ");
			arr.add(sc.next());
			/*addNum = sc.next();
			arr.add(addNum);*/
		}
		System.out.println("---저장된 값 출력!! ---");
		for(int i=0;i<arr.size();i++) {
			printNum = (String) arr.get(i);
			System.out.println(printNum);
		}
	}

}

 

* Arraylist 설명
arraylist를 통해 arr 객체를 생성해줍니다. 또한, scanner데이터 타입의 sc객체도 생성해줍니다.
num은 만들공간을 사용자가 직접 몇개까지 데이터를 만들지 입력받아 저장할 변수를 선언해주고,
addNum,printNum은 String타입으로 사용자가 갯수를 입력한것을 그만큼의 개수만큼 데이터를 저장해주
고, 출력해주기위해 사용할 변수입니다.
예를 들어 첫번째 입력에 3을 입력했다면 arr(0), arr(1), arr(2)가 생성됩니다.
for문을 통해 0인자부터 추가할 수 입력을 문장형태(String)으로 입력을 해주고 
1과 2까지 모두 입력해줍니다. (/**/은 주석으로 달아놨습니다. 그이유는 위에 arr.add(sc.next());와 동일한 역할을 합니다. 코드를 줄이기위해 주석을 해놓았습니다. )
for문을 통해 입력받은 arr데이터를 다시 for문을 통해 0인자부터 printNum변수에 하나씩 저장해서
메시지로 출력해줍니다.

 

 

 

 

 

 

import java.util.ArrayList;
import java.util.Scanner;

public class Test07 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		ArrayList arr = new ArrayList();
		int num;
		arr.add("설탕");	arr.add("소금");
		arr.add("계란"); arr.add("라면");
		System.out.println(arr);
		System.out.print("변경할 위치 입력 : ");
		num = sc.nextInt();
		System.out.print("변경할 값 입력 : ");
		String value = sc.next();
		arr.set(num, value);
		for(int i=0;i<arr.size();i++) {
			System.out.println(i+"번째 : "+arr.get(i));
		}
	}

}

이번에는 직접 변경까지해보겠습니다.
현재 위소스에는 설탕,소금,계란,라면순으로 데이터를 0인자부터3인자까지 저장해놓았습니다.
메시지출력에서 그냥 arr이만할경우, [설탕, 소금, 계란, 라면] <- 이렇게 콘솔창에 출력됩니다.
변경할 위치를 입력하고, 예를 들어 2를 입력하면 변경할 값을 입력하라고 메시지를 출력합니다.
사과를 입력합니다. arr객체에 set이라는 메소드를 호출해서 변경할 숫자(num변수),변경할 값(value)를
넘겨주면 변경이됩니다.
for문을 통해 0인자부터3인자까지 출력을 순서대로해주면 변경된것을 확인하실수 있습니다.

 

 

 

 

 

public class Test08 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		ArrayList food = new ArrayList();
		food.add("설탕");		food.add("소금");
		food.add("계란");		food.add("라면");
		System.out.println(food);
		System.out.print("찾는 값 입력 : ");
		String value = sc.next();
		System.out.println(value+"위치 : "+food.indexOf(value));
	}

}

 

 

 

이 소스도 동일하게 add메소드를 호출해서 저장해줍니다.
찾는 값을 사용자가 입력된 값들중 하나를 입력하면 
예를 들어 소금을 입력하면 indexof메소드를 호출해서 값을 넘겨주면
소금의 해당위치인 1이 출력됩니다.

 

 

 

 

 

 


 

 

 

 

 

 Set
- list와 다르게 데이터 중복이 안되고, 순서 유지를 하지않습니다.

 

 

import java.util.ArrayList;
import java.util.HashSet;

public class Test_HashSet {

	public static void main(String[] args) {
		HashSet hs = new HashSet();
		hs.add("라면");	hs.add("김밥"	);
		hs.add("순대");	hs.add("김밥");
		System.out.println("HashSet : "+hs);
		
		ArrayList arr = new ArrayList();
		arr.add("라면");	arr.add("김밥");
		arr.add("순대");	arr.add("김밥");
		System.out.println("ArrayList : "+arr);
 	}

}

* Hashset 설명
우선, 위소스는 기존 arraylist를 비교해서 소스를 만들어보았습니다.
콘솔 출력되는 내용은 아래와같습니다.
HashSet : [김밥, 순대, 라면]
ArrayList : [라면, 김밥, 순대, 김밥]
hashset은 중복이 되지않고 순서대로입력해도 무작위로 저장됩니다.

 

 

 

import java.util.ArrayList;
import java.util.HashSet;

public class Test {

	public static void main(String[] args) {
		HashSet hs = new HashSet();
		boolean bool;
		bool = hs.add("라면");
		System.out.println(bool);
		bool = hs.add("고길동");
		System.out.println(bool);
		bool = hs.add("현대인");
		System.out.println(bool);
		bool = hs.add("고길동");
		System.out.println(bool);
		System.out.println("HashSet : " + hs);
	}

}

* Hashset 설명

 

 

 

 

hashset데이터타입으로 hs객체를 만들어줍니다.
boolean타입으로 bool변수를 선언해줍니다. (add로 데이터를 저장해준걸 확인해주기위해 변수선언해줍니다.)
순서대로 add메소드를 호출해서 라면,고길동,현대인,고길동을 순서대로 입력해줍니다.
마지막에 고길동을 저장할때는 false가 뜹니다. 이유는 hashset은 중복이 되지않기때문에 저장이 안되는걸
확인할수있습니다. 마지막에 출력은 HashSet : [현대인, 라면, 고길동] <-이렇게 출력됩니다.

 

 

 

 

 

import java.util.ArrayList;
import java.util.HashSet;

public class Test {

	public static void main(String[] args) {
		HashSet hs = new HashSet();
		hs.add("라면");	hs.add("김밥");
		hs.add("순대");	hs.add("김밥");
		System.out.println("HashSet : "+hs);
		System.out.println(hs.remove("김밥"));
		System.out.println("HashSet : "+hs);
	}

}

이번에는 remove메소드를 사용해보겠습니다.
hs객체에서 add메소드를 호출해서 위와같이 추가해줍니다.
그리고 hs를 통해 출력하면 중복된 김밥만 제외하고 3개가 입력됩니다.
그리고 remove를 통해 김밥을 삭제하고 다시 출력하면 하나의 김밥도 삭제가 된걸 확인할수있습니다.
아래는 출력내용입니다.
HashSet : [김밥, 순대, 라면]
true
HashSet : [순대, 라면]

 

 

 

 

 

 

 

 

 

public static void main(String[] args) {
		HashSet hs = new HashSet();
		hs.add("1.대부");
		hs.add("2.반지의 제왕");
		hs.add("3.겨울왕국");
		hs.add("4.다크 나이트");
		hs.add("5.해리포터");
		hs.add("6.공공의적");
		
		
		Iterator it = hs.iterator();
		Scanner input = new Scanner(System.in);
		System.out.print("삭제 할 책 : ");
		String name = input.nextLine();
		while(it.hasNext()) {
			if(name.equals((String)it.next())) {
				System.out.println("삭제완료");
				it.remove();
			}
		}
		it = hs.iterator();
		while(it.hasNext()) {
			name = (String)it.next();
			System.out.println(name);
		}
	}
}

이번에는 입력된값을 삭제하고 확인해보겠습니다.
add메소드를 통해 위처럼 책제목을 저장합니다.
iterator 클래스는 반복자라고도 하며, 순서가있는 Arraylist는 get(0)을 통해 불러오지만,
HashSet은 순서가 없기때문에 iterator을 이용해서 출력해줘야합니다.
Iterator it = hs.iterator(); 
타입(클래스) 이건 메소드(HashSet클래스에있는 메소드를 사용)
이것또한, import를 해줘야합니다.
이제 삭제할 책을 예를 들어 3.겨울왕국을 입력하면 그값을 String타입인 name변수에 담고 name변수와
equals메소드를 통해 하나씩 비교해서 일치하면 삭제완료 메시지를 출력하고 remove메소드를 호출해서 삭제해줍니다. 
it에는 bof(처음)/eof(마지막)이 저장되고 그사이에 사용자가 add를 통해 입력해서 저장된 값을 가지고있습니다. while(it.hasNext()) <- 이부분은 while반복문에 괄호안에 있는 값이 true일경우 반복문 실행됩니다.

 

 

 

it에 저장된 값중에 첫번쨰(bof)말고 다음인 두번째 값(대부)를 가져오라는 의미입니다. true이기에,
it.next(); <- 다음값이 있기때문에 값을 출력해줍니다.(1.대부)
이렇게 순서대로 출력되는것을 확인할수있습니다.