자바프로그래밍(3)

이상민·2023년 10월 18일
0

Enum 타입

프로그램을 작성하다 보면 상태를 나타내는 다양한 상수들이 존재한다. 이러한 상수들은 프로그램을 작성할 당시엔 어떤 의미인지 바로 알 수 있지만. 시간이 지난 뒤 보면 잊어버리는 경우가 많다. 이럴때 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을 쓰지 않고도 여러 변수를 이용해도 될것 같지만, enum은 변수에 우리가 기대하는 상수값이 할당 되었는지에 대한 유효성 검사를 하는 로직이 존재한다.

  • 변수사용

public static int final Running = 0;
public static int final NewBlock = 1;
public static int final Finished = 2;

Running = 1;//다른 상수 할당 가능
  • enum사용
enum TetrisState{Running, NewBlock, Finished}



Tetris state;
state = Tetris.Running;
state = 1;//에러발생

enum 문법

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 Class 타입

  • 자바 언어에는 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}
    
}

Interface 타입

  • 자바는 다중 상속을 지원하지 않는다(자식 클래스가 여러 부모 클래스로부터 상속 받는 것)
  • 대신 자바는 interface 개념을 사용하여 간접적으로 다중 상속 개념을 지원함
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
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);
    }
};
profile
잘하자

0개의 댓글