## 커리큘럼(12-30/변경)
```
01. Java (v)
02. git 
03. Database
04. Jsp [Server]

05. 미니프로젝트 (3W)
06. HTML,CSS  
07. JS

08. SpringFramework , SrpingBoot
09. React JS [Front-end]
10. 중간프로젝트 (1M)
11. Linux 명령어
12. AWS 클라우드
13. DevOps - Docker
14. App - Android
15. 최종프로젝트 (1M)
```
---
# 인터페이스(Interface)
<img src="https://buly.kr/GvmIp92"></img>

+ 인터페이스 선언된 변수는 public static final을 생략하더라도 컴파일 과정에서 자동으로 붙음.
+ 인터페이스의 메서드를 추상메서드 형식으로 선언하면 abstract를 붙이지 않더라도 자동으로 컴파일 과정에서 붙음
+ 클래스에서 인터페이스를 구현할 때는 클래스 이름 앞에 implements 키워드 사용

	+ 다중상속 지원
		- 인터페이스는 **다중 상속도 표현**할 수 있음
		- 여러 인터페이스를 동시 구현 가능
		

		```
		public class Basic implements Inter01,Inter02{
			// 인터페이스 상속은(구현) implements키워드 입니다.
			// 여러 인터페이스를 동시에 구현하는게 가능
			@Override
			public void method01() {
				System.out.println("재정의된 메서드 1번 실행");
			}

			@Override
			public void method02() {
				System.out.println("재정의된 메서드 1번 실행");
			}
		}
		// 인터페이스1
		public interface Inter01 {
		
			// 상수와 추상메서드를 가진다.
			double PI = 3.14;  // 인터페이스에 변수 선언시 상수취급\
			void method01(); // 인터페이스에 메서드를 선언하면 자동으로 추상메서드가 됨.
		}
		// 인터페이스2
		public interface Inter02 {
	 		int ABC=123;
	 		void method02();
		}
		```

	+ 메서드 명세서
		- 객체의 사용방법을 정의한 타입으로 객체의 교환성을 높여주기 때문에 다형성을 구현하는 중요한 역할
		- 인터페이스도 **데이터 타입(부모타입)이 될수 있음**
		

		```
		// 인터페이스
		public interface IPet {
			void play();
		}

		// 인터페이스를 상속받는 클래스
		public class GoldFish extends Fish implements IPet{

			@Override
			public void swim() {
				System.out.println("금붕어는 어항에서 수영");
			}

			@Override
			public void play() {
				System.out.println("금붕어는 어항에서 놀아요");
			}
		}

		public class Cat extends Animal implements IPet{

			@Override
			public void eat() {
				System.out.println("고양이는 생선을 먹어요");		
			}

			@Override
			public void play() {
				System.out.println("고양이는 방에서 놀아요");		
			}
		}

		public class Dog extends Animal implements IPet{
			@Override
			public void eat() {
				System.out.println("강아지는 사료먹어");
			}

			@Override
			public void play() {
				System.out.println("강아지는 밖에서 놀아요");
			}
		}

		// main메서드
		public class MainClass {
			public static void main(String[] args) {

				Animal baduk = new Dog();
				Animal navi = new Cat();
				Animal hodol = new Tiger();

				Animal[] arr = {baduk,navi,hodol};

				for(Animal a:arr) {
					a.eat(); // animal처럼 동작됨
				}

				//펫 타입
				IPet[] arr2 = new IPet[3];
				arr2[0]=(IPet)baduk; // 바둑이는 Animal타입이지만, IPet을 구현하고 있어서 상호 형변환이 가능
				arr2[1]=(IPet)navi;
				arr2[2]=new GoldFish();

				for(IPet pet:arr2) {
					pet.play(); // 펫처럼 사용
				}

			}
		}
		```

	+ **인터페이스간에도 상속이 가능**
	+ 인터페이스간에 상속은 **extends를 이용**


	```
	public interface Todo1 {
		// 인터페이스 간에도 상속이 됩니다. - extends 사용
		void method01();
	}

	public interface Todo2 {
		void method02();
	}

	public interface Todo3 extends Todo1,Todo2{
		// 인터페이스 간에도 상속이 됩니다. - extends 사용
		void method03();
	}
	```

## 인터페이스 정리
+ 인터페이스는 **상수** 와 **추상메서드**만을 구성멤버로 가짐

	1. 인터페이스는 기본적으로 다중상속 지원
	2. 자바 인터페이스는 객체의 사용방법을 정의한 타입으로 다형성을 구현하는 매우 중요한 역할을하며 데이터타입(부모타입)이 될수 있음
	3. 사용방법이 동일한 클래스를 만드는 기술

+ 인터페이스의 구현 키워드는 `implements`이며 인터페이스도 `extends`키워드를 사용해 인터페이스 간의 상속 구현 가능
- 
---

# 예외처리
+ 에러에 대한 처리 의미
+ 자바는 예외처리 매커니즘 제공
+ 프로그램에서 문제가 될만한 부분을 예상하여 사전에 **문제가 발생하면 이렇게 처리하라**라고 프로그래밍 하는 것을 예외 처리라고 함
+ 예외에는 **컴파일러 체크 예외**와 **실행 예외(Runtime Exception)**가 존재
	+ **컴파일러 체크 예외**는 자바 소스를 컴파일하는 과정에서 예외 처리 코드를 검사하여 예외 처리코드가 없다면 컴파일 오류가 발생
	+ **실행 예외**는 컴파일하는 과정에서 예외처리 코드를 검사하지 않는 예외 
	
	+ 주요 실행 예외
		1. NullPointerException
			+ 객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수로 객체 접근 연산자인 (.)를 사용했을 때 발생
		2. ArrayIndexOutOfBroundsException
			+ 배열에서 인덱스 범위를 초과하여 사용할 경우 발생
		3. NumberFormatException
			+ 문자열로 되어 있는 데이터를 숫자로 변경하는 경우 발생
		4. ClassCastException
			+ 형 변환은 부모 클래스와 자식 클래스간에 발생하고 구현 클래스와 인터페이스 간에도 발생	
	 
## 예외처리 방법
1. **try ~ catch ~ finally**
	- **try 블록**에는 예외 발생 가능성이 있는 코드 작성
	- try 블록의 코드가 예외 발생 없이 정상 실행되면 catch블록은 실행되지 않음
	- try 내부에서 **예외가 발생**하면 즉시 실행을 멈추고 **catch블록으로 이동하여 예외 처리 코드를 실행**
	- **예외 발생 여부와 상관없이 항상 실행할 내용**이 있다면 **finally 블록 내부에 실행 내용 작성**
	

	```
	try{
		예외 발생 가능성이 있는 코드
	} catch(Exception e){
		// Exception은 모든 예외 처리
		예외 발생시 실행될 코드
	} finally{
		예외가 발생되지 않더라도 반드시 실행될 코드
	}
	```

2. **다중 catch**
	- try 블록 내부는 다양한 종류의 예외가 발생할 수 있으며 **예외가 여러가지 발생**했다면 **다중 catch 블록을 작성**해 예외들을 처리
	- **catch 블록은 위에서부터 차례대로 검색**되므로 **상위 예외 클래스의 catch 블록이 위에 있다면 하위 예외 클래스의 catch블록은 실행되지 않음**
	- **catch()괄호 안에 동일하게 처리하고 싶은 예외를 ``|``로 연결**하면 되며 이 방식을 사용할 때는 두 예외가 상속 관계가 있으면 안됨.
	

	```
	try{
		코드 작성 영역
	}catch(NumberFormatException | NullPointerException e ){
		코드 작성 영역
	}
	```

3. **throws**
	- try ~ catch 구문이 예외가 발생했을 때 직접해결을 하고자 하는 코드라면 **throws는 메서드나 생성자를 호출한 곳으로 예외를 떠넘기는 코드**
	- **예외처리를 직접 수행하지 않고 메서드 호출자에게 예외를 던지는 방법**
	- **throws 키워드가 붙어있는 메서드**는 **반드시 try 블록 내부에서 호출**되어야 하고 **catch블록에서 떠넘겨 받은 예외를 처리**해야 함
	- main도 throws 사용 가능
	

	```
	public static void main(String args[]) throws NumberFormatException{
		~~~
	}
	```

4. **throw**
	+ 사용자가 직접 선언한 예외 클래스나 자바가 제공하는 예외 API에서 **예외를 강제 발생**시키려면 throw 키워드 이용
	+ **예외를 강제 발생시키며 메서드를 강제 종료**

5. 사용자 정의 예외
	- 자바 표준 API에서 제공하는 예외 클래스만으로 다양한 종류의 예외를 표현 할 수 없음
	- 사용자 정의 예외 클래스는 Exception 클래스를 상속하여 사용
	- 사용자 정의 예외 클래스의 이름은 Exception으로 끝나는 것이 좋음
	- 일반적으로 기본생성자와 예외 메시지를 받는 생성자를 만듦
	

	```
	public calss MyException extends Exception{
		public MyException(){}

		public MyException(String message){
			super(message);
		}
		.....
	}
	```