열거형(Enumeration)
- 사용법 : [접근 제한자] enum [이름] {...}
- 의의 : 어떠한 대상이 프로그램 실행 중에 더 이상 추가되거나 삭제되지 않으며 그 종류나 개수가 상당히 고정되어있다고 판단되면 열거형으로 만드는 것이 좋다. (스타의 종족, 로그인 결과 등등)
- 명명법 : 열거형의 원소는 Upper Snake Case(전체 대문자, 단어간 구분은 언더스코어(_) 방식으로 명명하여 콤마로 구분하여 열거한다.
- 사용이유 : 오류를 극한으로 줄일 수 있고 프로그램이 실행시 부터 종료시 까지 불변하는 것들은 열거형으로 만들어야 한다.

위의 사진과 같은 형식으로 클래스 생성시 enum을 클릭 후 Object나누는 것과 같이 콤마(,)로 구분한다.
추상클래스(Abstract Class)
- 사용법 : [접근 제한자] abstract class [이름]{...}
- 반드시 추상 메서드를 가져야 하는 것은 아니다. 주로 추상 메서드를 가질 때 클래스를 추상화 한다.
- 추상 클래스는 일반적으로 개발자가 직접 객체화하지 못(안)한다.(가능은 하다.)

위의 사진에서 선언과 동시에 값 초기화 이말의 정확한 뜻을 알고 싶어서 구글링을 한 결과.
여기서 중요한 사실은 멤버변수를 상수로 지정할 경우 Setter를 통해서 값지정을 할 수 없다는 점도 유심히 봐야한다. 위에서 말한것 처럼 전역변수는 변수 선언시 값이 바로 초기화 되기때문에 사실상 그대로 사용하면 된다.
사용법 : [접근 제한자] abstract [반환타입]...
- 메서드의 존재 자체만 명시하고 구현부의 구현을 본클래스를 상속 받는 자식 클래스에게 맡기기 위해 사용.
- 단, 추상 메서드를 한 개 이상 가지는 클래스는 반드시 추상 클래스(Abstract Class)여야 한다.
추상 클래스를 왜 사용할까?
클래스간 분명하게 나누어진다면 좋겠지만 아쉽게도 개발에서는 각 클래스마다 필요한 부분이 반드시 있을 것이다. 이러한 것들을 충족시키기 위해 다중상속이 되지 않는 Java에서는 추상메서드를 지원한다.

instanceof
(객체 instanceof 타입){ }
: 객체가 명시한 타입으로 형변환 될 수 있는가? 에 대한 boolean값을 반환한다.
위의 명시된 target은 Unit 타입의 객체이고 IFly 타입과 IAttackAir 타입으로 형변환이 되는가? 에대한 참/거짓 여부를 묻는 것이다.
풀어서 해석하면 target이 IFly와 !IAttackAir타입을 가지고 있냐 즉, 공격대상은 공중을 나는데 자기자신의 객체는 공중공격을 하지 못하는 타입이라면 "공격할 수 없다"라는 값이 출력된다.
interface
- 의의 : 클래스간 상속은 1:1이기 때문에(Java 기준) 어떠한 클래스에 속성을 부여하여 다형성을 보다 강화 시키고자 사용한다.
- 명명법 : 대문자 + 파스칼 케이스(주로 형용사), 혹은 그냥 파스칼 케이스
- 멤버 변수 :
- 접근제한자는 반드시 public , 생략해도 public이며 기본적으로 생략한다.
- 반드시 정적인 상수.
- 멤버 메서드 :
- 접근 제한자는 반드시 public -> 전역적으로 사용하기 위해서 이다.
- 기본적으로 추상적(구현부를 가지지 않는다.) → 자식의 동적인 구현에 따라 이루어지게 하기 위해서 추상적이다.

변수 지정할때는 public static final
메서드 지정할때는 public abstract
이 두가지경우는 한몸이라고 보면 될것 같다.
(물론 인터페이스 안에서 생성될 경우에만 속한다.)
오늘의 KeyPoint
참고로 interface는 콤마(,)로 구분하여 여러개를 implements할 수있다.
명심할것.
Java는 정말정말 어렵다.
열심히 살자.