도찐개찐
[JAVA] 자료구조(Data Structure), 컬랙션(Collection) 본문
자료구조(Data Structure)란?
- 자료를 구조적으로 정리하는 것을 자료구조 (Data Structure)라 한다.
- 구조적이란 자료를 효율적으로 사용할 수 있게 만드는 것
- 저장성이 불필요한 데이터를 DB에 저장하지 않고 메모리를 활용하여 일시적으로 활용하고 버리는 목적의 구조
컬렉션(Collection) 프레임워크
- java.util.* 패키지의 자바 컬렉션 프레임워크 * (JCF)에서 자료구조 방법 제공
- 배열의 정적인 한계를 극복 하기 위해서 사용
- Set 계열, List계열, Map계열
- Collection인터페이스를 구현하는 클래스
- 객체를 저장하고 핸들하는 작업을 수행
- 동적으로 필요할 때 메모리를 확장할 수 있는 장점
- 프로그램 실행시의 소형 데이터베이스 기능
- 대표적으로, Vector와 HashTable가 있음
컬렉션 프레임워크 주요 메소드(Method)
boolean add(E e) | 해당 컬렉션(collection)에 전달된 요소를 추가함. (선택적 기능) |
void clear() | 해당 컬렉션의 모든 요소를 제거함. (선택적 기능) |
boolean contains(Object o) | 해당 컬렉션이 전달된 객체를 포함하고 있는지를 확인함. |
boolean equals(Object o) | 해당 컬렉션과 전달된 객체가 같은지를 확인함. |
boolean isEmpty() | 해당 컬렉션이 비어있는지를 확인함. |
Iterator<E> iterator() | 해당 컬렉션의 반복자(iterator)를 반환함. |
boolean remove(Object o) | 해당 컬렉션에서 전달된 객체를 제거함. (선택적 기능) |
int size() | 해당 컬렉션의 요소의 총 개수를 반환함. |
Object[] toArray() | 해당 컬렉션의 모든 요소를 Object 타입의 배열로 반환함. |
- Set : 순서가 없고, 중복할 수 없는 데이터 집합 구조
- List : 꼬리를 물고 일렬로 나열하는 것과 같은 구조, 순서가 있고, 중복 가능 한 구조
- Map : 키와 값으로 대상을 찾음. 키는 중복 될 수 없고 값은 중복 될 수 있음.
Set 계열
- 순서가 없고 중복이 허용되지 않는다.
- Set 계열인 HashSet의 객체를 생성한다.
- Set 계열은 인터페이스 Set를 구현한 클래스
- add, clear, size, remove 메소드등이 구현 되어 있다.
- Object타입으로 리턴 < 다형성 처리하기 위해 사용
- toArray 오브젝트 배열로 리턴
- 배열과 마찬가지로 length와 동일 개념의 size() 메소드 사용
import java.util.HashSet;
import java.util.Set;
import java.util.HashSet;
import java.util.Set;
public class SetLotto {
public static void main(String[] args) {
// 로또 번호를 생성하여 출력하시오.
// 1~45까지의 숫자를 6개가 중복없이 만들어 출력하는 코드.
Set<Integer> ln = new HashSet<Integer>();
System.out.println("test");
while (ln.size() <= 6) {
ln.add(SetLotto.randomSet());
}
//System.out.println(ln);
}
public static int randomSet() {
int rand = (int)(Math.random() * 45) + 1;
System.out.println(rand);
return rand;
}
}
// 결과(Set 데이터 값 전체 랜덤)
// Set 계열의 특성인 저장 위치를 지정하고 있지 않으므로
// randomSet() 메소드내 출력된 값 순서와 HashSet에 저장 된 데이터를 출력한 순서는 다를 수 있다.
// 10 / 35 / 26 / 15 / 23 / 1 / 1 / 27 / [1, 35, 23, 10, 26, 27, 15]
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Set01 {
public static void main(String[] args) {
//HashSet, TreeSet클래스
//HashSet = 해쉬 테이블에 원소를 저장하기 때문에 성능면에서 가장 우수, 원소들의 순서가 일정하지 않은 담점이 있다.
//TreeSet = red-black tree에 원소를 저장한다. 따라서 값에 따라서 순서가 결정되며 하지만 HashSet보다는 느리다.
Set<Integer> numbers = new HashSet<Integer>();
numbers.add(2);
numbers.add(4);
numbers.add(6);
numbers.add(8);
numbers.add(10);
//2,4,6,8,10
// 전체를 꺼내는 방법!
// Iterator라는 객체로 꺼냄.
Iterator<Integer> it = numbers.iterator();
//System.out.println(numbers);
//it.hasNext() 꺼낼것이 있는가?
while (it.hasNext()) {
// it.next() 다음 순서에 있는 아이를 반환.
System.out.println(it.next());
}
// 1~27 내 3의 배수를 Set number3에 담으시오.
Set<Integer> number3 = new HashSet<Integer>();
for (int i = 1; i <= 27; i++) {
if (i % 3 == 0) {
number3.add(i);
}
}
System.out.println(number3);
for (Integer value : number3) {
System.out.print(" " + value);
}
for (int i = 1; i <= 27; i++) {
if (i % 2 == 0) {
numbers.add(i);
}
}
// 합집합
Set<Integer> hap = new HashSet<Integer>(numbers);
hap.addAll(number3);
System.out.println("\n합집합 : ");
for (int num : hap) {
System.out.print(num + " ");
}
// 차집합
Set<Integer> cha = new HashSet<Integer>(numbers);
cha.removeAll(number3);
System.out.println("\n교집합 : ");
for (int num : cha) {
System.out.print(num + " ");
}
// 교집합
Set<Integer> kyo = new HashSet<Integer>(numbers);
kyo.retainAll(number3);
System.out.println("\n교집합 : ");
for (int num : kyo) {
System.out.print(num + " ");
}
/*
it = number3.iterator();
//it.hasNext() 꺼낼것이 있는가?
while (it.hasNext()) {
// it.next() 다음 순서에 있는 아이를 반환.
System.out.println(it.next());
}
*/
}
}
List 계열
- 순서가 있고 중복이 되는 List 계열
- 인터페이스 List를 구현한 클래스
import java.util.ArrayList;
import java.util.LinkedList;
public class List01 {
public static void main(String[] args) {
//ArrayList
//배열과 같음.
//LinkedList
//노드와 링크
ArrayList<String> al = new ArrayList<String>();
LinkedList<String> ll = new LinkedList<String>();
// 취미를 리스트에 추가
al.add("게임");
ll.add("게임");
al.add("운동");
ll.add("운동");
al.add("독서");
ll.add("독서");
System.out.println("ArrayList : " + al);
System.out.println("LinkedList : " + ll);
//index 2번째 값은?
System.out.println("ArrayList 2 : " + al.get(2));
System.out.println("LinkedList 2 : " + ll.get(2));
//ArrayList와 LinkedList의 차이
// 사용목적이 다름.
//LinkedList 구조는 값이 들어 가능 구조와 다음배열의 주소값이 들어가있는 구조로 되어 있음. : 노드 구조
// LinkedList는 배열내 사이에 추가/삭제가 주로 이루어지는 경우 효율성이 높음
// ArrayList는 단순 조회 목적 효율성이 높음
}
}
/*
결과 :
ArrayList : [게임, 운동, 독서]
LinkedList : [게임, 운동, 독서]
ArrayList 2 : 독서
LinkedList 2 : 독서
*/
Map 계열
- Key, Value를 한쌍으로 묶음
- Key는 Set계열과 동일한 개념으로 중복된 값을 가질 수 없다(개인 주민번호와 비슷한 개념으로 특정한 위치의 데이터를 찾기 위해 사용)
- Value List계열과 같이 데이터 중복 허용이 가능 하다.
- Collection 을 상속하지 않음으로 별도의 메소드를 가지고 있음
import java.util.HashMap;
public class Map01 {
public static void main(String[] args) {
//map 사전 구조와 같은 형태
// key:value 이루어진 구조
// key는 중복을 허용하지 않는다. //따라서 Set로 받아 볼수 있음.
Map<Integer, String> foodMap = new HashMap<Integer, String>();
// 짜장면, 짬뽕, 볶음밥
foodMap.put(0, "짜장면");
foodMap.put(1, "짬뽕");
foodMap.put(2, "볶음밥");
//System.out.println(foodMap.get(2));
for (int i = 0; i < foodMap.size(); i++) {
System.out.println(foodMap.get(i));
}
//탕수육을 키가 5인 번호에 넣자
foodMap.put(5, "탕수육");
// 키, 밸류 쌍으로 꺼내는 방법과 키만 꺼내는 방법이 있다.
Set<Integer> keys = foodMap.keySet();
for (int k : keys) {
System.out.println(foodMap.get(k));
}
//키가 같을때 value를 다른 값으로 넣는 다면?
System.out.println("-----------------------");
foodMap.put(0, "멘보샤");
System.out.println(foodMap);
//쌍으로 꺼내는 방법!!
//자료형 entry라는 자료형으로 꺼냄 키,벨류형태
Set<Entry<Integer, String>> entrySet = foodMap.entrySet();
for (Entry<Integer, String> en : entrySet) {
System.out.printf("키 : %d / 값 : %s\n", en.getKey(), en.getValue());
}
}
}
/*
결과 :
짜장면
짬뽕
볶음밥
짜장면
짬뽕
볶음밥
탕수육
-----------------------
{0=멘보샤, 1=짬뽕, 2=볶음밥, 5=탕수육}
키 : 0 / 값 : 멘보샤
키 : 1 / 값 : 짬뽕
키 : 2 / 값 : 볶음밥
키 : 5 / 값 : 탕수육
*/
728x90
'JAVA' 카테고리의 다른 글
[JAVA] Iterator (0) | 2022.07.20 |
---|---|
[JAVA] 문서 주석(javadoc) 사용 법 (0) | 2022.07.20 |
[JAVA] 서블릿 처리구조 (0) | 2022.07.08 |
[JAVA] 서블릿 컨테이너(Servlet Container) (0) | 2022.07.08 |
[JAVA] 서블릿(Servlet) (0) | 2022.07.08 |
Comments