본문 바로가기
국비 학원 가서 개발새발

국비학원 11일차) ArrayList 예습)예외,컬렉션,HashSet,Map 등

by 휴일이 2022. 10. 13.


배열을 편하게 하기 위해! List
컬렉션 프레임웍, 표준화
Collection - List, Set
Map은 공통 부분이 없어서, 컬렉션에 안 들어감

List 리스트에 받아서 순서대로 쓰겠다
ArrayList는 웹 접근

Map 검색(대량 데이터에는 ㄴㄴ) 채팅프로그램, ip번호와 아이디


List-ArrayList, LinkedList

ArrayList-Vector 순서O 중복O
데이터 저장 공간 ) 배열 사용
Vector 멀티쓰레드 동기화 되어 있음
ArrayList는 동기화X - 동기화 메서드가 있긴 함Collection에
용량 변경하려면 복사 후 용량 큰 배열 만들어서 새로 붙여넣기 해야함


LinkedList-순서O 중복O
ArrayList와 비슷하나 메모리 저장법이 다름(연결)
불연속적으로 존재하는 데이터를 서로 연결해줌,
추가 삭제가 빠릅니다~~~
자바로만 했을 땐, LinkedList가 더 빠름
웹은 ArrayList~~~


데이터 추가 add()
데이터 수정 set()
해당하는 데이터가 있는지 없는지 contains()
어느 위치에 뭐가 있는지? indexOf()
해당하는 데이터 하나 삭제 remove()
모든 데이터 전체 삭제 removeAll() / clear()

Set- 순서X 중복X (로또 당첨 번호) 집합

Map- 순서O 키중복X 밸류중복O
웹에서는 HashMap


추가,검색,수정,삭제,전체출력,데이터초기화,종료 //중복값 안 받기 :) 비교, for문


Collection 과 Map
ㄴList,Set   ㄴ얘는 따로

Collection 은 똑같은 방식으로 쓸 수 있음(메소드가 하는 일이 같음, 예) add() )

Collection -> 값만 저장
Map -> 키와 값 같이 저장(key, value)
Map은 데이터가 많이 들어가면 불편,
대량의 데이터는 ArrayList를 많이 씀..:(

 

 

 

 

예습--------------------------------

 

 

 

<메서드에 예외 선언> - 메서드 선언부에 throws 사용

void method() throws Exception1, Exception2 ... { 내용 }

상속 관계까지 고려해야 됨, throws Exception -> 모든 종류 예외 발생 가능성

 

메서드에 메서드 내에서 발생 가능성이 있는 예외를 선언부에 명시하면

메서드 사용자가 이에 대한 처리를 하게 강요 -> 견고한 프로그램 작성 가능

일부러 throw new Exception("파일 이름 유효X") 해서 예외 생성도 가능!

 

 

<finally 블럭> - 얘는 무조건 실행되어야 해 !

try - catch - finally 순서로 구성 //finally는 생략 가능하긴 함

try { } catch(Exception e) { } finally { 예외 발생 여부와 상관 없이 실행되어야 하는 문장 }

 

 

<사용자 정의 예외> - 필요하면 예외 만들기 // 상위 예외 클래스 상속

class MyException extends Exception {

	private final int ERR_CODE; //생성자로 초기화
	
	MyException(String msg, int errCode) { //메시지+코드 생성자
		super(msg);
		ERR_CODE = errCode;
	}
	
	MyException(String msg) {
		this(msg, 100); //ERR_CODE를 100(기본값)으로 초기화
	}
	
	public int getErrCode() { //에러코드 얻는 메소드
		return ERR_CODE; //주로 getMessage() 와 함께 사용
	}
}

보통 RuntimeException을 상속 받아서 만든다

걍 Exception 상속 받으면 꼭 예외처리를 해줘야 하기 때문

 

 

 

<예외 되던지기> - 한 메서드에 발생할 수 있는 예외가 여러개라면?

선언부에 지정하여 호출한 메서드에 나눠 처리

하나의 예외도 두 번 처리(발생메서드 + 호출메서드 양쪽에서)

 

1.예외 발생 가능성 있는 메서드에서 try-catch로 예외 처리

2.catch에서 예외처리 후, throw 문으로 다시 예외 발생

3.예외는 호출한 메서드로 전달, 호출한 메서드에서 try-catch로 예외 처리

*메서드 선언부에 throws 예외 선언 잊지 말기!

 

 

<연결된 예외> - 한 예외가 다른 예외를 발생 시킨다

예외A가 예외B를 발생 시키면?

예외A는 원인 예외

 

 

try { //인스톨 하는 메서드(코드)
			startInstall(); //여기에서 SpaceException 발생
			copyFiles();
		} catch(SpaceException e) {
			InstallException ie = new InstallException("설치 중 예외 발생"); //예외 생성
			ie.initCause(e); //InstallException의 원인 예외를 SpaceException으로
			throw ie; //InstallException 발생
		}

 

참고)Throwable은 error / Exception의 제일 위

Throwable initCause(Throwable cause)  지정 예외를 원인 예외로 등록

Throwable getCause() 원인 예외 반환

 

연결 된 예외 쓰는 이유?

ㄴ 여러가지 예외를 큰 분류의 예외로 묶어서 다루기 위해

ㄴ ckecked예외를 unchecked 예외로 바꾸기 위해

 

 

 

<Iterator, ListIterator, Enumeration> - 컬렉션 저장 요소 접근

Iterator : 컬렉션에 저장된 요소에 접근

ListIterator : Iterator에 양방향 조회 기능 추가(List만 사용 가능)

Enumeration : Iterator 구버전

Iterator은 인터페이스 Collection 안에

"Iterator을 구현한 클래스의 인스턴스 반환하는 iterator()를 정의한 것"

 

List나 Set 인터페이스를 구현한 컬렉션에는 iterator()가 작성 되어 있음

List list = new ArrayList();

Iterator it = list.iterator();

while(it.hasNext()) { //boolean hasNext() 읽어올 요소가 있는지 확인

System.out.println(it.next()); } //Object next() 다음 요소 읽어옴

//요소 다 읽으면 초기화해야 다시 읽을 수 있음

//이미 읽은 거 또 불러와서 읽으면 못 읽음

 

 

<Map과 Iterator> - 직접 호출 불가

Map인터페이스를 구현한 컬렉션 클래스는 key,value를 쌍으로 저장함

ㄴ iterator() 직접 호출 불가

keySet() 이나 entrySet()으로 키와 값을 각각 Set 형태로 가져와서 호출해야 함

 

Map map = new HashMap();

Iterator it = map.entrySet().iterator(); //map을 entrySet으로 가져온 후 iterator();

1.Set eSet = map.entrySet();

2.Iterator it = eSet.iterator();

위에 꺼 풀어 쓴 거임

 

 

<Comparator와 Comparable> 컬렉션 정렬

Comparator -> compare(o1, o2) //o1과 o2를 비교

Comparable -> compareTo(o) //객체 자신과 o를 비교

- 두 객체가 같으면 0, 왼쪽이 크면 양수(1), 오른쪽이 크면 음수(-1)

 

Comparable -> 기본 정렬 구현 (1,2,3...)

Comparator -> 다른 기준 정렬(3,2,1....)

 

static void sort(Object[] a) //Comparable 정렬(기본)

static void sort(Object[] a, Comparator c) //Comparator로 지정 기준 정렬

 

 

<HashSet> - Set인터페이스 대표 컬렉션

중복X 순서X - 순서 O 하고 싶으면 LinkedHashSet

add / addAll로 저장, 중복값이 있다면 false 반환

Collections.sort(List list)로 정렬 가능하지만

List로 바꿔야 정렬 가능

 

List list = new LinkedList(set) //LinkedList(Collection c) ->List로 바꿈

Collections.sort(list)

 

인스턴스의 값이 같은데 다르게 인식해서 중복 저장 되면?

equals / hashCode 오버라이딩 (이클립스에 기능 있음)

 

 

<HashMap> - Map인터페이스 구현

키(key)와 값(value)를 묶어 하나의 데이터(entry)로 저장

많른 양의 데이터 검색에 뛰어난 성능!

 

key와 value는 (Object, Object) //키는 보통 String을 대문자, 소문자로 통일해서 사용하긴 함

키(key) 중복X 유일한 값 - 지정된 값을 찾는데 사용되니 유일해야 함

값(value) 중복O

중복된 키로 저장하면 값만 새로운 값으로 덮어씀

 

 

<Collections의 메서드> - 동기화

컬렉션과 관련 된 메서드 제공

Collection -> 인터페이스

Collections -> 클래스

 

fill() , copy() , sort() , binarySearch() ....

 

컬렉션 동기화 메서드 synchronized

변경 불가(읽기 전용) unmodifiable

싱글톤(단 하나의 객체 저장) singleton

단일 컬렉션(한종류의 객체만) checked

 

 

<컬렉션 클래스 정리, 요약>

ArrayList

ㄴ 배열기반/데이터 추가 삭제 불리(순차적은 빠름)/임의 요소 접근성 뛰어남

LinkedList

ㄴ 연결기반/데이터 추가 삭제 유리/임의 요소 접근성 좋지 않음

HashMap

ㄴ 배열+연결/추가,삭제,검색,접근성 뛰어남(특히 검색 최강)

TreeMap

ㄴ 연결기반/정렬,검색(특히 검색 범위) 적합/검색 성능은 HashMap보다 아래

Stack

ㄴ Vector을 상속받아 구현

Queue

ㄴ LinkedList가 Queue인터페이스 구현

HashSet

ㄴ HashMap 이용해 구현

TreeSet

ㄴ TreeMap 이용해 구현

LinkedHashMap , LinkedHashSet

ㄴ HashMap과 HashSet에 저장 순서 유지 기능 추가 !

728x90