day19
<Final Review>

**변수**
 - 변수 선언 방법: (접근제한자) 타입 변수명; 
 - 기본 타입 종류와 값
 	- 정수형 : int, char(유니코드표에 있는 값에 따라 문자를 저장) 
 	- 실수형 : double, float 
 		***실수형은 약간의 오차가 있어서, 정확도를 높이려면 나누기보다 곱하기먼저하는게 나음. (예: A/B*C/D 보다는 A*C/(B*D)가 낫다)**
 	- 논리형 : boolean 
 - 변수명 작성 규칙
 	- 숫자로 시작 불가능
 	- 예약어를 사용 불가능
 	- 특수문자는 $와 _만 사용 가능
 	- 변수 중복선언이 불가능	
 	- 대소문자를 구별함(예: int num, int Num이 다른 변수)
 - 변수명 작성 관례
	- 변수명은 소문자로 시작
	- 상수는 대문자로 한다 **(final이 들어간 애들은 대문자로 예: Math.PI)** 
 	- 카멜(Camel) 표기법 : 변수명이 두 단어 이상으로 되어있을 때, 두번째 단어부터 첫글자만 대문자로 표기하는 것 
 		*클래스는 첫글자를 대문자로 한다
 	- 변수명/메소드/클래스명은 의미있는 단어로 작성
 - 일반변수
 	- 기본타입으로 선언한 변수
 	- 값을 저장
 	- ==로 비교
 - 참조 변수
 	- 기본타입이 아닌 배열, 클래스, 열거형 등으로 선언한 변수
 	- 주소를 저장
 	**- 비교할 때**
 		1) 클래스인 경우: .equals() 메소드를 이용
 		2) 기본타입 배열은: == 
 		3) 클래스 배열: equals() 메소드 이용
 		4) 열거형은: ==이용
 - 지역변수		
 	- 사용되는 지역이 일부(메소드 하나, 반복문 한 곳 등)인 경우
 - 멤버변수
 	- 클래스의 멤버로, 사용하는 지역이 클래스 안 전체인 경우
 		*멤버변수의 종류에 따라 사용할 수 없는 메소드가 있을 수 있음
 - 매개변수
 	- 메소드를 동장시키기 위해 알려주는 정보
 	- 지역변수
 	**- 멤버변수와 매개변수의 우선 순위는 매개변수가 높다.**
 		* void getNum(int num){
 				this.num=num; 		//this.를 안쓰면 num=num인경우 멤버변수가아니라 매개변수로 인식
 	      }
 - 클래스 멤버 변수
 	- static이 붙은 멤버변수 
 	- 클래스를 통해 호출
 - 객체 멤버 변수
 	- static이 안붙은 멤버변수	
 	- **객체를 통해 호출(대부분 getter를 이용)**	
 		
 	Quiz
 		- 하나의 변수는 변수 종류 중 한 가지에만 속한다 (X)
 	

연산자
 - 연산자 종류와 결과
 	- 산술연산자
 		- +, -, *, /, %
 		- 정수/정수 => 정수가 되어서 소수점이 사라짐(정확하지 않음)
 			*타입변환을 통해 (double)정수/정수 ="실수"가 되도록 해야 한다.
 		- % : 나머지를 확인하는 연산자
 		- 산술 연산자의 계산 결과값은 값
	- 대입연산자
		- =
		- 오른쪽에 있는 값을 왼쪽에 저장 (왼쪽에는 저장할 변수가 1개 와야 함.)
		- 저장, 덮어쓴다, 초기화 등의 표현
		- 대입연산자는 값 또는 주소값
	- 증감연산자
		- ++, --
		- 최종적으로 1증가/1감소
		- 전위형: 증가하고 동작
		- 후위형: 동작하고 증가
		- 증감연산자 결과값은 값
	- 비교연산자
		- >, <, >=, <=, ==, !=
		- 크기 비교
		- 일반변수의 크기를 비교할 때 사용
		- 비교 연산자 결과 값은 참 또는 거짓(논리 값)
		- "비교연산자 =="와 "대입연산자 ="는 다름	
	- 논리연산자
		- &&, ||, !
		- && : ~하고, A&&B에서 A,B 둘 다 참이면=> 참, 나머지는 거짓
		- || : ~거나, A||B에서 A,B 둘다 것이면 거짓 => 나머지(하나라도 참이면)는 참
  		- ! : ~아닌
  		- 논리 연산자 결과 값은 참 또는 거짓(논리값)
  	**- 조건선택연산자
  		- (조건식) ? (참일때값):(거짓일때값)**
  			* 조건식이 참이면 (참)에 해당하는 부분을, 거짓이면 (거짓)에 해당하는 부분을 실행
	- 조건식
		- 연산 결과가 참 또는 거짓이 되는 식
		 예) it(num=10&&num<10){		//num=10은 => num&&num<10 인 상황,문제: &&연산자는 왼쪽, 오른쪽 모두 참 거짓을 나타내는 조건식이 와야 함   
  						//실행문;				
  			}
	- 연산자 우선 순위
		- 우선순위는 ()가 제일 높다
		
		
조건문
	- ~하면 ...해라
	- ~ : 조건식, ... : 실행문
	- 조건문의 종류 (if, switch문)
	- if문
		- 모든 조건문을 다룰 수 있음
		- if문 문법
			if(조건식1){			//하나의 조건식에서 if는 한 번만
				실행문1;
			}else if(조건식2){	//0번또는 여러번
				실행문2;
			}else{
				실행문3;			//0번또는 한 번
			}
		*위의 문법에서 조건식1과 조건식2를 같이 만족하는 경우에는 실행문 1번을 실행
	- switch문
		- 사용하는 변수(식)의 값이 제한적일 때
		-switch문 문법
			switch(변수/식){
			case 값1 : 
					실행문1;
					break;	
			case 값2 : 
					실행문2;
	 				break;
	 		default : 
	 				실행문 3;
			}
		*break는 switch문을 빠져나오는 역할
		*switch문에서 break를 만나지 못하면 다음 실행문으로 이동
		
		
반복문
 - 규칙적인 작업을 여러번 할 때 사용
 - 반복횟수, 규칙성을 찾아야 한다
 - 반복문의 종류 : (for문, 향상된for문, while문, do-while문)
 - for문
 	- 문법으로 초기화, 조건식, 증감식을 입력하는 위치가 있음
 	- 초기화 : 반복문에서 사용하는 변수를 초기화, 생략가능
 	- 조건식 : 반복문 동작을 결정하는 곳으로 참이면 반복문 동작, 거짓이면 반복문 종료
			  생략가능하며 생략하면 항상 참
 	- 증감식 : 조건식에서 사용하는 변수를 증가하거나 감소시킴, 생략가능 
 	- 초기화, 조건삭, 증감식이 반복횟수를 결정
 	- for문 문법
 		for(초기화;조건식;증감식) {
 						실행문;
 		}
 - while문			
 	- 반복횟수가 정해져있지 않거나, 순차적으로 증가/감소하지 않는 경우 이용에 편리
 	- 조건식은 생략 불가능
 	- while문 문법
 		while(조건식){
 				실행문;
 		}
 - do while문
 	- 무조건 한 번은 실행
 	- ; 이 들어간다
	- doWhile문
		do{
			실행문;
		}while(조건문);
	*while의 조건문 옆에 ; 이 붙는 것이 특징

 - 향상된 for문
 	- 배열이나 리스트일 때, 향상된 for문을 사용할 수 있음
	- 배열이나 리스트의 원소들을 전체 탐색할 때 사용 (*전체 값을 확인 및 출력하는 게 포인트)
 	- 향상된 for문
 		for(타입 변수명: 배열이나 리스트){
 						실행문;
 		}
 - break
 	- switch문/반복문을 빠져나가는 역할 	
 	- 반복문에서는 if문과 함께 나옴
 - continue	
	- 스킵
	- for문에서는 증감식위치로 점프(스킵), while문에서는 조건식 위치로 스킵
	- it문과 세트로 같이 나옴
	- continue를 만나면 아래 코드가 있더라도 실행하지 않고 지정된 위치로 이동
	
<반복문 사용 시, 유의사항>
* 의도치 않은 무한루프가 생기지 않도록 주의
* 조건식을 잘못 지정해서 실행되지 않는 경우가 생기지 않도록 주의

배열	
 - (같은 의미) 같은 타입 변수들의 집합
 - 배열은 변수들을 효율적으로 관리하기 위해 사용 
 - 배열은 참조변수
 - 배열의 시작번지는 0번지부터 크기-1번지까지(예, 10개크기의배열은 0~9번지) 
 - 배열에서 번지를 잘못사용하면 ArrayIndexOutOfBounds 예외가 발생
 - 배열의 길이는 배열명.length;로 알 수 있다
 - 배열은 반복문과 같이 사용 됨
 - String의 .split("반복패턴") 으로 문자열을 그룹으로 잘라서 배열로 만들어줄 때 씀
 
 
**클래스** 
- 메소드
 - 하나의 기능을 하도록 모아놓은 코드
 - 메소드 선언부
 		 리턴타입 메소드명 (매개변수){ 			//메소드선언부
 											//메소드구현부
 		 }
 - 매개변수 : 메소드를 실행하기위해 필요한 정보
 - 리턴타입 : 메소드 실행 후, 알려주는 정보
 	**-리턴타입 메소드**
 		- 리턴값을 해당 메소드를 호출한 메소드에게 알려줌
 		- 리턴값이 없는 경우, void를 사용 
 		- 매개변수는 값 또는 주소값을 복사해서 사용
 		- 매개변수가 일반변수인 경우, 원래값(메소드를 호출한 곳에서 알려준 값)이 변경이 안됨
 		**- 매개변수가 참조변수인 경우, 원래값이 변경될 수 있음 => 참조변수는 값이아니라 주소라서 원래값과 연결되니깐** 
 - 메소드 오버로딩
	- 동일한 이름의 메소드가 여러개 존재할 수 있다
	- 매개변수가 다른 경우
		1) 매개변수의 갯수가 다른 경우
		2) 매개변수의 타입이 다른 경우
 - 멤버변수
 	- 클래스에서 나타낼 정보
 	**- 멤버 메소드에서 멤버변수를 이용하여 동작**
 	- 생성자에서 초기화 가능
 	**- 멤버변수가 참조변수이면 객체를 꼭 만들어놓아야 한다** 		
		- 명시적 초기화 또는 생성자 또는 초기화 블록
 - 생성자
 	- 멤버 변수들을 초기화하는 곳
 	- 일반적으로 접근제한자가 public (*싱글톤은 생성자가 private)
	- 이름이 클래스명과 동일
	- 리턴타입을 쓰지 않음
	- **new를 이용하여 객체를 생성할 때 자동 호출**
	- 객체 생성 후, 임의로 호출할 수 없음 (=객체만들때 빼고는 호출 불가능)
	- 생성자 오버로딩을 통해 다양한 형태의 생성자를 만들 수 있음
	- 생성자가 "없으면" 기본 생성자가 만들어짐 => 기본생성자 아닌걸 만들면 기본생성자 안불러와지니까 따로 수동으로 기ㄴ본생성자 쓸 때 있음

 - 객체선언 및 생성	
 	-생김새
 			클래스명 객체명; 					//선언
 			클래스명 객체명 = new 클래스명(); 	//new가 객체를생성 및 초기화
 	- 객체는 생성해야 멤버 메소드와 멤버 변수를 사용할 수 있음
 	**- 객체를 생성하지 않고 멤버 메소드와 멤버 변수를 사용하면, NullPointer예외가 발생** 
 - 멤버 메소드를 호출하는 방법
	-생김새	
		객체명.메소드명(매개변수);
	- 접근제한자
		- public	: 본인 + 같은 패키지 + 자식 + 다른 패키지
		- protected : 본인 + 같은 패키지 + 자식
		- (default) : 본인 + 같은 패키지
		- private	: 본인 
 - static
 	- 멤버변수/메소드를 클래스멤버 변수/메소드로 만듬
 	**- 클래스 변수/메소드는 모든 객체가 공유함
 	- 클래스 변수/메소드는 각 클래스에 1개만 존재**
 	- static이 안붙은 멤버 변수/메소드를 객체 멤버 변수/메소드라 함
 	**- 객체 변수/메소드는 각 객체마다 각각 1개씩 존재
 		(예: Math.randon() - Math클래스멤버메소드, String클래스의 메소드 중  str.indexOf() - 객체멤버메소드 //str=변수,객체명)**	
  Quiz
	- 클래스 변수는 객체 메소드에서 사용할 수 있다.
	- 객체 변수는 클래스 메소드에서 바로 사용할 수 없다. 	(**변환필요**)
	- 클래스 메소드는 객체 메소드에서 사용할 수 있다.
	- 객체 메소드는 클래스 메소드에서 바로 사용할 수 없다. (**변환필요**)	
	- 클래스변수/메소드는 객체 없이 호출 가능하지만, 객체 변수/메소드는 객체가 있어야 호출이 가능하다
 - final
 	- 변할 수 없다
 	- 변수	: 상수로 바뀜
 	- 메소드	: 오버라이딩 불가
 	**- 클래스	: 부모클래스가 될 수 없음 (예: String클래스는 final클래스라 부모클래스가 될 수 없다)**	  		

상속
  - 부모클래스의 멤버변수/메소드를 물려 받는 것
  **- extends 키워드를 이용해서 상속받음**
  - 코드의 중복을 제거
  - 쉽게 클래스를 만들기 위해서
  - 서로다른 자식 클래스의 개체들을 부모 클래스가 쉽게 관리하기 위해서
  - 클래스 상속에서 부모클래스는 하나만 가능, 자식클래스는 여러개가 될 수 있음
  - 인터페이스 상속에서 부모는 여러 인터페이스가 가능 
  - 메소드 오버라이딩
  	- 부모클래스에 있는 메소드를 자식 클래스에서 재정의하는 것
  	- 부모클래스의 메소드 선언부가 동일해야한다. (매개변수, 리턴타입이 동일*)
  	- 접근제한자는 범위를 좁힐 수 없다.
  		- 부모클래스 메소드의 접근제한자가 public이면 해당 메소드를 자식 클래스에서 오버라이딩할 때 접근제한자는 public만 가능
  			* 디폴트, protected, private로 변경 불가능 =>늘릴 순 있지만, 좁힐 순 없음
  - 클래스 타입변환
 	- 클래스 타입변환은 부모와 자식관계에서만 가능
 	**- 자동     : 자식클래스의 객체를 부모클래스의 객체로 변환하는 경우 => Parent p = new Child();
 	- 강제(조건): 부모클래스의 객체를 자식클래스의 객체로 변환하는 경우 => Parent p = new Child();** 
 															**//부모클래스객체가 자식클래스를 통해만들어진 경우만 Child c = (Child)p; //가능** 
추상클래스
 - Calendar 클래스는 대표적인 추상클래스
 **- abtract를 붙여줌**
 - 객체를 생성할 수 없음=> 자식클래스를 이용하여 객체를 생성
 - 추상메소드
 	- 메소드 선언부만있고 구현부가 없는 메소드
 	- 자식클래스에서 무조건 오버라이딩 해야 함. (자식클래스가 일반 클래스인 경우)
인터페이스
 - 상수와 추상메소드로 이뤄져있음
 - 실제 구현되어있는 것 없이 틀만 있는 것
 - 인터페이스를 이용하여 객체를 생성할 수 없다 
 - 인터페이스를 이용하여 구현 클래스를 만든다 => 구현클래스는 객체를 생성가능
 **- implements를 이용하여 구현을 함**
 - 구현클래스를 만들 때, 여러 인터페이스를 구현해도 되다,
 - 구현클래스에서는 인터페이스에이쓴 메소드들 오버라이딩해야 함 
 - 가능 명세서
**익명객체**
 - 클래스를 상속받아서(인터페이스를 구현해서) 이름 있는 클래스로 만드는 것이 아니라 한 번 사용할 용도로 이름 없는 클래스를 만들어 객체를 생성하는 것
 - 익명 객체를 사용하는 경우 새로운 멤버 변수/메소드를 생성하지 않고 부모 클래스에 있는 메소드나 인터페이스에 있는 메소드를 오버라이딩해서 사용
      A a = new A(){
	                        //멤버변수와
	                        //멤버메소드
      };
 예외처리
 - 프로그램이 중단되는 것 막기 위해
 - 예외 상황을 발견하고 그 상황을 해결하기 위해
 - 예외: 코드로 해결이 가능한 부분
 - 오류: 코드로 해결할 수 없는 부분
 - 일반 예외: 컴파일 단계에서 확인되어 실행되지 않는 예외
 - 실행 예외: 컴파일 단계에서 확인되지 않고, 실행 과정에서 나타나는 예외
 - 실행 예외는 예외처리를 하지 않아도 에러가 발생하지 않음.
 - 일반 예외는 예외처리를 하지 않으면 에러가 발생함.
 - 실행 예외 종류
 	- 배열과 관련된 예외 : ArrayIndexOutOfBounds
 	**- 참조변수 관련 예외 : NullPointer**
 	- 나누기 관련 예외	 : Arithmetic
 	**- 타입변환		 : ClssCast
 	- 문자열을 숫자로	 : NumberFormat**
 - 예외처리 방법
 	1) try {
 			예외가 발생할 수 있는 코드; 
 		} catch(예외클래스명1 e){
 			예외처리문1;
 		} catch(예외클래스명2 e){
 			예외처리문2;
 			return;
 		}finally{
 			실행문1
 		}
 		* 이때 예외클래스명1은 예외클래스명2의 조상클래스면 안됨.
 		* finally는 예외처리과정에서 메소드가 종료되도 무조건 실행 됨.
 		* return은 메소드가 종료됨을 이야기, finally는 return상관없이 무조건 나옴
 	2) throws
 		- 예외가 발생하면 직접처리하지 않고 **예외를 던져서 남이 처리하게 하는 방법**
 		- 메소드 선언부에서 매개변수 옆에 throws 예외클래스명을 입력하여 발생할 수 있는 예외를 알려줌
 		- 단, 실행예외인 경우 throws를 생략할 수 있음. (예외가 발생하더라도 던져줌)
	3) throw 예외던지기
		- 자동으로 발생되는 예외가 아닌 변수의 조건에 따라 예외를 발생시키고자 할 때 사용
		- throw는 예외 객체를 던저야하기 때문에 일반적으로 throw new 예외클래스명("예외메세지"); 형태로 던진다. 
기본 API클래스
 - Object
 	- 모든 클래스의 조상 클래스
 	- equals()
 	- toString()
 		* 모든클래스들은 Object를 상속받기때문에 이 두 개의 메소드는 다 있음.
 		* 꼭 오버라이딩을 해줘야 함. 
 - String
 	- .equals()		: 문자열이 같은지 확인
 	- .indexOf()	: 문자열이 있는지 번지알려줌
 	- .contains()	: 문자열이 있는지 있다/없다
 	- .split()		: 구분자를 기준으로 문자열을 추출하여 배열로 만듬
 	- .length()		: 문자열의 길이를 확인
 	- .replace(A,B)	: 문자열A를 B로 바꿈
 	- .toUpperCase(): 문자열을 대문자로 바꿈
 	- .toLowerCase(): 문자열을 소문자로 바꿈
 	- .trim()		: 문자열사이의 공백을 제거
 	- .subString() 	: ()를 이용해 부분값만 출력
 	- .compareTo()	: 숫자, 문자열 비교
 	- .valueOf() 	: 괄호안을 문자열로 만듬
 	
 - Math
 	- Math.abs()	: 절대값구하는 코드
	- Math.ceil()	: 소수점 올림하는 코드
	- Math.floor()	: 내림하는 코드
	- Math.rint() 	: 가까운 정수값의 "실수"
	- Math.round()	: 반올림한 정수값
	- Math.max()	: 최대값
	- Math.min() 	: 최소값
	- Math.random() : 0보다 크거나 같고 1보다 작은 임의 "실수"값을 생성하는 메소드
	- Math.pow(a,b) : a의 b제곱
	- Math.sqrt(a) 	: 루트 a
 
 - Date
 	- 날짜를 문자열로
 	- 문자열을 날짜로
 	
 - Calendar
 	- 달력
 	- 년, 월, 일, 시, 분, 초 .. 등 다양한 값들을 확인할 수 있음
 	- 추상클래스
 	
제네릭클래스
 	- 클래스의 멤버변수 또는 메소드의 타입이 객체를 선언할 때 결정되는 클래스
 	- <> 안에 클래스명이 필요. 생략하면 <Object>를 한 것과 같음
 
컬렉션 프레임워크
 - 인터페이스 : List, Set, Map
 - 데이터를 쉽게 관리하기 위해서 만들어 놓은 인터페이스	
	- List
		- 순서를 보장하며 값을 저장
		- 값이 중복될 수 있음
		- 향상된 for문을 이용할 수 있음
		- Iterator를 이용하여 값들을 가져올 수 있음(but, 꼭 사용하지 않아도 됨)
			*향상된for문, for문 등을 이용해서 값을 확인할 수 있음
		- 구현클래스
			1) ArrayList 	: 배열된 리스트
			2) LinkedList	: 연결되어있는 리스트
		- 멤버메소드 
			.add() 			: 리스트에 추가
			.get(번지)		: 번지에 있는 값을 가져옴
			.size() 		: 현재의 사이즈(지금까지 값이 얼마나 들어가있는지)를 알 수 있음 => size로 쓰고 length아님, 소괄호()있음
			.set(번지,값) 	: 번지에 값을 설정(덮어쓰기)
			.indexOf(값) 	: 값이 리스트에 있는지 없는지 확인하여 있으면 번지를 없으면-1을 반환
			.contains(값)	: 값이 리스트에 있는지 없는지 확인하여 알려주는 메소드(true,false),              equals()를 이용 
			.remove(번지) 	: 해당 번지의 값을 제거
			.remove(값)  	:  값과 일치하는 내용을 제거
			.clear() 		: 리스트를 (전체) 비움
			.isEmpty() 		: 리스트가 비어있는지 알려주는 코드 (true,false)
	- Set
		- 값이 중복 불가능, 순서보장X
		- 구현클래스
			1)HashSet
		- 멤버메소드
			 .add(객체) 		: set에 객체를 추가 => list는 add(객체), add(번지,객체)두개였는데 Set은 순서보장을 안해서 (객체) 1개밖에없음
			 .size()		: set의 크기
			 .contains(객체) : 객체가 있는지 없는지 확인   //indexOf()없음 => 번지가 없으니깐 ㅋ
			 .isEmpty()		: set이 비었는지 아닌지 확인
			 .remove()		: 객체를 삭제하고 삭제 성공 여부를 알림 => 삭제하려는 객체가 없으면 실패할 수 있음. 리턴타입 boolean (true/false)
			 .clear()		: 전체비움
		- (무조건) Iterator를 이용하여 반복문을 사용해야 값들을 가져올 수 있음
			*List에 있는 get()메소드가 없기떄문에 Iterator를 이용하지 않고는 값을 확인할 수 없음
			
	- Map
		- 두 종류의 데이터를 저장(Key와 Value)
 		- Key는 중복되지 않고, Value는 중복될 수 있음
 		- 순서를 보장하지 않음
 		- 이미 있는 key값에 중복으로 데이터를 넣으면 최신 데이터로 덮어씀(=>최근에 넣은 값이 마지막 데이터) 
 		- 값들을 확인하기 위해 Set으로 변환 시켜야 함
 			- key값들을 Set으로 만들어서 확인
 			- Entry라는 클래스를 이용하여 Set으로 만들어서 확인
 		- 멤버메소드
 			.put(key, value) 	: key와 value의 값을 저장 => key라는 이름에 value라는 값을 저장, key의 값이 중복되지 않으면 null을 리턴하고, 중복되면 이전에 저장된 value값을 리턴
 			.containsKey(객체) 	: key값에 객체와 일치하는 정보가 (boolean)있는지true 없는지false
 			.containsValue(객체) : value값에 객체와 일치하는 정보가  (boolean)있는지true 없는지false
 			.get(객체)			: key값이 객체와 일치하는 정보의 value값을 가져옴
 			출력방법1:  keySet()	: 맵의 key값들을 하나의 Set으로 만들어주는 메소드
 			Key값들을 Set으로 만든 후, Iterator사용
 			출력방법2: entrySet() : Entry클래스를 이용한 Set을 변환
 			key값과 value값을 가지는 하나의 클래스인 Entry클래스를 이용
 		- 구현
 			1)HashMap