도찐개찐

[JAVA] 자료구조(Data Structure), 컬랙션(Collection) 본문

JAVA

[JAVA] 자료구조(Data Structure), 컬랙션(Collection)

도개진 2022. 7. 20. 10:50

자료구조(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 / 값 : 탕수육
*/

컬렉션 보강 내용

 

[JAVA] 컬렉션(Collection) 프레임워크

자바에서 자료구조를 편하게 관리 및 조작하기 위해 제공해주는 인터페이스 구조 (- : 연관관계) Collection은 value를 나열하며, Map은 key-value 쌍으로 이루어져 있습니다. Collection과 Map 모두 참조

dev-truly.tistory.com

 

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