* Interface
- 다중 상속의 장점(기능 확장이 편리하다 ↔ 단점 : 객체의 크기가 필요 이상 커질 수 있음, 부모가 모호함)을 사용하기 위해.
- 약결합(loosely coupled)을 구현하여 객체 간의 유연성을 높이기 위해서.

- 작성법)
접근지정자 interface 인터페이스명 extends 부모인터페이스명 ,,, {}
접근지정자 - public : 외부 패키지에서 접근 가능 / package : 패키지 내부에서만 접근 가능
- 인터페이스는 객체화가 되지 않는다. (생성자 없음)
public interface 인터페이스명{
상수
abstract method(); // 구현클래스가 반드시 Override 해야 할 일의 목록
default method(){} // 인터페이스가 기능을 제공해야 할 때(JDK 1.8에서부터 지원)
}
- 클래스는 implements 키워드를 사용하여 인터페이스를 구현하여 사용.
public class 클래스명 implements 인터페이스명{
abstract method의 override!!
}


- 클래스에서 인터페이스를 구현한다. 구현하는 인터페이스 상속 줄에 있는 모든 abstract method는 구현 클래스에서 반드시 Override 해야 한다.
* inner class
- 이벤트를 처리하기 위한 목적으로 만들어진 클래스.
- JDK 1.2에서부터 지원.
- 안쪽 클래스에서는 바깥 클래의 자원을 마음대로 사용할 수 있지만, 바깥 클래스에서는 안쪽 클래스의 자원을 사용하려면 반드시 객체화하여 사용한다.
- 안쪽 클래스를 인스턴스 변수처럼 사용할 때 정의.

* 컴파일하면 bytecode가 생성된다.
- 바깥클래스명.class -> 바깥클래스명$안쪽클래스.class가 생성된다.
- $ : 자바 언어 외부에서 자바 언어 내부를 지칭하는 기호
* 객체화
1. 바깥 클래스의 객체화
바깥클래스명 객체명 = new 바깥클래스생성자();
Outter out = new Outter();
2. 바깥 클래스의 객체를 사용하여 안쪽 클래스를 객체화
바깥클래스명.안쪽클래스명 객체명 = 바깥클래스의객체명.new 안쪽클래스의 생성자();
Outter.Inner in = out.new Innner();
// instance 영역은 바깥클래스의 객체명 대신 this를 사용할 수 있다. 생략도 가능하다.
Outter.Inner in = this.new Inner();
OUtter.Inner in = new Inner();
* Nested Class
- 안쪽 class를 static 변수처럼 사용할 때. (객체화하지 않고 사용하기 위해 생성. instance 영역을 만들지 않는다.)
- 안쪽 클래스는 모두 static으로 만든다.
class Test{
// instance 영역
int i;
public void test(){
}
static class In{
// instance 영역
static int j;
public static void temp(){
}
}
}

* Local Class
- method 안에서 class를 정의할 때.
- 생성된 인스턴스는 method 안에서만 사용된다.
- local class에서는 지역변수를 사용할 때 final이 붙어 있는 지역변수만 사용할 수 있다.
- class를 지역변수처럼 사용할 때 사용.

- 컴파일을 수행하면 바깥클래스명.class, 바깥클래스명$1로컬클래스명.class 두 개의 바이트가 생성된다.
* anonymous inner class
- 이름이 없는 클래스.
- 클래스를 arguments로 사용할 때.
- 클래스 파일을 별도로 생성하지 않고, 부모 클래스를 사용하여 객체로 만들어야 할 때.

- 컴파일을 수행하면 외부클래스명.class, 외부클래스명$1.class 두 개의 bytecode가 생성된다.

- method의 parameter가 인터페이스(클래스)를 선언하면 해당 인터페이를 구현하는 클래스를 만들고(is a) 객체를 생성하여 arguments로 넣어줘야 한다. => 이 method가 프로그램 실행 중 딱 한 번만 호출되는 상황이라면 anonymous inner class 사용
* 자주 사용하는 class들
- 문자열 관련 : String, StringBuffer, StringBuilder, StringTokenizer
- 수학 : Math
- 날짜 : Date, Calendar
- formatter : SimpleDateFormat, DecimalFormat
- 난수 : Random
- 지역 : Locale
* String
- 짧은 문자열을 다룰 때 사용
- 문자열 안에서 특정 문자를 기준으로 잘라내어 배열로 저장할 때.
String csvData = "Java,Oracle,JDBC,HTML";
// Comma Seperated Value : , 또는 일정한 문자로 구분되어진 값
String[] arr = csvData.split(","); // "구분할문자열"
* Math
- 생성자가 없으므로 객체화될 수 없는 클래스.
- 객체 값을 저장하지 않고 method에 입력값으로만 업무를 처리하는 클래스
// 절대값
양수 = Math.abs(음수);
// 반올림
정수형 변수명 = Math.round(실수);
// 올림
실수 = Math.ceil(실수);
// 내림
실수 = Math.floor(실수);
// 절사 -> method 없음
(int)실수
// 난수
double = Math.random();
// 난수는 보통 아래와 같이 사용
(int)(Math.random()*발생할수)