개요 목적
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
'Web Sever 개발과 CS 기초 > 자바' 카테고리의 다른 글
동시성 문제에 대한 이해와 Java의 Lock 객체 종류 (0) | 2022.09.30 |
---|---|
Thread와 Process Fork 차이 (0) | 2022.09.30 |
REST 특징과 REST API 설계 규칙 (0) | 2022.09.18 |
JAVA 간단한 HTTP Server 직접 구현하기. (0) | 2022.09.04 |
Lombok에 대한 이해와 기능 (0) | 2022.08.07 |