JAVA day 11

lee·2021년 12월 9일
0

JAVA

목록 보기
11/14
post-thumbnail

learning

수업내용 링크

저장소 : GitHub Repositories leeconomy1121/java-study

컬렉션(Collection API)

  • ArrayList vs LinkedList

    ArrayList는 값을 가져오는 get() 메소드를 수행 시 LinkedList보다 훨씬 빠르며 LinkedList는 값을 추가하거나 삭제하는 add(), remove() 메소드 수행 시 ArrayList보다 훨씬 빠르다

    LiknedList는 전 인덱스의 값의 주소와 다음 인덱스 값의 주소만 알고있기 떄문에 추가 삭제시에는 ArrayList보다 휠씬 빠르다 다만 이렇게 하나하나 찾아가는 구조기 때문에 대량검색 시에는 ArrayList보다 훨씬 느리다
  • List Interface(리스트 인터페이스)

    상황에 따라 ArrayList -> LinkedList 바꿔도 이상없음.

    일반적인 순서대로 입력은 ArrayList가 2배 더 빠름
    특정 인덱스 번호에 입력이나 제거는 LikedList가 훨씬 더 빠름

App class

package list_Interface;

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

public class App {

	public static void main(String[] args) {
		// List Interface
		List<Integer> list1 = new ArrayList<>();
		List<Integer> list2 = new LinkedList<>();
		// ArrayList
		list1.add(5);
		list1.add(7);
		list1.add(8);
		
		// LikedList
		list2.add(1);
		list2.add(2);
		list2.add(3);
		
		displayList(list1); // 콘솔에 입력된 리스트 타입 객체의 아이템들을 출력
		System.out.println();
		displayList(list2);
		System.out.println();
		
		List<Integer> list3 = new ArrayList<>();
		list3.addAll(list1);
		list3.addAll(list2);
		displayList(list3);
		
	}
	/**
	 * 입력된 리스트 타입 객체의 아이템들을 출력
	 * @param list
	 */

	private static void displayList(List<Integer> list) {
		// list.forEach(System.out::println);
		for(int i : list) {
			System.out.println(i);
		}
		
	}

}

결과

  • instanceof
    객체의 타입을 판별해서 클래스의 객체가 맞으면 true, 아니면 false

  • equals
    객체가 같은지 비교하는 메소드 같으면 true, 아니면 false

  • remove()
    리스트의 객체를 삭제하는 메소드

  • JAVA Collection
    다수의 데이터를 쉽고 효율적으로 처리할 수있는 방법을 제공하는 클래스의 집합체, 인터페이스를 의미

    💡 Collection은 용도에 따라 크게 List,Set,Map 3가지 인터페이스로 분류되어 사용된다.

    🔎List형
    순서가 있는 데이터의 집합, 데이터 중복 O

    1.LinkedList
    양방향 포인터 구조
    데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 유용
    2.ArrayList
    단방향 포인터 구조
    데이터마다 Index가 존재해 데이터 조회 기능 우수
    3.Vector
    과거 데이터 대용량 처리를 위해 사용, 상대적으로 성능이 좋지 않아 잘 쓰이지 않음

    🔎Set형
    순서가 없는 데이터의 집합, 데이터 중복 X

    1.HashSet
    데이터를 hash table에 저장, Set 중에 가장 성능이 좋음
    2.TreeSet
    저장된 데이터의 값에 따라 정렬, 레드-블랙 트리(Red-Black Tree) 사용

    🔎Map형
    KEY-VALUE, 키와 값의 쌍으로 이루어진 데이터의 집합,
    순서가 없고, 키 중복 X, 데이터 중복 O
    💡 동일한 키를 가진 객체를 저장하려 한다면, 기존 값은 사라지고 새로운 값으로 대치된다.

    1.HashMap
    대표적으로 많이 사용되는 Map collection
    데이터를 Array의 형태로 저장
    KEY로 사용할 객체는 hashCode()와 equals() 메서드를 오버라이드해서 동등 객체가 될 조건을 정의 해야함
    💡 동일 키 조건 : hashCode() 값이 같고, equals() 메서드가 true를 반환
    2.TreeMap
    데이터를 Binary search tree의 형태로 저장
    KEY 값을 기준으로 데이터정렬
    3.HashTable
    HashMap과 내부 구조 동일
    동기화된 메서드로 구성되므로, 스레드에 안전(thread safe)

  • List, Set 차이점
    List : 중복을 허용한다.
        리스트의 아이템 입력, 제거가 중간에 자주 받는다 : LinkedList
        리스트의 아이템 입력, 제거가 끝에 받는다 : ArrayList
    Set : 중복을 허용하지 않는다.
        정렬이 필요하다 : TreeSet, LinkedHashSet
        정렬이 필요하지 않다 : HashSet

  • 예제 1, 예제 2

예제 1
Split_String class

package example;

public class Split_String {

	public static void main(String[] args) {
		// split() 문자열 쪼개서 배열로 리턴
		String text1 = "(CNN)As the world learns more about the Omicron coronavirus variant and Delta continues to cause Covid-19 cases to rise around much of the United States, the need for booster shots becomes clearer than ever -- !even./ beyond the growing data about waning vaccine immunity.";
		String text2 = "[서울경제] 한국핀테크지원센터(이사장 변영한)와 한국핀테크산업협회(협회장 류영준)는 ’21.12.3.(금), 메타버스에서 개최한 2021 핀테크인의 밤에 600여 명이 참여했으며, 변영한 이사장의 개회사를 시작으로 강연과 네트워킹 등이 90분간 진행되었다고 밝혔다.";
		// String[] words = text1.split("[^a-zA-Z]+"); // 정규표현식 영문 철자를 제외한 특수문자 스페이스, 점, 슬래시 같은 것들을 제외하고 단어만 리턴
		String[] words = text2.split("[^가-힣]+");
		for(String w : words) {
			if(w.length() < 3) { // 철자가 2개 이하는 제외
				continue;
			}
			System.out.println(w.toLowerCase()); // 소문자로 변환해서 출력
		}
	}

}

결과

example 2
Book_wordSet class

package example;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.TreeSet;

public class Book_wordSet {

	public static void main(String[] args) {
		// 책 전체 내용을 읽어서 단어로 분리해 리스트에 넣기
		// 이때 리스트는 단어가 중복되지 않는다. 알파벳순으로 저장 => TreeSet
		File gatsby = new File("The Great Gatsby.txt");
		// C:\JAVA\java-study\CH22_CollectionsAPI\The Great Gatsby.txt
		System.out.println(gatsby.exists()); // 파일이 있는지 확인
		
		TreeSet<String> gatsList = loadwords(gatsby);
		
		System.out.println(gatsList.size());
		
		for(String w : gatsList) {
			System.out.println(w);
		}

	}
	/**
	 * 입력된 파일을 읽어서 단어를 저장해 마지막에 TreeSet List로 리턴
	 * @param gatsby
	 * @return
	 */
	private static TreeSet<String> loadwords(File gatsby) {
		TreeSet<String> wordSet = new TreeSet<>();
		// 파일 읽기
		try (BufferedReader reader = new BufferedReader(new FileReader(gatsby))){
			String line = null;
			// 한줄 읽기
			while((line = reader.readLine()) != null) { // 파일의 끝에 더 이상 문자가 없으면 null
				String[] words = line.split("[^a-zA-Z]+");
				// TreeSet에 단어로 분리해서 입력한다. (자동 정렬 및 중복 제거)
				for(String w : words) {
					if(w.length() < 6) {
						continue;
					}
					wordSet.add(w.toLowerCase()); // 소문자로 단어 입력
				}
			}
			
		} catch (FileNotFoundException e) {
			System.out.println("파일을 찾지 못함 : ");
		} catch (IOException e) {
			System.out.println("파일을 읽지 못함 : ");
		}
		
		return wordSet;
	}

}

결과

캡쳐사진으로 결과값이 다 보이진 않지만 실제 창에는 스크롤 내리면 리스트의 단어들이 다 출력됨

profile
Hello, world!

0개의 댓글