본문 바로가기

Web Sever 개발과 CS 기초/자바

Java Enum 사용 방법 (+Lombok, 추상 메소드)

개요 목적

Enum이란 연관된 상수들의 관리를 도와주는 도구이다.

Enum의 역할과 사용 방법을 예시를 통해서 알아본다.

추가로, Enum의 확장 기능인 Lombok과의 결합, 추상 메소드 활용 방법을 설명한다.

Class 상수 → Enum 상수로 변경하기.

상황 : 메세지 타입에 따른 다른 정보를 저장하고 싶다.

<일반 Class를 사용할 경우>

public class Type {
    public final int RESISTERNAME = 1111;
    public final int MESSAGETOSERVER = 2222;
    public final int MESSAGETOCLIENT = 3333;
    public final int CLIENTCLOSEMESSAGE = 4444;

    public Type() {
    }

    public int getRESISTERNAME() {
        Objects.requireNonNull(this);
        return 1111;
    }

    public int getMESSAGETOSERVER() {
        Objects.requireNonNull(this);
        return 2222;
    }

    public int getMESSAGETOCLIENT() {
        Objects.requireNonNull(this);
        return 3333;
    }

    public int getCLIENTCLOSEMESSAGE() {
        Objects.requireNonNull(this);
        return 4444;
    }
}

<Enum을 적용할 경우>

public enum Type {
    RESISTERNAME(1111,"a"),
    MESSAGETOSERVER(2222,"b"),
    MESSAGETOCLIENT(3333,"c"),
    CLIENTCLOSEMESSAGE(4444,"d");

    private final int intValue;
    private final String stringValue;

    Type(int intValue, String stringValue) {
        this.intValue = intValue;
        this.stringValue = stringValue;
    }

    public int getIntValue() {
        return intValue;
    }

    public String getStringValue() {
        return stringValue;
    }
}

Enum 사용의 장점

  • 코드가 간결해진다
  • 하나의 상수에 2개 이상의 정보를 넣을 수 있다.

Class의 public final int RESISTERNAME = 1111; 경우, RESISTERNAME에 하나의 정보 밖에 담지 못한다.

하지만, Enum RESISTERNAME(1111,"a")의 경우, 두 개 이상의 정보를 넣어 관리할 수 있다.

  • 상수 타입간의 비교가 쉬워진다.

Class의 경우, 상수 안의 데이터 형식에 따라 비교하는 방법이 달라진다.

반면 Enum의 상수의 경우, if(Type. RESISTERNAME ≠ MESSAGETOSERVER)같은 일관되고 쉬운 형식으로 비교를 할 수 있는 장점이 있다.

Enum에 Lombok 적용하기.

Lombok을 적용하면 Enum의 코드를 더 간결하게 만들 수 있다.

Lombok에 대한 이해는 해당 블로그 글을 확인하면 된다. [백엔드/자바] - Lombok에 대한 이해와 기능

<Enum에 Lombok을 적용한 코드>

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum Type1 {
    RESISTERNAME(1111,"a"),
    MESSAGETOSERVER(2222,"b"),
    MESSAGETOCLIENT(3333,"c"),
    CLIENTCLOSEMESSAGE(4444,"d");

    private final int intValue;
    private final String stringValue;
}

상수에 저장되는 인스턴스 필드만 작성하고,

@Getter, @AllArgsConstructor 을 호출하면,

Enum Type을 쉽게 구성할 수 있다.

추상 메소드 추가하기

Enum상수에 단순히 필드가 아니라, 메소드를 추가할 수 있다.

메소드를 추가하는 조건은 enum 상수가 해당 추상 메서드를 반드시 구현해야만 하게 해당 메서드에 abstract 제한자를 붙혀야 한다

또한, 추상 메서드에서 enum 상수에 있는 변수를 참조하기 위해서 protected 제한자를 사용해야한다.

 

상황: 리스폰스 코드에 따라, 지정된 메소드를 저장하고 싶다.

<일반 Class를 사용할 경우>

import java.io.DataOutputStream;
import java.io.IOException;

public class ResponseStateCode {
    public static void response200OK(DataOutputStream dataOutputStream) throws IOException {
        String responseStateMessage = "HTTP/1.1 200 OK\r\n\r\n";
        dataOutputStream.write(responseStateMessage.getBytes("UTF-8"));
    }

    public static void response201Created(DataOutputStream dataOutputStream) throws IOException {
        String responseStateMessage = "HTTP/1.1 201 Created\r\n\r\n";
        dataOutputStream.write(responseStateMessage.getBytes("UTF-8"));
    }

    public static void response204NoContent(DataOutputStream dataOutputStream) throws IOException {
        String responseStateMessage = "HTTP/1.1 204 No Content\r\n\r\n";
        dataOutputStream.write(responseStateMessage.getBytes("UTF-8"));
    }

    public static void response404NotFound(DataOutputStream dataOutputStream) throws IOException {
        String responseStateMessage = "HTTP/1.1 404 Not Found\r\n\r\n";
        dataOutputStream.write(responseStateMessage.getBytes("UTF-8"));
    }
}

<Class ResponseStateCode를 사용하는 방법>

 

<Enum을 활용하기>

import java.io.DataOutputStream;
import java.io.IOException;

public enum ResponseStateCode2 {
response200OK{
        @Override
        void response(DataOutputStream dataOutputStream) throws IOException {
            String responseStateMessage = "HTTP/1.1 200 OK\r\n\r\n";
            dataOutputStream.write(responseStateMessage.getBytes("UTF-8"));
        }
    },
response201Created{
        @Override
        void response(DataOutputStream dataOutputStream) throws IOException {
            String responseStateMessage = "HTTP/1.1 201 Created\r\n\r\n";
            dataOutputStream.write(responseStateMessage.getBytes("UTF-8"));
        }
    },
response204NoContent{
        @Override
        void response(DataOutputStream dataOutputStream) throws IOException{
            String responseStateMessage = "HTTP/1.1 204 No Content\r\n\r\n";
            dataOutputStream.write(responseStateMessage.getBytes("UTF-8"));
        }
    },
response404NotFound{
        @Override
        void response(DataOutputStream dataOutputStream) throws IOException{
            String responseStateMessage = "HTTP/1.1 404 Not Found\r\n\r\n";
            dataOutputStream.write(responseStateMessage.getBytes("UTF-8"));
        }
    };

    abstract void response(DataOutputStream dataOutputStream) throws IOException;
    }
}

<Enum ResponseStateCode를 사용하는 방법>

이런 방식으로 Enum 상수가 가진 이점을 가지면서,

상수에 따른 메소드 정보를 저장하고 쉽게 호출 할 수 있다.


reference

https://effortguy.tistory.com/24?category=839018