Java의 유한 상태 기계

Sheeraz Gul 2023년10월12일
Java의 유한 상태 기계

유한 상태 기계는 패턴을 인식하는 데 사용됩니다. 이 튜토리얼은 Java에서 유한 상태 머신을 구현하는 방법을 보여줍니다.

Java의 유한 상태 기계

유한 자동 기계라고도 하는 유한 상태 기계는 기호 문자열을 입력으로 받은 다음 그에 따라 상태를 변경합니다. 전환은 입력에서 원하는 기호를 찾을 때 발생하며 전환 중에 오토마타는 동일한 상태를 유지하거나 다음 상태로 변경할 수 있습니다.

Java에서 유한 상태 머신을 구현하려면 아래 단계를 따르십시오.

  • 먼저, 유한 상태 기계를 모델링하는 래퍼 클래스를 만듭니다.

    해당 래퍼 클래스에는 구체적인 상태 개체의 배열, 현재 상태에 대한 인덱스 및 상태 전환 테이블이 포함됩니다.

  • 다음으로 모든 클라이언트 요청은 현재 상태 개체에 위임됩니다.
  • 그런 다음 구체적인 상태를 교환할 수 있도록 상태 기본 클래스를 만듭니다.

    해당 상태 기본 클래스는 모든 상태의 기본 동작을 지정합니다.

  • 마지막으로 상태 파생 클래스는 필수 메시지만 재정의합니다.

위의 단계를 기반으로 Java에서 유한 상태 머신을 구현해 보겠습니다.

package delftstack;

// Step 1. create a wrapper class which models the finite state machine.
class Java_FSM {
  // Step 2. wrapper class states
  private FSM_State[] FSM_States = {new State1(), new State2(), new State3()};
  // Step 4. wrapper class transitions
  private int[][] FSM_Transition = {{0, 1, 2}, {2, 2, 0}, {1, 0, 2}};
  // Step 3. wrapper class current state
  private int Current_State = 0;

  private void FSM_Next(int Message) {
    Current_State = FSM_Transition[Current_State][Message];
  }

  // Step 5. all client requests will be delegated to the current state object.
  public void FSM_ON() {
    FSM_States[Current_State].FSM_ON();
    FSM_Next(0);
  }

  public void FSM_OFF() {
    FSM_States[Current_State].FSM_OFF();
    FSM_Next(1);
  }

  public void FSM_ACK() {
    FSM_States[Current_State].FSM_ACK();
    FSM_Next(2);
  }
}

// Step 6. Create a state base class to make the concrete states interchangeable.
// Step 7. state base class will specify the default behavior of all states
abstract class FSM_State {
  public void FSM_ON() {
    System.out.println("An error occurred");
  }

  public void FSM_OFF() {
    System.out.println("An error occurred");
  }

  public void FSM_ACK() {
    System.out.println("An error occurred");
  }
}

class State1 extends FSM_State {
  public void FSM_ON() {
    System.out.println("State1 + ON  = State3");
  }

  public void FSM_OFF() {
    System.out.println("State1 + OFF = State2");
  }

  public void FSM_ACK() {
    System.out.println("State1 + Ack = State1");
  }
}

class State2 extends FSM_State {
  public void FSM_ON() {
    System.out.println("State2 + ON  = State1");
  }

  public void FSM_OFF() {
    System.out.println("State2 + OFF = State3");
  }
}

class State3 extends FSM_State {
  // Step 8. state derived class will only override the messages it require to
  public void FSM_ON() {
    System.out.println("State3 + ON  = State2");
  }
}

public class Finite_State_Machine {
  public static void main(String[] args) {
    Java_FSM JavaFSM = new Java_FSM();
    int[] Messages = {1, 1, 2, 2, 0, 0, 1, 2};
    for (int Message : Messages) {
      if (Message == 0) {
        JavaFSM.FSM_ON();
      } else if (Message == 1) {
        JavaFSM.FSM_OFF();
      } else if (Message == 2) {
        JavaFSM.FSM_ACK();
      }
    }
  }
}

위의 코드는 입력 메시지에 따라 상태를 변경하는 유한 상태 머신을 보여줍니다. 출력 참조:

State1 + OFF = State2
State2 + OFF = State3
An error occurred
An error occurred
State3 + ON  = State2
State2 + ON  = State1
An error occurred
State1 + Ack = State1
작가: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook