Day 39 (23.02.20)

Jane·2023년 2월 20일
0

IT 수업 정리

목록 보기
46/124

1. Collection Framework

  • 데이터를 쉽게 다룰 수 있도록 만든 일종의 라이브러리. 자료구조

  • 종류

    • Collection < E >
    • Set < E >, List < E >, Queue < E >는 Collection < E >를 extends한다.
    • Map < K, V >

2. List < E >

  • ArrayList < E > : 배열 기반
  • LinkedList < E > : 리스트 기반

2-1. ArrayList 예시

  • 배열을 기반으로 만들어진 리스트
  • 배열은 길이를 정하고 들어가야 한다. 함부로 늘렸다 줄였다 할 수 없다.
  • 길이를 늘리는 과정에서 시간이 걸린다.
import java.util.*;

class JavaPractice {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
        // 다형성 적용 (List가 ArrayList보다 큰 개체의 개념)

		// List.class >> interface List<E> >> boolean add(E e); (요소 추가)
		list.add("Toy");
		list.add("Box");
		list.add("Robot");

		// List.class >> interface List<E> >> int size(); (list의 크기)
        // List.class >> interface List<E> >> E get(int index); (요소 가져오기)
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + '\t');
		}
		System.out.println();
		
        // List.class >> interface List<E> >> E remove(int index); (요소 제거)
		list.remove(0);
		
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + '\t');
		}
	}
}

[Console]

  • 배열과 ArrayList의 차이
일반적인 배열ArrayList
객체를 생성할 때 크기를 정해줘야 한다.배열의 크기를 정하지 않아도 된다.
배열의 범위를 초과하면 새로운 범위의 배열을 만들어줘야 한다.배열의 추가와 삭제가 쉽다.
오류가 생길 수 있다.배열의 범위를 초과하게 되면 클래스 안에서 객체를 생성하는 코드를 실행시킨다.

2-2. LinkedList 예시

  • 객체의 값과 다음 값을 참조하는 주소가 있는 리스트
import java.util.*;

class JavaPractice {
	public static void main(String[] args) {
		List<String> list = new LinkedList<>();
        /*
        2-1. ArrayList 코드에서
        new ArrayList<>(); >> new LinkedList<>(); 수정
        */

		list.add("Toy");
		list.add("Box");
		list.add("Robot");

		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + '\t');
		}
		System.out.println();
		
		list.remove(0);
		
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + '\t');
		}
	}
}

2-3. ArrayList와 LinkedList의 차이

ArrayListLinkedList
리스트의 사용일반 배열을 대신한다. 연속된 공간을 이용한다.추가/삭제가 많은 작업이 있을 때 쓴다.
배열 요소를 추가할 때배열이 가득 차면 다른 배열을 새로 생성해서 복사한다 (시간이 많이 걸린다)객체를 하나 생성하고 주소를 달아주면 된다 (개수 제한 X)
배열 요소를 지울 때이미 잡아놓은 요소의 크기가 있다. 새로 배열을 생성하거나, 인덱스를 당겨와야한다.요소 하나를 지우고 링크를 변경하면 된다
배열 요소를 검색할 때참조가 빠르다. 주소를 빠르게 찾아갈 수 있다. 검색을 더 빠르게 할 수 있다.연결된 주소를 하나씩 찾아가야 하므로, 번거로움을 느낄 수 있다.

2-4. LinkedList의 구조 만들어보기 (테스트용)

import java.util.*;

class TestLinkedList {
	int num; // 값
	TestLinkedList linked; // 참조 주소
}

class JavaPractice {
	public static void main(String[] args) {
		TestLinkedList link1 = new TestLinkedList();
		link1.num = 1;
		TestLinkedList link2 = new TestLinkedList();
		link2.num = 2;
		link1.linked = link2; // link1의 linked = link2의 주소값

	}
}

3. 다양한 반복문과 iterator

3-1. 반복문으로 list 출력하기

  • index를 사용한 코드
for (int i = 0; i < list.size(); i++) {
	System.out.print(list.get(i) + '\t');
}
  • enhanced for문을 사용한 코드
for(String s : list) {
	System.out.print(s + '\t');
}
  • iterator를 사용한 코드
for(Iterator<String> itr = list.iterator(); itr.hasNext();) {
	System.out.print(itr.next() + '\t');
}

3-2. iterator (반복자)

  • list 안에는 iterator가 있다
    • List.class ⨠ interface List< E > ⨠ Iterator < E > iterator(),
      ListIterator < E > listIterator(), Spliterator < E > spliterator()
  • iterator로 다음 요소가 있는지 묻는다 (hasNext())
    다음 요소가 있으면 return true

4. 예제

4-1. 입력받은 수로 만든 List에서 제일 큰 수

import java.util.*;

class JavaPractice {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		List<Integer> list = new ArrayList<>(); // 정수를 받을 리스트
		System.out.print("숫자 입력 : ");

		try {
			while (true) {

				int num = sc.nextInt();
				if (num < -1) { // 음의 정수를 입력했을 때
					System.out.println("잘못된 입력입니다. 양의 정수를 입력하세요.");
					continue;
				} else if (num == -1) { // -1이면 break;
					System.out.println("리스트 입력 완료");
					break;
				} else {
					list.add(num);

				}

			}
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(0);
		}

		System.out.print("리스트 : ");
		for (int i : list) {
			System.out.print(i);
			System.out.print(" ");
		}

		int max = 0;

		for (int i = 0; i < list.size(); i++) {
			if (list.get(i) > max) {
				max = list.get(i);
			}
		}

		System.out.println();
		System.out.println("배열 중의 큰 수 : " + max);
	}

}

[Console]
숫자 입력 : 47
숫자 입력 : 28
숫자 입력 : 63
숫자 입력 : 90
숫자 입력 : -1
리스트 입력 완료
리스트 : 47 28 63 90
배열 중의 큰 수 : 90

4-2. List에 학점을 입력받고 평균 구하기

import java.util.*;

class JavaTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		List<String> gradelist = new ArrayList<>(); // 학점을 담을 리스트
		System.out.print("학점 : ");
		for (int i = 1; i <= 6; i++) {// 6번 반복 입력해서 학점 입력하기

			String grade = sc.next();
			if (grade.trim().toUpperCase().equals("A") || grade.trim().toUpperCase().equals("B")
					|| grade.trim().toUpperCase().equals("C") || grade.trim().toUpperCase().equals("D")
					|| grade.trim().toUpperCase().equals("F")) { // grade가 A, B, C, D, F일때만 OK
				gradelist.add(grade.trim().toUpperCase());
			} else {
				System.out.println(i + "번째 : 입력 오류");
				i--;
			}
		}

		/*
		 System.out.print("리스트 : ");
         for (int i = 0; i < 6; i++) {
		 	System.out.print(gradelist.get(i));
         }
         System.out.println();
		 */


		double sum = 0.0;
		for (int i = 0; i < gradelist.size(); i++) {
			if (gradelist.get(i).equals("A")) {
				sum += 4.0;
			} else if (gradelist.get(i).equals("B")) {
				sum += 3.0;
			} else if (gradelist.get(i).equals("C")) {
				sum += 2.0;
			} else if (gradelist.get(i).equals("D")) {
				sum += 1.0;
			} else {
				sum += 0.0;
			}
		}

		System.out.println("평균 : " + (sum / 6));

	}

}

[Console]
학점 : a c a b f d
평균 : 2.3333333333333335

profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글