TIL15일차

Moon-Tree·2023년 1월 17일
1

◎ JAVA

List vs set

  • Set은 데이터 저장 시 오름차순 정렬 처리가 이루어진다. (순서가 무시)

  • List는 작성 순서대로 저장된다. (순서가 보장)

    	//java5+ 제네릭<>를 안붙이면 object로 간주하여 오류가 뜬다.
    	Set<String> a = new TreeSet<String>();
    	List<String> b = new ArrayList<String>();

◆ List

  • List<타입> a = new ArrayList<타입>();
  • (주의) 형태는 무조건 클래스여야 한다. 원시형은 Wrapper 클래스로 대체하여 설정한다.
  • List는 중간 삽입이 가능하다. (!= 배열은 해당 n번째 데이터가 삭제되고 삽입된다.)
  • 자바에서 자주 사용하는 인터페이스 중에 하나이다.
  • 데이터가 고정이라면 간편 생성 명령으로 리스트 생성이 가능하다.
  • 단, 이 방식으로 생성된 리스트는 불변(immutable)이다.

List 예시 1)

public class Test02 {
	public static void main(String[] args) {
		// 선형구조 : 시작과 끝이 존재하는 구조 (ArrayList, LinkedList)
		List<String> a = new ArrayList<String>();
		// 데이터가 시도때도 없이 변할 때 좋다.
		// 데이터의 거리가 다소 멀기 때문에 속도가 느리다.
		List<String> b = new LinkedList<String>();
	
		//데이터 추가
		a.add("마리오");
		a.add("루이지");
		a.add("쿠파");
	
		System.out.println(a);
	
		b.add("마리오");
		b.add("루이지");
		b.add("쿠파");
	
		System.out.println(b);
	
		//포함 검사
		System.out.println(a.contains("피카츄"));
		System.out.println(a.contains("마리오"));
	
		//데이터 갯수 검사
		System.out.println(a.size());
		System.out.println(b.size());
	
		//위치 검사
		System.out.println(a.indexOf("피카츄"));
		System.out.println(a.indexOf("루이지"));
	
		//데이터 삭제
		a.remove("마리오"); //마리오 데이터와 일치하는 항목을 삭제(나머지가 앞으로 이동)
		b.remove(0); //0번 인덱스에 존재하는 항목을 삭제(나머지가 앞으로 이동)
	
		System.out.println(a);
		System.out.println(b);	
	}
}

List 예시 2)

◆ foreach 구문 (확장 for)

  • 어차피 전체를 처리할 생각이라면 인덱스를 생략하고 추출한 값을 담을 변수만 정의

  • Iterable을 상속 받은 클래스라면 모두 사용 가능한

  • 전체를 출력할 때만 가능하다는 단점이 존재한다.

    	public class Test04 {
    		public static void main(String[] args) {
    			List<Integer> list = new ArrayList<>();
    			list.add(100); //int ----> Integer (자동포장, auto-boxing)
    			list.add(200);
    			list.add(300);
    			list.add(400);
    			list.add(500);
    			list.add(3, 600); //중간 삽입
    	
    			for(int n : list) {
    				System.out.println(n);
    			}
    			System.out.println();
    	
    			// .get(인덱스 번호)인덱스 번호의 데이터를 가져오기
    			for(int i = 0; i < list.size(); i++) { //Integer ----> int (자동포장해제, auto-unboxing)
    				System.out.println(list.get(i));
    			}	
    		}
    	}

List 예시 3)

간단한 List 생성 방법

  • 데이터가 고정이라면 간편 생성 명령으로 리스트 생성이 가능하다.

  • 단, 이 방식으로 생성된 리스트는 불변(immutable)이다.

    	public class Test08 {
    		public static void main(String[] args) {
    			//생성, 가변
    			//List<Integer> list = new ArrayList<>();
    	
    			//명령, 불변(Java 8+)
    			//List<Integer> list = Arrays.asList(10, 20, 30, 40, 50);
    	
    			//불변(Java 9+)
    			//불변 : 주어진 데이터를 사용할 경우, list.add() 사용 불가
    			List<Integer> list = List.of(10, 20, 30, 40, 50);
    			//list.add(60); //error
    	
    			for(int n : list) {
    				System.out.println(n);
    			}
    		}
    	}

◆ Set

  • 비선형구조 : 시작이나 끝이 명확하지 않은 구조 (TreeSet, HashSet)

  • 정해진 방식에 의해 데이터를 저장하며, 중복된 데이터가 없는 저장소이다.

  • 주 목적은 전체를 빠르게 조회하는 것이다.

  • 조회의 성능이 선형구조(ArrayList, LinkedList)의 비해 훨씬 빠르다.

  • TreeSet은 탐색의 특화 되어 있고, 데이터를 순서대로 출력하고 싶을 때 사용한다.

  • Hashset은 TreeSet보다 속도가 빠르다, 데이터의 순서가 상관 없을 때 사용한다.

    	public class Test04 {
    		public static void main(String[] args) {
    			//Set
    			//중복 제거된 데이터가 출력되기 때문에 List보다 집합 연산에서 훨씬 편리하다.
    	
    			//데이터 준비
    			Set<String> galaxy = Set.of("통화" ,"문자", "게임", "영상통화", "삼성페이");
    			Set<String> iphone = Set.of("통화", "문자", "게임", "아이튠즈", "시리");
    	
    			//합집합 : galaxy ∪ iphone - union
    			Set<String> union = new TreeSet<>();
    			union.addAll(galaxy);
    			union.addAll(iphone);
    			System.out.println(union);
    	
    			//교집합 - 두 휴대폰이 가진 공통 기능 : galaxy ∩ iphone - intersection
    			Set<String> intersect = new TreeSet<>(galaxy);
    			intersect.retainAll(iphone); // 위에 new TreeSet<>(galaxy); 코드와 같은 것
    			System.out.println(intersect);
    	
    			//차집합 - 어느 한 쪽 휴대폰만 가진 기능 : minus
    			//galaxy - iphone 또는 iphone - galaxy
    			Set<String> minus = new TreeSet<>(galaxy);
    			minus.removeAll(iphone);
    			System.out.println(minus);
    		}
    	}

◆ Stack

  • Stack vs Queue 비교 해서 사용한다.
  • 사용법이 정해져 있는 Collection 이다.
  • Last In First Out(LIFO, 후입선출): 마지막으로 저장된 데이터가 가장 먼저 꺼내진다.
  • 이미 구현된 클래스가 제공
  • ArrayList나 LinkedList로 구현할 수 있다.
  • Stack은 이력 관리용으로 사용하기에 적합하다.
  • Stack은 (.add가 아니라) .push를 사용하여 데이터를 추가한다.
  • 인터페이스가 없다.

◆ Queue

  • 사용법이 정해져 있는 Collection 이다.
  • First In First Out(FIFO, 선입선출): 첫 번째로 저장된 데이터가 먼저 꺼내진다.
  • 스택과 마찬가지로 java.util.Queue에 구현되어 있는 라이브러리를 사용한다.
  • Queue는 LinkedList를 활용하여 생성한다.
  • Queue와 LinkedList가 다 import되어 있어야함.
  • 프로그램 내부에서 주로 사용한다.
  • 줄지어 출력할 때, 대부분의 입/출력은 Queue를 사용한다.
  • 인터페이스가 있다.
profile
Backend Developer

0개의 댓글