JAVA 18일차

MOZZI KIM·2022년 11월 16일
0

JAVA

목록 보기
18/21
post-thumbnail

1. 콜렉션 프레임워크

📌 컬렉션 프레임워크(collection framework)란?
다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합
즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것.

이러한 컬렉션 프레임워크는 자바의 인터페이스(interface)를 사용하여 구현된다.

📌 컬렉션 프레임워크 주요 인터페이스
컬렉션 프레임워크에서는 데이터를 저장하는 자료 구조에 따라 다음과 같은 핵심이 되는 주요 인터페이스를 정의하고 있다.

  1. List 인터페이스

  2. Set 인터페이스

  3. Map 인터페이스

이 중에서 List와 Set 인터페이스는 모두 Collection 인터페이스를 상속받지만, 구조상의 차이로 인해 Map 인터페이스는 별도로 정의된다.

따라서 List 인터페이스와 Set 인터페이스의 공통된 부분을 Collection 인터페이스에서 정의하고 있다.


2. ArrayList 와 LinkedList 의 장단점은?

📌ArrayList
List에서 자주 쓰이는 클래스. 데이터의 저장순서가 있으며, 중복을 허용하는 특징이 있다.
데이터의 담을 양을 정해놓는다고 가정을 했을 때 처리속도가 빠르며, 중간중간 수정을 거치는 과정이 있을때에는 처리속도가 비교적 느리다는 장점이 있다.
만약 데이터의 개수가 100개인 ArrayList가 있다고 가정해서 49번 인덱스의 데이터를 삭제한다고 하면, 50번째 인덱스는 49번째로 이동을하면서 결국 100번째 데이터는 99번째로 이동하는 수고로움이 있는데, 이는 ArrayList의 단점이다.


📌 LinkedList
크기를 변경할수 없다는 불편함과 중간중간 들어가는 수정작업의 처리과정을 해결한게 LinkedList이다.
LinkedList의 각 요소들은 요소 자기 자신과 연결된 다음의 요소와 데이터로 구성되어있다.
중간에 데이터를 추가하거나 삭제할때 그 데이터에 참조만 하면 되는일이기 때문에 불필요한 과정을 거치지 않는다.
하지만 다음의 요소에만 참조가 가능하다는 단점이있어 이전의 요소에 대한 접근이 안된다는 단점이 있지만, doubly linked list를 통해 불편함을 해소했다.
더불어 맨끝의 다음요소는 맨처음의 요소로, 맨처음의 이전은 맨끝의 요소로 연결해주는 doubly circular linked list가 있다.

📌 결론

  • 중간에 수정작업(추가 및 삭제)가 발생할 경우에는 LinkedList가 유리합니다.

  • 마지막데이터부터 순서대로 수정작업이 발생하거나 그럴일이 없다면 ArrayList가 더 용이합니다.


3. Scanner 클래스로 -1이 입력될 때까지 양의 정수를 입력 받아 저장(List)하고 검색하여 가장 큰 수를 출력하는 프로그램을 작성하라.


4. 로또 프로그램을 작성하시오.(Set 으로)

import java.util.*;

public class LottoGeneric {

	public static void main(String[] args) {
		Set<Integer> lottoSet = new HashSet<>();
		
		while(lottoSet.size() != 6) { 
        //size가 6이 아니면 실행 > 6이 될때까지  
			int num = (int)(Math.random() * 46 + 1);
			lottoSet.add(num);
		}
		for (int num : lottoSet) {
			System.out.println(num );
		}

	}

}

5. Set에 대하여 설명하시오.

📌Set
Set은 List와는 다르게 객체(데이터)를 중복해서 저장할 수 없다.
또한 저장된 객체(데이터)를 인덱스로 관리하지 않기 때문에 저장 순서가 보장되지 않는다.
수학의 집합과 비슷한 내용이다.
Set 컬렉션을 구현하는 대표적인 클래스들은 HashSet, TreeSet, LinkedHashSet 등이 있다. Set 컬렉션을 구현하는 클래스들이 공통적으로 사용하는 주요 메소드는 add, iterator, size, remove, clear 등이 있다.

Set은 인덱스로 객체를 관리하지 않기 때문에 데이터를 검색하기 위해서는 iterator() 메서드로 Iterator(반복자)를 생성하고 데이터를 가져와야 한다.


6. 출력이 아래와 같이 나오도록 하시오(필수) ⭐️

		HashSet<Num> set = new HashSet<>();
        set.add(new Num(7799));
        set.add(new Num(9955));
        set.add(new Num(7799));

        System.out.println("인스턴스 수: " + set.size());

        for(Num n : set)
            System.out.print(n.toString() + '\t');

        System.out.println();

/*
====출력
인스턴스 수: 2
7799	9955
*/
==================================================================
class Num {
	int num;
	
	Num(int num) {
		this.num = num;
	}
	
	@Override
	public String toString() {
		return String.valueOf(num);
	}
	
	@Override
	public int hashCode() {
		return num % 2;  
        //출력 순서를 맞추려면 이렇게 변경하면 된다
	}
	
	@Override
	public boolean equals(Object obj) {
		if(this.num == ((Num)obj).num)
			return true;
		else 
			return false;
	}
}

7. Set 호출되는 원리와 순서를 설명하시오.

set은 집합을 구현한 것으로 저장 순서가 유지되지 않고, 데이터의 중복 저장을 허용하지 않는다. 이를 구현하기 위해서는 동일 인스턴스가 중복 저장되지 않도록 해야한다.
그러므로 set을 호출하기 위해서 다음 두 개가 호출되어야 한다는 것을 반드시 이해해야 한다. 아래의 두 개가 다 같아야 동일 인스턴스이다.

⭐해시알고리즘은 동일인스턴스가 있는지 검사를 하기위한 속도를 획기적으로 향상시킬 수 있는 방법⭐

  1. hash code 호출 (두 개 객체 주소-hash code가 같은지 비교)
    hashCode 는 Object에 있다. 아래의 예시와 같이 오버라이드 한 함수를 통과해 리턴 되는 값으로 군집(집합, 캐비넷)을 만든다. 그리고 그 다음 equals를 호출한다.

  2. equals 호출 (문자열 비교 걸러냄)
    hash code의 호출로 군집히 형성되면 그 군집 내의 요소들을 비교해 나간다.

Set 호출에는 2단계를 거쳐 진행된다.

  • 클래스에 정의된 hashCode 메소드의 반환 값을 통해 분류.

    선택된 부류 내에서 equals 메소드를 호출하여 비교.

따라서 Set은 hashCode를 기반으로 분류된 데이터 속에서 탐색을 하면 되기 때문에 탐색속도가 높다.


8.아래와 같이 출력되도록 하시오.

HashSet<Person> hSet = new HashSet<Person>();
hSet.add(new Person("LEE", 10));
hSet.add(new Person("LEE", 10));
hSet.add(new Person("PARK", 35));
hSet.add(new Person("PARK", 35));

System.onut.println("저장된 데이터 수: " + hSet.size());
System.out.println(hSet);

/*
============
저장된 데이터 수: 2
[LEE(10세), PARK(35세)]*/
=========================================================================
class Person {
	private String name;
	private int age;
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public int hashCode() {
		return age;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(name.equals(((Person) obj).name) && age == ((Person) obj).age)
			return true;
		else
			return false;
	}
	
	@Override
	public String toString() {
		return name + "(" + age + "세)";
	}
}
profile
코린이

0개의 댓글