/*
* Collection Map
*
* List Set
*
* ArrayList HashSet HashMap
*
* List 순서 O, 중복 O
* Set 순서 X, 중복 X
* Map 키-값 형태로 저장합니다.
* 키는 중복 X, 값은 중복 O
*/
//정리
/* Map은 Key와 value를 가진 집합이며, 중복을 허용하지 않습니다.
* 즉 한 개의 key와 한 개의 value가 매칭됩니다.
* java.util 패키지에 여러 집합들을 사용하기 위한 interface와
* class가 정의되어 있습니다.
*
* HashMap
* HashMap은 Map Interface를 implements한 클래스로
* 중복을 허용하지 않습니다.
* Map의 특징인 Key-Value의 한 쌍으로 구성되어 있습니다.
* Key 또는 value값으로 null을 허용합니다.
*/
//로그인 하기를 map으로
/* HashTable
* HashMap과 동일한 내부구조를 가지고 있습니다.
* HashTable도 키로 사용할 수 있는 객체는 hashCode()와 equals()를
* 재정의 해서 동등 객체가 될 조건을 정해야 합니다.
* hashTable과 차이점은 HashTable은 동기화된 메소드로 구성되었기 때문에
* 멀티 쓰레드가 동시에 이 메소드를 실행할 수 없고,
* 하나의 쓰레드가 실행을 완료해야 다른 쓰레드가 실행될 수 있습니다.
* 그래서 멀티쓰레드 환경에서 안전하게 객체를 추가, 삭제가 가능합니다.
*
* 이것을 쓰레드 안전(thread safe) 이라고 합니다.
*/
/*
* 스택 stack
* 쌓아 올리다.
* 자료를 정해진 방향으로만 쌓을 수 있음
* 가장 마지막에 입력된 자료가 가장 먼저 읽힌다.
* 자료 저장 push
* 자료 읽기 pop
* 후입 선출 구조 (LIFO) Last In First Out
*
* 큐 Queue
* 줄 서서 기다리는 것
* 선입 선출 구조 (FIFO) First In First Out
* 한쪽에서는 입력이 다른쪽에서는 출력이 실행된다.
* 먼저 입력된 자료를 먼저 출력한다.
*
* 사용 : 프린트 출력, 프로세스 실행
*/
//2진트리
/* 이진트리는 여러개의 노드(node)가 트리형태로 연결된 구조
* 루트(root)라고 불리는 하나의 노드에서 시작해 각 노드에
* 최대 2개의 노드를 연결할 수 있는 구조
*
* 연결된 두 노드를 부모-자식 관계에 있다고 하며
* 위에 있는 노드를 부모노드, 아래 있는 노드를 자식노드라고 한다.
* 하나의 부모노드는 최대 두개의 자식노드와 연결될 수 있다.
*
* 첫번째 저장하는 값은 루트 노드가 되고 두번째 값은 루트 노드에서
* 값의 크기를 비교하면서 트리를 따라 내려간다.
* (숫자가 아닌 문자를 저장할 경우 = 문자의 유니코드 값을 비교)
*
* 작은 값은 왼쪽에, 큰 값은 오른쪽에 저장
* 이렇게 구성하면 왼쪽 마지막 노드가 제일 작은 값,
* 제일 큰 값이 오른쪽 끝에 위치합니다.
*
* Tree Set
* 이진 트리를 기반으로 한 set
* 하나의 노드는 노드 값인 value와 왼쪽과 오른쪽 자식 노드를
* 참고하기 위한 두개의 변수로 구성되어 있습니다.
*
* TreeSet에 값을 저장하면 자동으로 정렬됨
* 부모 값과 비교해서 낮은 것은 왼쪽에, 높은 것은 오른쪽에 저장
*
* first() : 가장 작은 값 리턴
* last() : 가장 큰 값 리턴
* lower(v) : v보다 작은 바로 아래 값 리턴
* higher(v) : v보다 바로 위 객체 리턴
* floor(v) : v와 동등한 객체가 있으면 리터, 없으면 바로 아래 값 리턴
* ceiling(v) : v와 동등한 객체가 있으면 리턴, 없으면 상위 객체 리턴
* pollFirst() : 제일 낮은 객체를 꺼내오고 컬렉션에서 삭제
* pollLast() : 제일 높은 객체를 꺼내오고 컬렉션에서 삭제
*/
//예외처리
/* Exception
* 자바 예외 핸들링
* 자바에서는 예외라는 것을 두고 목적에 따라서 처리(핸들링)하도록
* 설계되어 있습니다.
*
* 일단 예외라는 것 부터 알아 보겠습니다.
* 예외는 주로 실행 시에 발생되는 모든 에러 상황이라고 정의합니다.
* 물론 특정 api는 컴파일 시 예외를 처리하지 않으면 컴파일 되지
* 않는 예외들도 있습니다.
*
* 예외의 정의
* : 실행 시에 발생할 수 있는 모든 에러 상황들
*
* 자바에서 예외가 발생되는 순서는 대략 아래와 같습니다.
* 컴파일 -> 실행 -> 실행 중 예외 발생 -> VM이 발생한 예외의 종류 및 내용을 파악한 뒤 예외 객체 생성
* -> 발생된 코드 밖으로 예외 던지기(throw) -> 예외의 콜 스택에 전이
* -> main 메소드 밖까지 던지게 되면 프로그램 비정상 종료
*
* 위처럼 예외는 던진다 라고 표현합니다.
* 또한 예외는 객체이기 때문에 당연히 클래스로 정의되어 있습니다.
*
* 예외의 최고 클래스는 lang 패키지의 Throwable 입니다.
* 자식으로는 Error와 Exception이 있습니다.
*
* Error 하위 타입은 일반적으로 java 실행기 즉 VM에 관련된
* 에러 상황들을 정의한 클래스 입니다.
* 이러한 문제(상황)들은 프로그래머가 처리할 수 없는 것들로
* VM 즉 JRE의 전반적인 문제입니다.
* 따라서 프로그래머는 Error 하위 타입들의 예외(에러)는
* 처리하지 않고 무시합니다. (처리할 수 없습니다.)
*
* 다음 Exception이란 클래스의 하위 타입이 바로 프로그래머가
* 처리해야 할 예외 타입들 입니다.
* 따라서 보통 예외다 라고 표현할 때 최고 클래스로는 Excepion 클래스를
* 말합니다. Throwable 클래스는 자식 클래스로 Error를 가지고 있기 때문에
* 예외의 최고 클래스로 표현하지 않습니다.
*
* 예외의 종류는 크게 두가지로 나뉩니다.
* 컴파일러가 관여하지 않으면서 실행시에 예외가 발생할 수도
* 발생하지 않을 수도 있는 예외를
* [알려지지 않는 예외(Unchecked Exception)]
*
* 컴파일러가 관여하는 예외인 [알려진 예외(Checked Exception)]로 구분됩니다.
*
* 구분하는 방법은?
* Exception 하위 클래스 중 RuntimeException이 있는데
* 해당 클래스의 자식 클래스들은 모두 알려지지 않은 예외입니다.
* 나머지는 알려진 예외 입니다.
*
* 422페이지 내용입니다.----------------------------------------------
* 컴퓨터 하드웨어의 오작동 또는 고장으로 인해 응용프로그램 실행오류가
* 발생하는 것을 자바에서는 에러라고 말합니다. (고치지 못하는 것)
* 에러는 JVM 실행에 문제가 생겼다는 것이므로 JVM 위에서 실행되는
* 프로그램을 아무리 견고하게 만들어도 결국 실행 불능이 됩니다.
* 개발자는 이러한 에러를 극복할 방법이 없습니다.
*
* 이런 에러 외 에러를 예외 라고 합니다.
* 예외는 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해
* 발생하는 프로그램 오류를 말합니다. 예외가 발생되면 프로그램은 바로
* 종료됩니다. (이건 에러와 비슷합니다.) 그러나 예외는 예외 처리라는 것을
* 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있습니다.
*/
//예외 처리 해보기
/*
* try를 활용하여 오류를 막고 다른 부분까지 실행되게 할 수 있습니다.
*
* 1. 직접 처리
*
* try{
* 예외가 발생할 만한 코드;
* } catch(Exception e) {
* 예외가 발생하면 실행할 코드;
* } finally {
* 예외 발생 유무와 상관 없이 반드시 실행해야 할 코드;
* 흔히 닫기 문장이 들어간다(닫기();)
* }
*
*
* 2. 던지기(throw)
*
* 메소드 뒷부분에 throw 처리할 예외 타입을 적어줍니다.
* 메소드가 실행되다가 예외를 만나면 메소드를 호출한 쪽으로
* 예외를 던집니다.
* main 메소드는 VM으로 던집니다.
* (콘솔로그에 빨간 글씨로 떴던 것처럼..)
*
* 3. 직접 예외 객체 만들어서 처리하기
* 예외 객체를 만들어서 처리하기
* throw 객체명;
* @override
* public void printStrackTrace(){
* super.printstrackTracer();
* System.out.println("계산 불가");
* }
*/