프로그램을 작성하다 보면 상태를 나타내는 다양한 상수들이 존재한다. 이러한 상수들은 프로그램을 작성할 당시엔 어떤 의미인지 바로 알 수 있지만. 시간이 지난 뒤 보면 잊어버리는 경우가 많다. 이럴때 enum 타입을 이용하면 가독성을 높일 수 있다.
enum TetrisState{Running, NewBlock, Finished}
//enum 타입는 클래스와 비슷해보인다.
public static void main(String[] args){
TetrisState state;
state = TetrisState.Running
if (state == TetrisState.Running){...}
위와 같이 정의된 열거체의 첫 번째 상숫값은 0부터 설정되며, 그다음은 바로 앞의 상숫값보다 1만큼 증가되며 설정된다.
위 코드를 보면 상태변수를 표현함에 있어 enum을 쓰지 않고도 여러 변수를 이용해도 될것 같지만, enum은 변수에 우리가 기대하는 상수값이 할당 되었는지에 대한 유효성 검사를 하는 로직이 존재한다.
public static int final Running = 0;
public static int final NewBlock = 1;
public static int final Finished = 2;
Running = 1;//다른 상수 할당 가능
enum TetrisState{Running, NewBlock, Finished}
Tetris state;
state = Tetris.Running;
state = 1;//에러발생
enum은 위에서 단순히 열거했던 방식으로 선언해도 되지만 불규칙한 상수 값을 할당하려면 아래와 같이 불규칙한 상수값을 할당할 수 있도록 생성자와 인스턴스 변수를 생성해야 된다.
enum TetrisState{
Running(0), NewBlock(100), Finished(30);
// Running(0): public static final TetrisState Running = new TetrisState(0);
//이러한 문법이 생략 되어있다.
private final int value;
private TetrisState(int value) {this.value = value;}
public int value() {return value;}
}
자바 언어에는 abstract 선언을 하면 한 클래스의 안에서 하나 이상의 정의 되지 않은 method를 포함하는 것을 허용한다.
abstract class는 인스턴스를 생성할 수 없다. 반드시 abstract class를 상속 받은 서브클래스가 abstract method를 오버라이딩해야 인스턴스 생성이 가능하다.
//부모 클래스
public abstract class parent{
public void run() {preprocessing(); postprocessing();}
public abstract void preprocessing();
public abstract void postprocessing();
}
//자식 클래스
public class child extend parent{
public void preprocessing(){...//do something else}
public void postprocessing(){...//do something else}
}
public interface DoHandler {void do(char key);}
public interface UndoHandler {void undo(char key);}
public class Action implement DoHandler, UndoHandler{
public void do(char key){...//do something else};
public void undo(char key){...//do something else};
}
//interface
interface ActionHandler {
public boolean run(Tetris t, char key) throws Exception;
}
class OnLeft implements ActionHandler {
public boolean run(Tetris t, char key) throws Exception {
t.left = t.left - 1;
return t.anyConflict(true);
}
};
class OnRight implements ActionHandler {
public boolean run(Tetris t, char key) throws Exception {
t.left = t.left + 1;
return t.anyConflict(true);
}
};