티스토리 뷰

 1. Enum 열거타입 변수

 

 서로 연관된 상수들의 집합으로 정의 가능. Enum 열거타입도 하나의 데이터 타입이므로 변수를 선언하고 사용해야 한다.

 예) Week today = Week.MONDAY; == ( Enum 열거타입 변수 = Enum 상수 )

 위에 코드는 Week Enum 열거타입을 가지는 today라는 변수를 생성하여 Enum 상수를 대입한 코드이다.

 Enum 상수는 Enum 열거 타입의 객체라고 생각하면 된다. 그렇기 때문에 today는 Stack 영역에서 Enum 상수의 주소값을 가지고 있으며,

 Enum 상수는 Heap 영역에서 Enum 열거타입의 객체를 가지고 있다.


2. Enum의 장점


 - 입력에 대한 유효성 체크가 가능 

 - 코드 유지보수 시, (개발 내용 추가) 변경하는 범위가 최소화

 - 코드의 중복성 제거가능

 - 데이터들간의 연간 관계 표현가능


 위에 명시된 장점을 아래 코드를 통해 간단히 확인 가능
 아래 코드를 간단히 설명하자면, 점의 갯수를 확인해서 직선, 삼각형, 사각형 객체를 생성하는 팩토리 메소드이다.

 아래 코드는 다음과 같은 문제가 있다.

  - 점의 갯수를 확인하고, 객체를 생성하는 코드가 중복적으로 사용

  - 오각형, 육각형 ... 십오각형 등 도형이 추가될때마다 if문이 계속해서 증가하므로 유지보수 어려움

  - 점의 갯수를 통한 예외처리가 반드시 필요  

package coordinate;

import java.util.List;

public class FigureFactory {
    static Figure getInstance(List points) {
        if (points.size() == 2) {
            return new Line(points);
        }

        if (points.size() == 3) {
            return new Triangle(points);
        }

        if (points.size() == 4) {
            return new Rectangle(points);
        }

        throw new IllegalArgumentException("유효하지 않은 도형입니다.");
    }
}

 그래서 아래와 같이 enum 열거타입을 활용해서 개발을 구현했다.

 각 도형들을 FigureType 이라는 Enum 열거타입으로 지정하여, LINE, TRIANGLE, RECANGLE이라는 Enum 상수를 생성했다.

 그리고 Enum 상수는 생성자를 이용해서 각각의 점의 갯수(countOfPoint)를 초기화 했다. 

 코드를 보면 인스턴스 변수, 생성자, 메소드를 확인할 수 있고, Enum 상수를 객체라고 하는 이유도 알 수있다.  

 먼저 중복된 if문을 제거하는 로직을 확인해보자! Map에는 Enum Type을 Key, 각각의 도형 객체를 생성하는 클래스의 객체를 value로 가지고 있다.

  → 새로운 도형이 추가되면, 도형 객체를 생성하는 로직은 변경할 필요는 없고, Map에 새로운 도형만 추가하면 된다

 그래서! FigureType의 메소드 getFigureByValue()에 점의 갯수를 매개변수로 전달하여, 점의 갯수에 맞는 Enum 상수 객체를 반환하고, 그 값을 키로 이용하여

 도형 객체를 생성하는 객체를 사용할 수 있게 구현되었다. (말로 표현이 안된다.. 코드를 보면 알 수 있다!)

 getFigureTypeByIndex() 메소드도 같은 기능을 수행하지만, enum이 제공하는 다양한 기능들을 사용해보기 위해 다르게 구현을 해봤다.

  → 새로운 도형이 추가되면, 도형 객체를 생성하는 로직은 변경할 필요는 없고, Map에 새로운 도형만 추가하면 된다!

   ▶ 코드 유지보수 시, (개발 내용 추가) 변경하는 범위가 최소화

  → 오직 Map에 매핑된 값들로만 도형 객체를 생성할 수 있기 때문에 Map에 매핑되지 않는 점6개인 육각형은 사용자가 잘못 입력해도 생성될 수 없다!

    입력에 대한 유효성 체크가 가능 

  → Enum 생성자를 통해 각 도형의 점의 갯수를 정의했기 때문에 if문으로 체크하지 않아도 enum을 통해 점의 갯수에 따른 객체 생성 가능

    코드 중복성 제거 및 도형간의 데이터 관계 정의 가능

 그리고 람다식과 익명 구현객체를 사용하면 더욱 깔끔한 코드 구현가능!

package enumPractice;

import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Map;

public class FigureFactory {

    public FigureFactory() {

    }

    public enum FigureType {
        LINE(2), TRIANGLE(3), RECTANGLE(4);

        private int countOfPoint;

        // Method1 - 생성자를 이용해서 enum 객체 값 할당 가능
        FigureType(int countOfPoint) {
            this.countOfPoint = countOfPoint;
        }

        // Method2 - valueOf(String str) : 문자열 str에 해당하는 enum 객체 반환
        public FigureType getFigureTypeByName(String name) {
            return valueOf(name);
        }

        public static FigureType getFigureTypeByIndex(int countOfPoint) {
            // Method3 : values() : enum 객체를 하나씩 반환
            for(FigureType figureType : values()) {
                /* Method4 - ordinal() : enum 객체의 index 값을 반환 */
                if(figureType.ordinal() + 2 == countOfPoint)  {
                    return figureType;
                }
            }
            throw new InputMismatchException("잘못입력하셨습니다.");
        }

        public static FigureType getFigureTypeByValue(int countOfPoint) {
            for(FigureType figureType : values()) {
                if(figureType.isFigureType(countOfPoint)) {
                    return figureType;
                }
            }
            throw new InputMismatchException("잘못입력하셨습니다.");
        }

        public boolean isFigureType(int countOfPoint) {
            return this.countOfPoint == countOfPoint;
        }

        public String getName() {
            return name();
        }
    }
    static private Map mappingFigure = new HashMap<>();
    static {
        mappingFigure.put(FigureType.LINE, new FigureCreator() {
            @Override
            public Figure create(List points) {
                return new Line(points);
            }
        });

        mappingFigure.put(FigureType.TRIANGLE, (points -> new Triangle(points)));

        mappingFigure.put(FigureType.RECTANGLE, (Rectangle::new));
    }
    static Figure getInstance(List points) {
        return mappingFigure.get(FigureType.getFigureTypeByValue(points.size())).create(points);
    }
}


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함