ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 초기화블록
    개발/java 2021. 12. 25. 17:30

    초기화 블록은 클래스가 생성될때 무조건 수행되는 블록입니다.

    종류에는 클래스 초기화블록 , 인스턴스 초기화 블록이 있습니다. 

    이름에서도 알수 있는듯이 클래스 초기화 블록은 클래스 호출 시 한번 , 인스턴스 초기화 블록은 인스턴스 생성시 마다 수행됩니다. 

    또한 클래스 초기화 블록은 static을 이용하기에 static 초기화 변수라고 이름을 나타내기도 합니다. 

     

    예를 보겠습니다. 

    방문시 방문수를 출력하는 클래스 입니다.

    public class Visit {
        int people;
        static
        {
            System.out.print("클래스 초기화변수로 방문하였습니다.");
        }
        {
            System.out.print("인스턴스 초기화변수로 방문하였습니다.");
        }
        public Visit() {
            System.out.print("(0명)");
        }
    
        public Visit(int people) {
            this.people = people;
            System.out.print("("+people+"명)");
        }
    
    }
    
       public static void main(String[] args) {
    
            System.out.println(new Visit());
            System.out.println();
            System.out.println(new Visit(1));
        }

    이 경우  출력 값은 아래와 같은 순서로 출력이 됩니다. 

    1.클래스 초기화변수로 방문하였습니다.
    2.인스턴스 초기화변수로 방문하였습니다.(0명)
    3.인스턴스 초기화변수로 방문하였습니다.(1명)

     

    보시는 바와 같이 클래스 초기화블록은 한번 인스턴스 초기화 블록은 인스턴스 생성시마다 수행을 한다는 것을 알 수 있습니다. 

    그리고 클래스 초기화 블록은 인스턴스가 생성되기 전에 호출 되므로 인스턴스의 변수에 접근할 수 없습니다.

     

    이걸 어떻게 활용할 수 있을까를 생각해보면 enum의 경우 상수들은 static final로 생성되므로 접근이 가능하므로 

    클래스 초기화블록으로  활용할 수 있습니다. 

     

    보통 enum으로 요소를 찾을 경우 stream으로 filter을 걸거나 for문을 돌려 해당 요소를 찾아 사용합니다. 

    당연 Map과 같이 특정 키로 요소를 찾는 것이 속도적으로 이점이 있습니다. 

     

    활용편 예제

    //음료 enum
    public enum beverages{
            AMERICANO("아메리카노",3000),
            CAFELATTE("카페라떼",4000),
            EMPTY("없음",0);
    
            String name;
            int amt;
            beverages(String name,int amt) {
                this.name = name;
                this.amt=amt;
            }
    
    
    
        private static final Map<String, beverages> map = new HashMap<>();
        static{
            for(beverages b : beverages.values()){
                map.put(b.name, b);
            }
        }
    
        public static beverages getMyBeverage(String name) {
            return map.get(name);
        }
    }
    
    //방문 클래스 
    public class Visit {
        int people;
        {
            System.out.print("인스턴스 초기화변수로 방문하였습니다.");
        }
        public Visit() {
            System.out.print("(0명)");
        }
    
        public Visit(int people) {
            this.people = people;
            System.out.print("("+people+"명)");
    
        }
        public String getCoffePay(String name) {
            beverages myBeverage= beverages.getMyBeverage(name);
            System.out.println();
            return myBeverage.name +"를 "
                    +  people+"잔 구매하였고 구매비용은"
                    +  people * myBeverage.amt
                    +  "입니다.";
        }
    }
    
    //출력문 
     public static void main(String[] args) {
           Visit visit= new Visit(1);
            System.out.println(visit.getCoffePay("아메리카노"));
        }

    결과는 아래와 같습니다. 

    인스턴스 초기화변수로 방문하였습니다.(1명)
    아메리카노를 1잔 구매하였고 구매비용은3000입니다.

     

    enum을 생성 시 map을 static으로 생성하고 이를 초기화 블록을 통해 배열을 Map에 Key , Value 형태로 담았습니다. 

    그러면 매번 배열을 for문을 돌리는 것보다 속도적 이점이 분명 있습니다. 

     

     

    '개발 > java' 카테고리의 다른 글

    익명클래스  (1) 2022.01.01
    stream vs parallelStream  (0) 2021.12.30
    Builder 패턴 활용기  (0) 2021.12.25
    Stream.of vs Arrays.stream  (0) 2021.12.23
    제네릭이 멀까  (0) 2021.12.22

    댓글

Designed by Tistory.